winxp怎么看电脑配置

第二部分 基础:导论

第1章 系统

1.1 何谓PC

计算机俗称电脑。我们平常谈到的计算机就是指PC。

当然,计算机不光指PC,还可以指服务器,大型机,我们无意去为分别这里面的区别花费时间,这纯粹是一种历史叫法。在不加特别说明的情况下,本书作为编程教学书以下部分我谈到计算机就是指PC。我们是对PC编程。

PC的概念更多地是一个

历史概念而非范畴概念,历史上第一代(注意并非第一台)PC是指1981年8月ibm推出的第一代个人计算机,称为IBM

PC,它配备了intel的8088

CPU和Microsoft的MS-DOS,从这里开始,intel确立了它PC行业的CPU霸主地位,微软也慢慢成为了软件领域的巨无霸。Wintel组合出现。

当然,IBM是卖电脑的,Intel是做CPU的,而微软是搞软件的,这三者业务领域不一样。但电脑就是从这个时候开始进入大众生活的,在这之前是一些巨型机,科研设备机器,以及个人爱好者研制的雏形所谓“计算机”。正是这样的发展,带来了计算机向PC发展的态势(硬件上的,软件上的,总体架构上的)。

关于这其中的种种历史,存在有一些趣闻,比如:

【硬件上的】:

第一台PC其实是由一个叫毛利的人发明的而不是教科书中普遍谈到的那个巨大的家伙。

【软件上的】:

苹果图形界面拉开了计算机图形时代的到来。

50,60年代某段时间一种叫CP/M的操作系统差点取代MSDOS而使它所属的公司成为IBM的合作伙伴。

MSDOS实际上只是一层壳。它是改PCDOS来的。

【架构上的】:

CPU是有架构的,AMD和Intel主频之争从来都没停过。

1.2 图灵机与冯氏架构

计算机的产生源于对自动控制(自动机理论)和人工智能(机器人)的研究。

图灵开始研究人工智能的时候那时计算机尚未产生,他的图灵机是对计算机领域的贡献但其实更多的是对人工智能的探测。

图灵机是一种通用自动机器的模型,这种机器有极其简单的形式(因为要能易于实现),然而只要产生足够丰富的变形它可表达并产生一切逻辑(计算函数,表达其它离散算法逻辑等),图灵机在理论上是理想的,它有一个二端无限沿伸的纸带作为存储装置,输入,输出和状态转移函数是一个机器的三要素,这三要素组合并变形可成为一切机器的原型,可解决一切图灵机能解决的问题。因为它揭示了计算机在抽象层次运行的本质即形式计算。所以图灵因为他的这个贡献被称为计算机之父。各种形式的自动机理论随后在那个时代发展开来。

图灵机是被严格证明的。虽然它是一种抽象机难于直接说明,但正是因为这种抽象可用一套形式化的东西来表示并证明(图灵机的运作原理被称为形式计算,是离散数学自动机的一部分)..通过测试的机器就叫图灵完备,,所有通过图灵完备的机器,这说明它们可以产生等价的算法。。可以解决同样的问题。

图灵机的意义是伟大的,因为它是抽象的,所以它能被实现在很多不同层次的地方,比如大到语言识别器,虚拟机模型,小到自动售货机等等。。

如果说图灵机阐述的是一种泛义上的自动机,那么冯氏模型就是专门针对计算机的自动机理论了,以前的机器(在可编程电脑出现之前),指令是硬化的,要为某机器编程相当于重置整个机器。

冯氏机的精神在于"指令存储,顺序执行",在冯氏模型下,执行指令的机制和存储指令的机制是分开的,要换一套程序不需要更换指令系统,因为程序是被内存存储的,取指令器是从RAM中随机取出(某条活动指令总是会在某个内存位置待命,随机的意思就是直接指定内存地址并从里面取码进行执行),并不用预先在内存位置固化程序,然后通过控制和地址总线交互存取到内存,这样CPU只负责执行,对于不同的程序,它可以只用一套指令系统。这样的架构就形成了一种执行指令加调用数据(指令数据在内存中的位置,或编码了的数值和字符)的方式,然而同图灵机一样,这种简单的抽象形式同样可形成高级的具体逻辑。

这样一来,我们编程也成了书写指令和指定供指令操作用的地址,指令内含内存地址为操作码,而如何在内存中组织数据又发展出了数据结构,用底层的观点加数据结构的观点来解释现实事物的解法就形成了算法。(当然,计算机的观点是如何寻址和执行指令,实际上在没有高级编程语言理论之前,远远还没有算法的概念,因此不能说指令是语句,也不能说地址是个变量,地址里面的东西更不能称为数据类型,CPU能直接执行和认识的只是由0,1表达的指令和编码的地址以及各种基本数值和字符,只是后来以人的眼光来看可以无穷地把0,1编码成其它各种逻辑而已,不过在汇编语言aULhutSL级别,这些都不是机器能直接理解的)冯氏机以及它提出的“指令控制存储并串行顺序执行”的理念,这些都深克影响了我们这个时代的编程工作。

我们注意到冯氏机主要处理数据和代码,而指令是控制数据的,这使得我们后来的编程工作的抽象焦点在于数据和语句。这是冯氏模型对编程工作最大的影响。

我们注意到指令是被串行执行的,这说明冯氏模型一开始就被设计成为非并行计算机,因此在后来编程中,要实现并发逻辑需要从软件上和设计上去突破。

其它。。

winxp怎么看电脑配置

1.3计算机能干什么

我们要首先懂得计算机能干什么,它的功能发源主要在哪里?这样才能懂得编程的出发点和目的。这就不得不首先谈谈计算机系统的组成。

首先,CPU是PC中的总控制中心,在前一节中我们谈到CPU执行的过程就是一个不断取指令并译码的顺序过程(所以本质上它其实并不智能,PC只是一台高速自动机而已),其实CPU不但处理它自己的事情而且是作为整个PC的总控制中心存在的,CPU不但接管了内存管理,还接管了其它硬件,比如它把显存归入它的管理统一跟主内存编码,而且把硬件消息归为它的中断并把其中断处理程序统一跟内存编码。CPU在执行中(有一个时钟发生器指导CPU不断地运行)不断变换其状态,输入输出则是这些二进制(因此整个PC做的工作都是某种意义上的IO)。总而言之,冯氏架构中,CPU统冶了整个机器,内存二把手,其它硬件则是被它统治的。在CPU眼里,一切都是内存地址和指令(这就对编码工作提供了无比便利的条件,使得冯氏下的编码工作变得无比统一)。

CPU中最主要的二个部件是控制器和运算器,计算机之所以被称为计算机,是因为它提供了形式计算,还是CPU里面的逻辑和算术运算呢,当然是前者。实际上运算器和逻辑器的地位就像协处理器一样,是CPU不必要的组件,是CPU扩展它的功能加的电路板。这些硬件功能固然是计算机功能的重要组成部分并影响对其的编程工作,然而并非全部。

计算机逻辑主要发源于二个地方,这决定了他的功能和对于编程的意义所在。

首先,计算机各个部件都是有功能的,比如浮点器可以表达浮点数并处理,计算机籍此可以直接表达硬件级的浮点抽象以及用浮点表达更大的编码了的抽象(实际上也存在软件的浮点处理器),这就为编程引入了浮点逻辑。另外一个道理,你不能编程指使PC为你做“给我泡一杯牛奶”之类的事情,因为它不是硬件上能提供的功能和逻辑所在(即使是抽象也得不到),只有当PC真正接入了一台牛奶机之后,你才能编程实现诸如泡牛奶的硬件功能。

计算机的功能不但在于表达硬件逻辑,而且更大的地方在于表达广泛意义上的应用逻辑。我们可以对PC编程创造一个游戏,虽然图形功能是来源于显卡的,但是游戏世界的逻辑明显不是硬件的。Web应用就是这个道理。

在机器级别编程,我们无法表达高级的应用逻辑,因为0,1能直接编码的逻辑是非常有限的,只有当PC发展到提供了操作系统,进程等高级逻辑之后,我们才能在一个新的工作起点上构造更强大的应用逻辑。

所幸的是,当编程发展到高级语言阶段之后,这些机器的细节都被完全抽象化了。

1.4 内存地址

既然冯氏架构就是将执行指令的CPU和存放程序的内存分开的一种架构机制,CPU中集成了对内存的管理,在CPU的眼里一切都是内存地址,而且这导致了冯氏模型下编程的统一性。那么CPU是如何与内存发生关系的呢?

学习这个有助于我们理解操作系统诸如这样的软件的系统逻辑是如何在硬件基础上包装出来的。

CPU与内存如何发生联系被称为CPU的存储管理机制,CPU管理内存的硬件是它的地址总线和数据总线(我们知道CPU虽然自己处理数据,但他同时还主要做着一种IO的动作,CPU管理IO的硬件被集成在主板上一块被称为芯片组的地方),其中地址总线是负责寻址机制的通道,而数据总线表示CPU能一次性处理的数据通道,地址线数与数据线性往往长度不一,这就导致了CPU的寻址跟处理产生了一对矛盾,地址线决定了它能看到(CPU能使用到的)和管理到的内存总量(物理地址),而数据线决定了它能一次性处理的数据长度和能表示的地址形式(逻辑地址),,,这就是表示(逻辑地址形式)和实际内存(物理地址)上的矛盾。

撇开其它因素,我们就事论事来讨论这个矛盾,20位地址线可以使用2^20个最小内存单元即1MB的内存空间(这就是说使得这种CPU的一个任务理论上可使用至多1MB的线性空间,因为它只能寻址到这么大的地儿)但16位CPU中的寄存器只能表示前16位(CPU是用寄存器来表示地址的,这就是说虽然CPU能看到整整1MB的空间,但他一口吃不下其中的最小一个单元,因为它首先都不能直接表达这个单元)。因此CPU要表达和要用尽这1MB的空间,不能以直接线性对应的方式来表达。除非数据线多于或等于地址线。

间接的方法就是设置另一层抽象。可令16位先表达一个大小为64KB的段,1MB的内存刚好等于1MB / 64KB倍数个这样大小的段。在这种情况下,内存就不再是绝对线性的了(当然,实际上所有内存都是线性的,这里说的是分段之后的逻辑情况下,而且你不用担心CPU认不认识这样的划段法因为它的确认识,下面会谈到一个实模式的东西),而是被划分成了一个一个的段(在段内才是线性的),16位用来表示段内的每个最小内存单元,空出的4位不再用来表达内存本身,可以用来表达段本身。

以上讨论的情况是8086CPU在实模式运行的存储管理逻辑,即从逻辑地址(CPU要形成任务用到的地址形式)到真实物理地址的编码(实际机器有的地址),这中间要经过一个变换,CPU负责这个转换。无论在多少长度的地址线和多少长度的数据线产生矛盾的情况下,都会由CPU负责这个转换,不过32位数据线的CPU转换方式要特别复杂而已(特殊的分段方式再加一个分页的方式,段寄存器不像实模式那样用来实际存储物理地址的线性表示,它只用来实现硬件级计算最终物理地址的一个中间存储)。

在32位CPU出现之后,寄存器能表示的逻辑地址早就是4G了,而地址总线超过了32位(除非地址总线少于逻辑能表示的数量才需要实模式那样的分段,然而32位CPU下并没有产生这样的矛盾因此可以以线性地址的直接表示方式来表示逻辑任务线性空间,然而32位CPU照样也实现了一种转换机制,这是因为它需要实现更强大的保护模式而不仅仅是完成寻址。

综上所述,逻辑表示是寄存器能表示的地址形式,,真实地址是系统装配的内存量,而线性表示是CPU用来形成任务的任务地址。统称为任务空间。不跟硬件地址相关,也不跟逻辑表示形式相关,这完全是一种独立机制的编码,32位CPU下,一个任务的线性空间表示总是4G(注意总是这个词),只是一个转换机制会负责这逻辑地址到线性地址的转换,,然后又有一个转换机制负责线性地址到真实物理地址的转换,程序员完全不必为线性地址过少和这中间的转换而烦恼那是CPU必须管的事,,否则32位的汇编工作几乎要手动驱动CPU。

明白了以上这三个概念,让我们再来看下面的章节。

1.5 分段和分页以及保护模式

32位的CPU利用它的转换机制可以保证4G空间一直存在内存中(这就是说,实际上并没有一个实际的4G空间在内存中,只是CPU可以看到一个4G大的线性段,能以它为基础形成任务直接供程序使用这才是CPU关注的)..这样的话,对于编程来说,只要是在保护模式下,我们都可以拥有一个4G的编程可用空间,不必调进调出的(它本来就一直在内存中为CPU所看见)。。

上述32位CPU的转换机制是分段跟分页的综合作用。分段机制不管这个4G空间的实际调进调出,因为它不负责实际分配内存,它只负责逻辑地址到线性地址的转换过程..实际分配内存的工作由分页机制来完成,它负责线性地址最终到实际的物理地址的转换,它把这分段后形成的4G虚拟的空间用来调度真实的内存页,内存页就是真实的物理地址的载体,分页机制只需保证生成的页面大小总和局限在这4G空间中即可。。页面是随用随载,调进调出的,以较小的单位而不是段来实际使用内存,,这就加大了内存的使用率(虽然分页并非百分百做得到如此)。

要深切理解CPU是如何完成分段分页形成任务可用空间的过程是一个精微的学说,段选择符,门,LDT,GDT,pae (CPU中有一个pae位可以保证所有CPU都只在概念上只看到这一大小)这些概念之间是如何相互间发生关系并维护这样一个4G空间。以及这个机制产生的结果和意义所在,需要翻阅相关的书籍。下面试阐述一二:

CPU首先检查这个选择符的ti字段,以决定是选择到ldt还是gdt中选择描述符,然后检查相应的索引以在ldt或gdt(这些都是内存中的数据结构表,表驱动方式)找到最终的描述符。。这些符结构都在4g内存的高端部分,注意是在内存中..找到描述符之后,再以判断选择一样的方式在描述符中判断各个字段,主要是生成段基和段长,段的三个权cpl,dpl,rpl..

比如在如下的一个指令中 mov ds,ax,

ax存储的并不是指向ds的指针,,也就是说它并不实际存储ds的地址。而是一个选择符(注意,第一它不是段描述符,第二它段选择符是一个32位的数据结构,它的各个字段表明了不同的意义,组成整个段选择符的意义),,,段寄存器大小有限,CPU中的寄存器只用来存储指针值,或者描述用的数据结构,比如在这里是一个段选择符。。

CPU就是靠以上方式来实现对于段机制的保护的,每一条指令都有内存读写逻辑,每一个内存读写逻辑都有这样的寻址,最终要涉及到进入段中。涉及到保护模式的一系列机制。。

门是CPU中的一种迂回机制,有调用门,任务门,中断门,异常门,这四种门的用途不一样,但都是为了实现CPU对内存访问进行保护的一种迂回机制(比如数据访问权限啊,任务安全切换啊,中断正常返回啊),调用门实现了数据访问的权限机制,跟四种普通段,段描述符有关,任务门跟tss,tss段选择符有关,中断门与异常门跟中断或异常处理例程有关。。

首先来谈调用门。对于一种跨段的段间调用call或跳转jump,统称调用和跳转和转移,有直接转移和间接转移,,但是直接访问方式不能实现段间调用的同时转变程序的特权级,调用门的设置就是为了实现一个间接调用加同时改变程序特权的跳转方式。。

任务切换有直接切换和间接切换,任务门跟一个tss段有关,跟调用门谈到的对于普通段迂回机制一样,任务门也是实现间接任务切换的手段。

而对于中断门与故障门来说,门描述符内存储的是中断与异常处理例程的地址。。

总而言之,CPU提供了对保护模式的硬件支持。而所谓保护,是对段,内存,这些保护模式的概念提供迂回机制,,于是发展出分段,分页,调用门,任务门,中断门,异常门这些的CPU机制,更多请自行研究。。

1.7 操作系统

当CPU能够被用来形成任务控响应中断时,操作系统这样的软件级的逻辑就可以在上面慢慢构建起来了。实际上机器往往并不需要一个操作系统也可以运作,比如电传打字机和电子打孔机,在裸机层次也可以实现其功能。

但配备了强大CPU的PC绝不是一般的电器,冯氏模式一开始就指出,它是能够换程序和可编程的,对PC的使用往往源于它抽象出来的强大的软件功能,而不是仅仅是用CPU来加热鸡蛋(如果实际上CPU真的能煮熟一个鸡蛋而且业界流行这样使用CPU的话)。

操作系统就是这样的软件的第一层,它沟通了裸机与使用机器的用户,对于裸机来说,操作系统可以由它直接抽象出线程,进程,网络,图形等系统功能,运行于操作系统下面的各种应用软件可以使用它们进一步抽象出各种更为高级的应用逻辑(比如Web,多媒体),对于最终用户来说,操作系统提供了界面使得各种高级应用成为可能,而且对于程序员用户来说,使编程工作脱离直接面向机器编程,,因为操作系统可为各种应用软件提供一个执行路径,程序员可以面对操作系统编程,这是一个巨大的成就。即操作系统不但是计算机功能新的提供者,而且是开发环境。

这样计算机系统实际上是硬件系统支持下的软件系统了。人类要直接面对的就是软件系统(这就是抽象的能力,它一方面隔断了人类并不擅长的硬件细节,另一方面提供给人们一个更为强大的软件环境)。不论对于最终用户或开发用户来说都是如此(当然对于硬件工程师来说不是这样)。

一句话,操作系统的出现是源于人的需求。

操作系统提供那些对于应用和开发来说最最基础的功能和逻辑,因为它直接关联机器和CPU机制而直接面向初级软件需求(比如形成过程以运行程序使操作系统具有执行程序的功能),在操作系统内核中,内存管理,进程,文件,网络,用户界面,是最先应被抽象出来和最先被解决的问题。我们知道软件即抽象,所有的计算机系统能呈现和解决的逻辑,第一步是解决系统支持的问题(这导致了对系统编程的意思所在。),第二步才是应用逻辑的表达和解法(应用编程和领域编程)。

当然,操作系统是一个大的概念,它小到只需要包含一个内核,大到可以包括内核层,开发支持层,调用层,硬件抽象层,应用接口层这样的操作系统架构(参见Google手机平台,这本质是因为软件是抽象,所谓抽象就是在不同的抽象层次完成不同的工作,操作系统作为软件也不例外)。因此讨论操作系统我们只需讨论操作系统内核便可一窥其端倪,我们只讨论巨内核的Linux Core(相比之下有的系统内核是微内核,这种内核基本上只提供对进程,内存管理,图形,用户界面,这样抽象层次的封装和架构逻辑而不实际实现它们)。

Linux内核实际上主要是一个定制硬件功能为软件的逻辑,怎么说呢,它一方面沟通了硬件驱动和软件,使硬件可以运作起来,为软件逻辑服务,,,这是第一,第二,它对于硬件功能的定制功能,比如进程,,,就是把CPU硬件资源转化为软件可以使用的进程资源,把网卡资源转化为socket跟进程一样是种OS资源, ,因此,内核实际上只是初初级的硬件功能抽象, 界面就是表现抽象,它的窗口机制,都是独立内核的(KERNEL硬件抽象层),,如果称内核为操作系统(实际上只是OS的核心一部分)的话,那么,X协议的实作品,桌面环境,窗口管理器,该桌面上的APP,,,都是作为应用程序来运行在内核之上的,而不是像WINDOWS一样直接在内核就集成了GUI,苹果OS在内核集成了X,因此图形效果很好(LINXU桌面没有WINDOWS快), 这就是移殖问题产生的地方之一。,因为UNBUT逻辑并不是其它逻辑的泛化源而是与其它APP一样地位的基于内核的普通APP。

1.6 并发与协程

在操作系统和应用程序的逻辑中都会涉及到并发逻辑(特别是数据库系统中),并发逻辑可以多线程也可多进程,甚至多线程多进程的方式进行,当然,单核环境下的并发永远是一种对并发的模拟机制。

解决多线程的问题是多解的,,源于解决方法的高层模式各有不同,,(也即,从开发的眼光来看,它首先是一个设计问题),,有不同的相关概念,,比如锁,,,就不需要用到信号量。

当然,有时你用的语言提供了并发的支持,,而且有时候,操作系统的并发逻辑会影响到你选用一种更有效的相容于操作系统的并发模型 并发问题源于图灵模型与需要开发处理的现实问题之间的矛盾,图灵模式是控制主导数据(机器的底层问题都是IO问题)

1.6 CPU与异常

一般谈到源程序的跨平台特性时,总是说在p4加winxp下编译通过(同时提到了CPU和OS),,CPU与OS的关系该如何理解呢,如果说CPU控制了计算机硬件上的一切,OS就相当于CPU的外层调用策略(shell就相当os的外层调用接口)。它把CPU逻辑和CPU控制下的外设逻辑,存储逻辑封装为软件可用的东西。os的许多东西,是CPU硬件加速下的结果。

比如说Windows和linux的内存分页机制和保护模式,,如果CPU没有提供三种模式(实模式,x86虚拟模式,保护模式)中的保护模式,那么在OS级虽然可能可以实现一个所谓的保护模式(但却没有直接硬件的支持)

在保护模式下,CPU中的段寄存器不用来实际存储物理地址的线性表示(而在实模式下是这样),它用来实现硬件级计算最终物理地址的一个中间存储。。

中断是硬件级的消息,中断和异常是CPU直接相关的东西(CPU有二跟中断引脚),,,很多编译器提供了异常处理机制,Windows更是实现了一个SEH,,但是,这些都是抽象了CPU的这方面的逻辑。。

中断中的硬件中断是真正意义上的中断,把它称为中断是为了跟异常区别开来,二者都指CPU对影响它原来指令流程的意外干预过程。(CPU对这二者都提供了处理例程)。但是中断是硬件级的,是来自外部的,异常是来自CPU内部的指令执行过程中的一个出错,,是来自指令执行过程中的(所以,所谓的软中断指令其实也是异常)。

而发生中断或异常时,二者都是靠CPU的跳转指令来完成跳转到相应的处理例程的,,这是CPU直接执行指令的结果(Ruby甚至鼓励用中断和异常来代替正常跳转,这是直接用CPU的指令的结果,编译器控制不好会造成很多隐患),机器级的跳转指令是程序语言实现它的控制流的一个重要方面

在保护模式下,跳转应在各任务间正常切换,否则会引起著名的操作系统保护错误,处理例程调用完之后通过一定手段返回正常任务),那么CPU就发展出一些诸如调用门,任务门之类的东西。。用来规范这些跳转。。

再比如递归,由于它每次调用实际上都产生一个新的函数,对于栈式CPU的计算机来说,由于它主要利用内存而不是寄存器来存储这些新函数的临时变量和压参操作,,因此这个递归过程不应有过多的调用深度,否则压参入栈方面的开销会过大(这是指空间方面的优势,栈这个段区可用来存储很多参数但是速度不快,而reg式计算机速度快但是没有过多的reg供递归存参用。因此空间方面是个劣势。)。

1.7 所谓堆栈

运行时是机器挂钩的概念,

非语言挂钩的概念,(但是实作品可以用语言来描述)一门完善的语言的提出,,包括提出一个针对该机器环境关于此语言版本的的代码运行时环境.(因为语言实现需要被运行,那么就需要发展出一个c runtime dll的东西了)称为native runtime,因为是对机器本身,而非类jvm软件机器,的本地机器运行时逻辑的C语言封装。(我们将一种机器是属于reg方式来执行逻辑还是用内存stack方式来执行针对它的平台逻辑,,以及相关的一系列知识称为运行时)

我们知道,REG和内存都是语句运行时(不妨改成运行空更好)的存储空间集散地,但是不同的机器,有的不具备REG,有的侧重利用这二者的机会又不尽相同, 如果机器是堆栈机(采用内存stack方式的运行逻辑),那么它就是用内存来作为主要运行场所的机器,JVM速度很慢,但是很耗内存,从这点就可以看出来了(因为它的机器中没有软件摸拟的reg,,为了跨平台,jvm根本不打算将x86的reg机制引入,而我们的x86平台是硬件的reg,所以称为本地平台,硬件的reg总比软件的快,软件的3d render machine总没有直接硬件访问的快你可以联系这点来理解)

机器如果是寄存器机,那么主要用寄存器来执行语句逻辑,指令逻辑,完成数据的传送(语句即指令加数据,为什么任何一个逻辑正确的可执行文件为什么CPU能执行它并产生结果呢,这是因为一切pe逻辑都可反汇编译成指令加数据的语句,它能被执行,因为它同时包含了代码加数据,CPU不能执行纯data或纯text),,因为寄存器是CPU的而堆栈是内存的,所以reg机明显比stack机快,但是寄存器器数量和容量有限(比如递归不好做),所以针对这类机器设计的单个指令代码长度一般不长,,在一些方面是比不上stack机的当然,intel平台中,,CPU和内存是共同发挥作用来实现寻址的,而且也共同(主要指CPU中的REG,一方面,SP这类REG发挥指针的作用指向内存,一方面,一些REG本身可用来直接存数据)作用构成运行时(时空=CPU时间加内存场所),,那么intel平台是stack机还是reg机呢,当然是综合机

首先,对于x86平台,是如何执行函数逻辑(比如反汇编的一段C语言的函数的附近得到的一段汇编语句)的呢,,通过探索这个过程分析那些汇编逻辑(其实就是编译器产生的平台逻辑,机器码嘛),我们可以发现这个平台的运行时底层信息

首先,PE载体逻辑内有一段堆栈段,被映射到内存(载入器和重定位器会完成这个工作)后形成一个堆栈区,寄存器此时高速活动,它的一个活动记录中,必定保存有栈基栈顶的一个指针(此时它们重合)

堆栈的基础概念要掌握,它是一段从高地向低地生长的空间,而且是活动空间,因为栈顶(指示当前出栈入栈位置的指示,它存在sp reg内,永远只拥有一个是‘’当前“的值,减它就是在低地址更低所以是为堆栈腾生长空间,加它是让低地址往高地不低一点,堆栈空间会变小)会因为频繁的出入栈动作而变动。这种变动性使得我们掌握堆栈的方式(求某一个成员在此活动堆栈空间的位置)只能用简单的'bp"+-该成员对应bp的偏移,的方式来指定了,而栈顶的偏移永远是sp-bp

在进行一段函数调用时,必定是存在调用方和被调用方,一定存在参数间的互传,怎么传参,调用结束后指令权如何在调用方与被调用方之间协调,平台是如何执行这些运行时逻辑的呢?

对!x86用到了堆栈,对于C语言函数,参数右向左入栈(显示成汇编逻辑时是push),第一个参数反而在堆栈(此时是堆栈对应这个函数附近活动区域的一个帧,因此称为堆栈帧,即堆栈区的某个真正的活动堆栈)的最上面(偏向低地址方向生长)这样,相对其它参数来说,它就显得先进后出aULhutSL嘛,后进所以先出嘛,当然,它到底出不出,此时出不出,这跟当前sp没有一定联系,,因为sp当前位置不只是由压参影响的(甚至没有必然系,因为sp这东西可以人为用汇编码指定),还受其它自动变量的影响呢

C语言的这种规则跟pascal的规则完全不同,,这导致的C语言函数可以有变参数数量的好处

1.8 真正的保护模式

8086/8088有20根地址线,寄存器为16位 寄存器的位数,16位表示决定了计算机的字长,即一次性能处理的数据总长度(16个位,始终记住,位是计算用来表示存储单元和数据长度的最小单位,无论是外存或内存都一样),因此在程序中只能定义至多16位长的变量,因为只能定义16长的数值(变量),故(寄存器大小)它也决定了计算机能表示的数值的大小,即2的16决方(1048576),这种数值至多能用来表示的存储单位是1048576个,,或者说1048576个位,而这正是一个16位的数值变量所能达到的最大值,因此这种寄存器为十六位的CPU只能表示至多1024kb个内存位,虽然可能计算机本身不止这么多内存,虽然有时地址线不止寻址这么点的空间,但16位的寄存器只能看见并寻址这么多的内存(因为地址线是CPU引脚线,是CPU的概念),寄存器的位数理论上决定了CPU能"表示"的最大的内存范围或外存范围(当然,连CPU表示都无法表示的内存范围那就没有意义了),而地址线决定了计算机实际能存取访问寻址到的内存范围,即1M,不包括CPU连看都无法看见的那部分,(当然如果你的计算机都没有这么多的内存也是枉说)一个是16位,一个是20位,CPU是怎么样产生数值用来表示地址线所能寻址到的1M地址的各个单元的地址的呢???,(这里以字节来说)1M可以分为64k个64b,这样,寄存器用来存放地址,80286有24地址线,寄存器为32位

因为寄存器是存在于CPU中的,因此说是CPU的寻址,又为什么说CPU对内存的寻址呢,为什么我们在这里口口声声地说CPU对内存的寻址呢,这有什么意义呢?这当然是为了计算机能正确执行指令而准备的,这是计算机工作的本质啊(而为了执行指令,CPU能对内存进行寻址是首先必须要办到的,因为程序最终从外存到内存中才能被CPU执行,CPU和内存都是靠电工作的,CPU提供执行指令的本领,而内存提供存储指令的本领,这是冯仪曼说的,成功完全指令必须是CPU和内存一起工作完全的,而外存是靠磁来工作的,CPU只能执行内存RAM内的指令,外存用来永久存放文件,称为持久化),程序要从外存被加载到内存中才能形成指令 (指令在程序的CODE段中,EXE文件被加载到其进程空间时------这个过程术语叫映射到其进程空间,它的代码段就在物理内存中了,因为只有代码段才包含指令,这部分要首先映射到物理内存中来,程序的指令用到的数据------这通常表现为程序中的变量常量存在data中,数据段部分被开辟成堆或栈的方式被映射到EXE的进程空间中来(分段机制),形成EXE的编译器不同开辟模式不同,像Delphi的编译器实现的exe进程空间只有堆没有栈这种内存模式,堆和栈是系统级运用内存管理器进行分配内存的动作后(是系统级的作用)形成的特殊内存块,这些内存块被映射到EXE的进程空间,这有点像EXE的DLL模块的映射模式,dll文件被映射到其宿主EXE的进程空间时,不像EXE一样一开始就把代码段实际加载到物理内存中去了而是在EXE实际调用到它时才到实际的物理内存中去(分页机制,只要你的计算机定义了虚拟内存,那么在执行大程序时,,这个分页机制就会频繁用到),跟EXE的DATA段一样属于一开始就映射到EXE进程空间而不实际形成内存的部分,EXE,DLL被加载到内存后,它所占据的内存块就叫模块是静态的,而进程是一个执行体的实例是活动的,线程是一个进程的某个执行单元,所以我们说程序被映射到到其进程空间而不直接说映射到物理内存中,只是需要执行的代码段(注意此段非实模式彼段,后面会谈到)才被进入到物理内存,但不需执行的那部分不需立即加载到内存(就像DATA和DLL)不得不说的是,进程空间并非物理内存,前面一再强调"程序被映射到到其进程空间而不直接说映射到物理内存中",而且更准确地来说,它们二者是完全没有关系的,4GB虚拟地址空间整个儿压根儿就是虚拟的(这个道理就像你玩一个客户端为2G的游戏时,你启动客户端的时候已经把整个客户端的2G资源都加载到4GB空间去了,但是只要这2GB中需要当前调用的那部分资源才进入内存,分段机制开避四GB任务空间,分页机制把需要用到的数据动态加载到进程空间,任务空间就是进程空间,然后通过这些资源在程序中的自动变量表示离开内存),它只是能表示4GB空间的虚拟地址而已,并不是实际的物理内存,仅仅根据32位寄存器能表示那么多的内存来设置的那样一个机制,这种机制成全了将进程空间隔离的好处(所以四GB的说法是进程的一个概念通常说4GB是进程的空间),而不像整个六四KB都可以,Windows的虚拟内存管理器(保护模式下)会负责适当的时候把需要的,映射到进程空间的内存搬到物理内存中去(分页机制),现在来解释"注意此段非实模式彼段,后面会谈到"这句话,在FLAT下,已经没有段segment了,,在Flat模式下就无所谡code段跟data段的了,因为原本实模式CS,DS意义下所指向的段全都在一个4GB大的虚拟地址空间中,实模式下段的意义不存了,是段选择子,FLAT内存模式下,CS,DS根本就不实际用来指向段,即不实际用来指向一段内存(而是存储一个称为段选择符的数据结构),FLAT下说的代码段是指EXE头定义的段,是RAW FILE(RAW指没有分配实际内容的内存)里定义的段而非实模式下CPU段寄存器指向之"段",模拟原本的段取而代之正是EXE头的节的意义,程序员无须知道这些段的实际的物理内存地址而只须知道虚拟地址,(我们知道在32位寄存器,在RAW FILE里才有节section,有了PE文件的头中的这样段定义,当EXE被加载到内存中来,就相当一个跟内存数据段一样的数据结构,虽然平址模式下无所谓代码段数据段,但PE文件的格式间接实现了它,就像XML文件它本身就像一个数据结构一样所以它被很多程序语言的IDE用来持久化,被很多程序用来保存信息如3D网格信息也会用xml文件格式)

1.9 异常与流转

Linux内核实际上只是一个定制硬件功能为软件的逻辑,怎么说呢,它一方面沟通了硬件驱动和软件,使硬件可以运作起来,为软件逻辑服务,,,这是第一,第二,它对于硬件功能的定制功能,比如进程,,,就是把CPU硬件资源转化为软件可以使用的进程资源,socket跟线程一样是种OS资源,这之后才出现OS,,因此,内核实际上只是初初级的抽象,而SDL,就是更高一级的抽象..

它的窗口机制,都是独立内核的(KERNEL硬件抽象层),,如果称内核为操作系统(实际上只是OS的核心一部分)的话,那么,X协议的实作品,桌面环境,窗口管理器,该桌面上的APP,,,都是作为应用程序来运行在内核之上的,而不是像WINDOWS一样直接在内核就集成了GUI,苹果OS在内核集成了X,因此图形效果很好(LINXU桌面没有WINDOWS快),,,,我们平常所谓的UBUNTU也只是APP集(在内核上面一点点的逻辑),,,在服务器版中能精简得到,这就是为什么移殖了UBUNTU却不等于移殖了它上面能进行的一切APP一样,因为UNBUT逻辑并不是其它逻辑的泛化源而是与其它APP一样地位的基于内核的普通APP 运行时是不是移殖的产物?比如apache运行时,是一个抽取最核心的运行库,比如C库的运行时,等

异常是什么呢?异常不是错误,,是比错误轻一级的概念,当异常(即使被捕获到了)不能(在程序中预定义的处理块)被正确处理,就可以抛出一个错误(当然,错误和异常在程序中可表现为很多种,编译型语言如C++就有静态编译期语法和动态运行期逻辑错误之分)而调试,包括对这二部分进行调试,静态期的调试要容易得多,而运行动态期的类型在写代码时(编译前和编译中)显得易读,但是调试时十分困难(因为要从运行中调试)..这就是动,静的区别所在 (这个过程通常是,我们按照正确的程序流程来处理错误,发生错误,在程序预测到它,并不尝试恢复,,比如跳栈,如果能处理则处理之,不能则崩溃) 在传统编程中(一种语言未引进异常机制前),我们总是用IF,,THEN这样的判断跳转语句来提供处理异常发生时的处理逻辑,,,当一门语言内置异常机制时,此时,我们就可以用新的处理逻辑,此时,通常程序语言会作跳栈和保护现场的动作.因为大凡大型软件,需要一种很强大的异常机制,它必须全天侯运行,不能出错就恢复不了,这种动用了程序语言原理(一切程序即函数调用,如果你反汇编过就知道了)来处理异常的方法就是真正的异常..(异常与跳转关系如此亲密,RUBY甚至鼓励用异常实现流转)

1.10 最小,最完美的系统

在操作系统方面,LINUX KERNEL是最小逻辑,GNU LIBC在这个时候就被集成了,很好,内核的架构是重要的,LINUX先是硬件逻辑,再是语言作为中间层,用户程序SHELL等,作为用户空间,这种架构很模块很科学

我觉得用语言本身来作为架构的一部分,这样来实现移殖,可以解决一切移殖问题,只有该语言的VM被移殖了,那么该语言之下的逻辑就全部被移殖了

对一个平台的开发是促使这个平台能得于流行的基础,,,我觉得编程语言要尽量靠近自然语言,无论这种编程语言出于什么理念(函数式,OO式),还是与什么离散基础相关(机器结构堆栈式,,这是不是崭断了人们对底层进行扩展和编程呢),跳转啊,数据结构啊 ,这些东西应该跟开发者没有一点关系,用户应把他们全部精力放到要解决的问题上而不是系统和语言(比如这门语言的语法都不要掌握)这二个东西上,,这个道理就像EXE跟RPM的关系一样,只有无聊玩得太深的开发者才对RPM感兴趣 (画一张架构图,类andro架构,架构是重要的,当架构不正确,一旦当它发展畴形了,那么要改动底层是很困难的,就像LINUX桌面被设计成一个外挂于内核的APP一样,这样的架构并不适合开发游戏,内核与桌面的分离一方面让内核可以脱离GUI移殖另一方面却导致了一些不好的后果)加入微内核的多进程多线程支持,不需把线程作为开发语言的用户级线程,系统提供相关进程的API 也可提供用户态的多线程支持从裸机开始,到驱动程序到OS,最最应该注意可执行文件的载体逻辑(EXE载入逻辑和逻辑承载逻辑),应把它发展为类Windows下EXE的东西.不要像LINUX下的RPM那样的东西,让用户下载应用程序的体验足够好,对于桌面系统,我还觉得WINDOWS的菜单,,窗口机制什么的都有欠缺,,如何改造呢?我觉得,应尽量避免展开菜单(即使最常用的打开命令都要展开一级才能执行到这很差劲),我们应把最优先能用到能直接点击到的地方,比如WAR3的操作盘,,当你选定一个对象时,显示关于这个对象的所有详细信息,当你圈选一堆对象时,在显示栏内实时显示你选取到的对象和概况,这很不错

这样的操作系统最好是EMBEDED的,可同时移殖到ARM(手机多使用)和PC X86上,,体积上要小驱动程序过后,多媒体开发方面,一切用SDL,SDL是用C写的,不如用它,不如用SDL实现一个GTK的东西,因为SDL是直接访问媒体硬件的(DX作为底层也用了OO的COM,这样不好吧)

在桌面环境中,可以改造一下X,使得它不仅仅能在服务/客户环境中画简单图形,而且能画3D游戏效果,,这样网游就直接跟桌面集成了,哈哈 桌面和SHELL,SHELL就用RUBY SHELL,(尽量让最白痴的用户愿意用命令行)

在编程语言方面,C是最小逻辑(GNU LIBC是不是太单一了,它应该能提过一些模块扩展出OO功能,动态装载,在OS KERNEL内不需要集成,在后来向RUBYSHELL时就需要集成这个OO模块),我想知道有没有一种类RUBY的C语言,它应该接近底层,为本地机器作优化而不需要一个虚拟机,没有太慢的GC机制,而且采用OO,有RUBY库的那些功能和编程理念(RUBYC?呵呵,就相当于把C++改造成RUBY语法了,彻底去掉编译期设计模式导致的复杂性)

这样的RUBYC是不是就是JVM的JIT模式呢,同时拥有对本地机器和JVM进行编译的功能

C开发理念跟RUBY开发简直就是二个节然不同的理念(虽然RUBY也并没有把这种理念做到极限):一个用机器来考虑问题一个用人脑靠近应用本身考虑,像一般的智能手机平台上都是用C作为底层开发,而用JAVA作为架构的上层,作为高级开发,比如GOOGLE的手机平台,但是就是不常有C++,开发

传统上C开发一个应用(比如一个大型应用),那么就要考www.58yuanyou.com虑用什么库,用什么算法,用什么语言已提供的,,RUBY在这方面虽然也要最终考虑这些问题(这些问题已经被SOA式的逻辑实现了),但是一着手时并不是考虑这些,而是考虑应用问题是什么思想模型,a比如是一个MVC,那么就用ROR,,这样理念更自然,,因为它的机器支持被提前实现了

编译器和链接器是平台相关和有关的,,,为某一个平台特定服务(因此也可针对某平台进行优化,速度大为提升),,而JVM直接提供了执行宿主,JVM中的解释器就是这个作用.

提供一个极好的关于这个语言的解释器和IDE,运行环境为OS而不是虚拟机,因此不需要JVM的HOTSPOT技术(但是要保证这门语言在不同的软硬件平台上的移殖能力).

在网络方面,P2P是最小逻辑(P2P实际上是最科学最好的,一切网络程序都应是P2P服务模型,当然也兼容CS,即P2P在CS之前),JXTA也是用C写的,WEB根本不需要用一个IE导出去,网络应该直接跟桌机集成,不需要定义一个WEB逻辑,这是很差劲的,这样桌面开发和WEB开发都在一起了,RUBYC成为桌面语言和WEB语言.同时成为系统编程语言和应用编程语言.

要开发一个类GOOGLE EARTH那样的网游3D桌面环境(虚拟世界),定义一个逻辑上的虚拟世界,

XML成为一切数据的格式,不需要OODB,文件系统跟压缩包,跟磁盘完美结合,数据库可持久(XML逻辑应发展出一门DSL语言吗?不需要,可以将其逻辑内置到OS KERNEL?或者KENRL之外作为用户态的东西?)

在人类的手控方面,我觉得手机式的10个数字键才是最小逻辑,应该成为一切输入机器的最终原型.

Flash的SSD固态硬盘卡很好,可别在钱包内,,主板上集成的卡不行,坏了就拿不下来了(这是属于WEB2.0的个人数据所在,每个人都有身份信息在内) 再发展一个世界逻辑,模拟我们这个地球的世界逻辑,定义

1.11 操作系统与语言的关系

语言有它跟OS直接相关的地方,虽然形式语言的理论不跟任何OS相关,但是具体一个语言实现(编译系统或IDE)都服务于一个OS。

最初的第一个编译器是以很复杂的方法被写出来的,后来的编译器是有形式语言这样的理论指导下发展出来的,因此,解决开发编译器的角度不同,那么所付出的努力也会不同,就像GUI

问题,如果你能换一种眼光去看,,那么或许我们现在所看到GUI就根本不是现在的GUI,,现在GUI的消息机制,也许以另一种思路就能很轻松解决(比如我们将界面逻辑看成XML逻www.58yuanyou.com辑,在XML中提供消息机制达到的效果,或者根本不需要一个所谓的消息机制,不同思议的不是问题本身,而正是人类的大脑,任何问题都可以只是想象,然后才有解法),不给平台任何更多的运行负担,,因为没有平台相关的逻辑存在,这样OS的内核就不会越做越大。

如果能有一种方法,使一种语言机制直接跟OS相应,而且一一对应,,没有其它任何第二种语言建成在这个OS上,换言之,跨平台问题将不存在,,因为只有一种语言产生的逻辑需要考虑移殖,

编译器的目的是为了产生码,系统语言基于平台逻辑是为了开发平台逻辑,脚本是为了描述应用,那么解决GUI问题有什么新的方法呢,

1.12 虚拟机与语言

虚拟机是对CPU的模拟(还有模拟中断机制和IO),,,一般提到硬件的“机”就是指冯氏的构架,这个构架中,CPU是首先要谈的东西。。Intel的构架有专门一本书来讲解。汇编语言就是CPU的汇编语言,不同的机器有不同的指令集。。因此有不同的汇编语言,这就是移殖问题最初产生的地方。。

如果你玩过软件的虚拟机就知道了,,市面上存在很多虚拟机..

在设计一种CPU时,总是先实现一个软件的虚拟机来模拟它,这种软虚拟机被运行在一个平台上,运行在这个平台上但对虚拟机编程的编译器叫交叉编译器。在虚拟机设计完全并实现之后,这个编译环境也要移殖到虚拟机上(此时它被实现到目标硬件平台上),,只需要用这门语言产生关于这门语言在新硬件环境下的编译器就可以了。

然后,操作系统就可以在这个基础上开始设计并实现了。。但用虚拟机方式来验证此机器,和提供一个编译器,这是首先要做的事情。。

posix是类unix系统的接口标准,,为了移殖方便而提出的,因为OS实际上是一种系统调用例程的抽象,这个系统调用例程规定了“计算机硬件反映到软件能做的事”,是最初软件逻辑产生的地方,被经过OS封装之后形成了进一步的进程逻辑,sokcet逻辑等。。对系统编程就是考虑到硬件逻辑和OS逻辑的一个综合过程。

C语言作为系统编程的代表语言,它的标准库里面的函数,实际上是站在硬件逻辑和OS平台逻辑上面的一个通用接口。在Windows和类unix上都是这个抽象接口。支持C标准库的OS必须声明它支持这些接口。方能让标准C语言移殖其上。。

unix被产生时,是用汇编写的,汇编有移殖问题,因此unix的作者又创始了C语言,并改写unix,f所以历史上unix上是产生C之前的,C的移殖性超好,这个作者又写了一本书,形成了C语言的第一次标准化。几乎是unix产生之后,类unix系统不断出现,,为了规范这些类unix的兼容性,提出了一个posix,对系统调用例程接口进行了规范,因此产生了posix.

最初的C++语言的实现(就是C++作者写的一个编译器)实际上本质上是一个C编译器,他在C编译器的前端额外加了一个过程,把C++代码映射为C语言作为目标语言。再把此目标语言映射为机器语言。。

1.13 虚拟机与语言

通常用一门语言写出来的程序都被用在诸如X86加OS的架构上运行(平台移殖或编译通过时,我们总是说,在某某某架构上加某某OS上编译通过),当一门语言为了实现跨平台(一般是跨硬件架构,硬件掌有真正的运算资源即芯,而OS核心将硬件能力供软件服务,包括进程,等,对一台裸机编程就是汇编了)考虑时,它首先发展出一个虚拟机(只有这个虚拟机实现了跨软硬平台那么语言代码就实现了跨平台了,因为代码的运行环竟的根本是硬件架构),这样所有用这个语言写出的的代码就由这个虚拟机来解释,这个源代码就不是本地码了(不是供X86+OS这样的本地生成机器码),软件实现的虚拟机往往是一种高级机器(是一种刻意为了适应程序的运行而设置的完美环境,实际硬件上的这样的机器没有),而往往是一种虚拟机能执行的中间码,,当然,虚拟机上的语言如果有特定编译器和编译技术的支持,同样可以为操作系统和硬件生成机器码

一般情况下,软件运行环境=硬架构加软架构

那么虚拟机就是专门为了一门语言而出现的高级软件机器,,它直接在裸机上(加OS?)运行,因此去掉了OS的作用,是语言跟它运行环境的直接结合体(虚拟机是虚拟机,虚拟机里面的编译器或解释器就是它跟语言发生联系的地方),是为了一门语言而出现的优化运行环境

虚拟机的意义远远不只是为程序代码提供一个可运行环境,它真正的意义是使编程工作完全远离操作系统跟硬件架的差别(传统的源程序总是要考虑到移殖,而且要考虑到平台本身给语言造成的复杂性,比如C库的I/O),,在JVM和JAVA下编程,我们无视有一个OS和平台的差别,所有人都面对同样形式的代码..JVM有了这个优势,,JAVA因此成为了工业语言的原因之一.

通常用一门语言写出来的程序都被用在诸如X86加OS的架构上运行(平台移殖或编译通过时,我们总是说,在某某某架构上加某某OS上编译通过),当一门语言为了实现跨平台(一般是跨硬件架构,硬件掌有真正的运算资源即芯,而OS核心将硬件能力供软件服务,包括进程,等,对一台裸机编程就是汇编了)考虑时,它首先发展出一个虚拟机(只有这个虚拟机实现了跨软硬平台那么语言代码就实现了跨平台了,因为代码的运行环竟的根本是硬件架构),这样所有用这个语言写出的的代码就由这个虚拟机来解释,这个源代码就不是本地码了(不是供X86+OS这样的本地生成机器码),软件实现的虚拟机往往是一种高级机器(是一种刻意为了适应程序的运行而设置的完美环境,实际硬件上的这样的机器没有),而往往是一种虚拟机能执行的中间码,,当然,虚拟机上的语言如果有特定编译器和编译技术的支持,同样可以为操作系统和硬件生成机器码

1.14 调试器与汇编器

虚拟机与语言的关系很密码,像jvm跟Java语言的关系就很爱味,有人说,jvm仿佛并非一个通用的软件环境,对jvm编程久了,会觉得像是吃饭的时候去了一家只提供一种口味的冷饮店,因为有些jvm的机制,比如rmi,,只限于用Java语言去开发。

Java语言属于高级语言,实际上当构造了一个虚拟机之后,第一件是给他设计一套汇编语言。除非你不打算给这种虚拟机进行开发,一旦有开发的需要,就需要实现一个汇编语言或一套高级语言。这种必须要实现一个汇编器,,,只有这样,虚拟机才能开始执行,,虚拟机本身并不需要一个汇编器才能开始执行字节码,你可以直接为虚拟机手动写字节码,,提供汇编器只是为了开发的需要。。上面说了。

同样为了开发的需要,,调试器也是需要的,一般的IDE都有调试器,调试逻辑来源于CPU逻辑,intel中有断点中断处理例程,,中断一般来源硬件动作,,但也可在源程序中人为地给CPU下一个软件中断,这就是int指,interrput的前三个字母,int 3这样的指令让CPU产生一个陷阱状态,让机器进入调试状态,此时CPU并不正常执行程序,,而是一步一步地执行程序。。

调试器分硬件级的和软件级的,但都是为了让开发者或机器调试者研究程序在机器内部二进制级别的执行程序,,调试器一般向你显示CPU寄存器状态,符号信息,内存上下文等等。。

汇编语言实际上并不图灵完备,因为它是对指令的一种命称指代,汇编语言没有变量。因此没有编译器里面谈到的变量等符号映射为内存地址的符号化信息,,因为汇编器毕竟不是编译器,解决问题时所面向的源语言和目标语言不一样。。

运行时,从字面上理解为代码运行的环境,无论它是机器套个OS执行引擎,,还是虚拟机这样的软件模拟的运行时,无论如何,代码要得于运行,必须需要内存和CPU指令,,JVM就是JAVA字节码的运行时(并不包括JIT,JAVA的编译器等部件,这些都不是执行字节码必须的,只是负责生成字节码的,而运行时是驱动目标代码运行的环境),C语言代码被编译后到WINTEL上执行时,Windows操作系统加编译器的runtime支持就是机器代码的运行时..fs

1.15 平台之GUI

从C语言的观点来说明桌面,从C 语言的观点可以说明一切逻辑,因为计算机逻辑都是由C开发的,而C本身也最接近计算机的处理逻辑,C抽象了汇编中的一些机器困素,但是它幸好没有做到全部抽象,比如指针,实际上直接跟内存这个部件相关,因此C语言可用来解释很多计算机的东西,,,这是C语言作为教学语方的一个很好的地方. 现在流行的开发一般都分为桌面开发和WEB开发,但是桌面和WEB应该是被整合的,GOOGLE DESKTOP SEARCH,GNOME的名字中,就有NETWORK,甚至于OS内核中就有网络支持,在GNOME中也有BELGEL这样的桌面搜索,,因此网络跟桌面本来就该在一起,只是WEB和HTTP协议这特定的一块的逻辑得到了长足发展(因为跟企业应用紧紧结合),导致了流行的WEB开发,因此,技术都是受商业驱动的..不要以为技术是很高尚的东西

最初的逻辑都是没有GUI接口的,一切都是SHELL跟KERNEL,Unix系统下,MIT X Windows是桌面的CORE,历史上地,SUN公司一直在操作系统方面力图占据桌面(它后来的SUN DESKTOP SYSTEM 简单就是拉及啊),,它的OPEN LOOK 后来败给了MEIRF,桌面最著名的模型,就是B/C消息模型,用类C++写的桌面系统才有CLASS,用C写的比如GNOME没有窗口类名这样的概念存在,有的只是关于窗口的指针,句柄(这些逻辑可由QT,GTK这样的来产生,也可由编程语言来产生,比如GTK,在库内就实现了"对象"这样的逻辑,因此它的窗口也有CLASS NAME这样的逻辑)等.

为什么GUI如此重要?

因此,GNOME这样的图形平台标准,或者一个实现,,就影响了桌面应用,,以及桌面上的很多程序的移殖问题,,从浏览器、办公套件、邮件客户端、音乐/视频播放器、CD/DVD刻录工具、BT下载软件、即时通讯工具以及偏门的音频抓轨工具都一应俱全,,这本质也就是我们在前面说到的是逻辑的关联问题,,比如,浏览器所用的HTML逻辑,就被封装在GNOME中,这造成运行在它上面的WEB浏览器各不一样,因此IE核心,跟FOX核心是不一样的..corba甚至用在GNOME实现内,就像新兴的XML一样也被用在GNOME内

1.16 界面的本质应该是命令行功能支持下的配置描述文件

从更大的范围讲,,任何一种设计都是自蚕自缠,,当然,适合当前应用的设计总是存在的设计的合理性只能是相对的,我们只能做一种“目前最科学”的有限设计,而且这种设计方案也受到问题本身的影响,并不是所有所有目前合理的设计都要拿来用在同一个设计上

你以为GUI是什么呢?

界面GUI这个东西,不是逻辑本身(人们通常以为CUI才是,CUI中提供一些支持界面的逻辑,,然后,界面主体的本质应该是命令行功能支持下的配置描述文件,此时GUI不是逻辑,而是配置),但是界面也可当作逻辑本身来看,,此时,它就不应该是配置在操作系统的设计中,那些硬件访问功能,CPU资源转化成进程,永远是最底层,最应该被首先解决的逻辑,,那么界面呢,通常被放到后面,操作系统的设计跟一般稍微中等应用程序的设计(特别是涉及到移殖)时碰到的问题几乎是一样的多,,因为应用程序总有它的关于运行的平台逻辑(CPU+OS),,而不总是那些建立在业务领域的高层逻辑,,在完成这些底层逻辑的过程时,也要涉及到界面,,涉及到线程,,涉及到图形,,涉及到SOCKET,,内存模式的数据结构,等,因为这就是PC的逻辑,除非你不是对PC开发(开发语言本身跟平台结合导致的一系列底层逻辑也大量出现在开发语言本身的机制和细节中,,也出现在开发语言开发出的可复用库中,),,因此只要是复用,都跟平台逻辑相关,,只有像WEB开发+JAVA,这样的组合,才使程序员彻底(也不是彻底,70%吧)不需要了解系统知识,,而可以www.58yuanyou.com进行编程(所以有人说WEB程序不是纯正的程序员,因为它们不懂计算机,只懂他们的工作业务,他们做的不是开发,而是逻辑配置),你说写XML文件是开发吗?写XML机制的实现才是开发,,因为涉及到数据结构和内存。。这才是开发,,,lua

作为配置语言的脚本语言就是这个意思,它适合写界面描述和配置数据描述这些高层的东西,不适合描述机器本身..

可见,所谓程序,就是不同的层完成不同的工作而已,,一个是靠近PC底层的比较难点,,一个是靠近你要做的事的高层,比较容易点,,这一切体现的精神,,就是封装和接口,,封装体现的终极精神是复用,,复用体现的终极精神是人。

如何为一个OS设计GUI接口呢(我们以为OS内核都是命令接口的像LINUX就是这样,不像WINDOWS内核那样把GUI集进去)

首先最底层就是LINUX,然后是SDL逻辑和XML逻辑封装进linux内核,作为CUI中为后来所用的GUI接口,然后在这基础上发展出一些封装SDL的高层库(使得以后的开发不要动不动就访问硬件),,用这个库发展出一个桌面环境,比如argr,然后玩游戏什么的,就直接使用SDL就可以, 其它的应用逻辑(除了玩游戏等桌面应用),比如网络应用,因为内核中有SDL和XML,至少它们的界面已经解决了,其它的问题就是其它的问题了

1.17 命令行下编程实践

编程为什么要在命令行下而不提倡在界面下呢,,这是因为命令行下有界面,而界面下人们都往往不觉察到有命令行,而其实命令行才是本质逻辑,界面只是一种GUI,是一种建立在本质逻辑上的用户接口和配置文件(只是一种不必要的表现抽象)。真正的逻辑可以不需要一个界面接口来展现它,但强加了界面接口的逻辑就限制了逻辑本身的表达。。因为命令行是观念里自由的世界,是C这样语言开发时所面向的直接世界,是计算机逻辑发源的真实世界,所有计算机逻辑的起点是命令行的(仅需要文字界面这样的用户接口就行了),图形用户界面逻辑只是后来的后来需要考虑的东西。。所以开发时不免将界面逻辑滞后,而实际上,无论先后顺序还是本质特征,我们始终都要把握一个观念,即其实命令行比(图形)界面丰富有趣得多,我们始终要相信,虽然我们在Windows下长大,但其实命令行才是主流,才是我们的思想和开发根据地。

UNIX下的那种Shell操作,命令行工具和管道理念,远远比Windows菜单有效率(当然,命令行最普遍它的门槛却很高),因为本质上,命令行逻辑的一条语句&quotroduceMenu(10000)",屏幕再大,也不可能生成10000个菜单供你使用。。而在命令行下,一条命令可搞定这样的逻辑,因为命令行是没有界面限制的观念世界(图形没有文字表意丰富),形成计算机逻辑的一层一层是是命令行的,,C开发时也是命令行的因为C的库全是命令行的,Windows API接口是C后来的产生GUI的一种方式,C是面向命令行的,它面面系统底层,并不一开始就将界面逻辑纳入所有的逻辑开发中。。

winxp怎么看电脑配置

我常用的C开发平台是CH,一种C解释器和命令行模式下的交互编程环境,它用了如下的Msys工具,我们需要深克掌握这些Linux下的开发工具(它们实际上也是系统工具,因为Linux比Windows提供了更原始对开发的支持). make,这是linux下编译大型程序使用的,很多IDE都集成了它。

vim,,如果能熟练使用VIM,那么你就会发现,它远远比Windows下的记事本,和一切IDE都有用。

内容版权声明:除非注明原创否则皆为转载,再次转载请注明出处。

文章标题: winxp怎么看电脑配置

文章地址: www.58yuanyou.com/jiqiao/179254.html

相关推荐