计算机的软、硬件都是一种排列组合的艺术。硬件是晶体管(逻辑门)的排列组合(包括由逻辑开关组合的加法器和记忆电路,基本逻辑门可以组合成简单的加法器,加法器可以组合成复杂的逻辑模块,可以逐级组合。每一个模块都可以完成一些基本的操作,这些操作用0、1描述就是指令,全部模块便可以对应一个指令集);软件是基本指令或语句的组合,一个指令序列就是一个程序。从这个意义上理解,硬件可以理解为基本模块的硬组合(固定连线),程序可以理解为基本模块的软组合(动态连线),这也是在现在计算机系统中,软、硬件的界限模糊的原因所在。
计算机硬件的基本模块虽然只能完成简单的操作,但是其速度非常快,1秒可以完成上亿次的操作(对一些机械重复性的操作特别有优势)。另外,构成计算机基本单元的逻辑开关(晶体管)可以做到特别小,一个指甲大的芯片可以集成上亿个晶体管(最近IBM的5nm技术可达300亿个)。
所有装有CPU芯片的机器都有一张操作命令清单(指令集),让你可以控制它。有时这个清单非常简短,如电水壶就只允许两种操作:打开和关闭;CD播放器稍微复杂点,除了打开和关闭以外,还能调节音量、播放、暂停、快进、快退、随机播放等。计算机和其他机器一样,也有一张操作命令清单。比如,可以命令计算机把两个数相加。这种操作命令的总和就是计算机的机器语言(machine language),直接面对机器,无须任何解释,可以直接执行。
如果计算机再安装一个操作系统,不但方便和简化计算机的操作,还可以完成更复杂的任务,编程也可以调用操作系统的资源。
根据冯·诺依曼的内部存储程序概念,不管是指令、还是由指令处理的数据都保存到计算机的存储体系中,同等对等。如1001,可以是一个数字,也可以是一个指令,或代表一个字符(到于具体代表什么,需要根据指令规范或计算机语言规范去在上下文中理解)。
一个程序(指令序列)运行时,全部的指令序列代码存储在内存的代码区,全部指令都有地址对应;指令序列中定义的数据(或数据结构)存储在内存的数据区中,同样有地址对应。不管是指令,还是指令中定义的数据,都可以通过地址码被访问到。
在计算机系统中,指令集中的具体操作功能主要是由CPU的运算器去完成;对指令和和数据的存储,由存储器或寄存器去完成,对指令的和数据的调取、对指令的解释,则由控制器去完成。
计算机系统(软硬件大厦)的各个层次的基本特点可以概括为:
硬件:运算器在控制器的调度下操作存储器(主存或寄存器)中的数据;
机器语言:用操作码处理地址码;
汇编语言:用操作符号处理变量名字;
高级语言:用语句处理各种数据结构;
操作系统:用系统命令处理文件;
计算机是数据处理的机器,具体的处理是由控制器调度和解释操作码、或操作符号、或语句、或系统命令,由运算器具体操作。处理的对象就是数据,可以是表示数据的地址码、或变量名字、或数据结构、或文件。对比到工厂的产品加工,就如同加工的具体动作、步骤、工艺、加工的对象,或是零件、或是物料。
写程序也叫编代码,用什么语言编呢?用机器语言编的01串,机器可以直接运行,运行效率高,但编写和维护都很困难。有人想到,如果保留机器指令的结构,用便于记忆和理解的符号和名字(字母和10进制数字组成的字符串),去一一对应操作码和地址,写好后再通过查指令清单去转换为01串,肯定要易于编写和维护。至于如何查找和转换,其实这正是计算机所擅长的,编写一个这样的转换程序即可,这种思想下的语言就是汇编语言,转换程序就是汇编器(汇编语言操作符号的字符串与机器语言操作码的01串是一一对应的关系)。更进一步,用更抽象更接近自然语言的语句和数据结构来描述操作符号和变量名字,就是高级语言和编译器(或解释器)。
三种语言对指令序列的描述,可以对比一下:
上面说到,计算机的神奇之处在于速度特别快,特别擅长作机械重复性的工作。具体到语言,同样的,通过跳转或控制结构,也可以实现代码的循环运行,实行重复操作。也就是说,假设要实现从1到10000连加,不需要编写10000行代码,只需要通过跳转或控制结构,通过定义一个变量(对应一个内存单元的数据),让这一行或少数几行代码重复执行10000次即可。如汇编语言的JMP、Basic的goto、C语言的for或while等循环结构都可以实现这种跳转。(当然也可以实现按条件选择执行部分代码,实现分支结构。)
1 机器语言:用操作码处理地址码
计算机的指令集是厂家编写的,一份描述CPU芯片可完成的一些基本操作的清单,编程人员可以依据这份清单来编写程序,组织一个指令序列。
指令集的指令从功能上一般可以区分分为:算术运算、逻辑运算、代码传送、控制指令、停机等。
每条指令都由操作码(具体动作)和地址码(指向具体数据)组成。每条指令中无论是数据还是操作码,全部都是0和1的串,对应逻辑开关的开与关。由指令序列构成的每个程序,也全部都是0和1。
机器语言(machine language)是机器指令的一个列表,其中的每个指令都能直接被处理器理解。它也可以理解成机器指令的一个执行序列。
2 汇编语言:用操作符号处理变量名字
汇编语言(assembly language)是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地址符号(Symbol)或标号(Label)代替指令或操作数的地址。在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。普遍地说,特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。
3 高级语言:用语句处理各种数据结构;
由于汇编语言依赖于硬件体系,且助记符量大难记,于是人们又发明了更加易用的所谓高级语言。在这种语言下,其语法和结构更类似汉字或者普通英文,且由于远离对硬件的直接操作,使得一般人经过学习之后都可以编程。
高级语言又主要是相对于汇编语言而言的,它是较接近自然语言和数学公式的编程,基本脱离了机器的硬件系统,用人们更易理解的方式编写程序。编写的程序称之为源程序。
高级语言并不是特指的某一种具体的语言,而是包括很多编程语言,如流行的java,c,c++,C#,pascal,python,lisp,prolog,FoxPro,易语言,中文版的C语言习语言等等,这些语言的语法、命令格式都不相同。根据不同的抽象方式,还可以分为命令式语言、函数式语言、逻辑式语言、面向对象语言等。
不论何种高级语言,都有一些共同的指导思想。任何数据处理任务都应当分解成可以适当重复进行的许多过程,例如函数和子程序。程序中可以有平铺直叙的“串行模块”,反复执行的“循环模块”,以及根据情况判断下一步往何处去的“分支模块”。使用这三种模块便可实现任何数据处理,这就是所谓的“结构化程序设计”(Procedure Oriented Programming,POP)。
在POP程序中,数据结构都是具体的,形式上没有规定各个过程(对数据结构的操作)和数据结构的关系。这种“自由度”反而使程序的运行方式变得相当不自由。运行一个POP程序,基本上就是按事先设计好的顺序,依次调用各个过程。过程的调用顺序可以在运行中做适当改动,但这都要预先在程序中设计好,采用判断或“中断”的方式实现。程序员或用户不能灵机一动,就在运行中随意改变各个过程的组织方式。
到了20世纪80年代,出现了一套新的程序设计思想,即“面向对象的程序设计”(Object Oriented Programming,OOP)。OOP的基本思想是数据结构抽象化。在定义数据结构时,就要做好两方面的规定,一是数据结构的性质、状态或属性;二是规定在此数据结构上允许实现的操作,凡是没有事先规定的操作以后都不许使用。这样的数据结构称为一个对象或一个“类”。对象是带有操作(方法或事件)的数据结构,或者说由操作刻画的数据结构。从形式上看,数据结构和操作的关系不自由了。然而,这些对象是抽象地定义的,运行中可以随时形成新的、同类的数据结构。这样一来,就有了相当自由的程序运行环境。程序设计就是分别定义各种对象,把对象在调度程序中进行登记,而程序的运行就是动态地激活和调用各种对象。对象的调用顺序和同时激活的对象数目都是相当自由的。
4 操作系统:用系统命令处理文件
操作系统(Operating System,简称OS)是管理和控制计算机硬件与软件资源的计算机程序,是直接运行在“裸机”上的最基本的系统软件,任何其他软件都必须在操作系统的支持下才能运行。
操作系统是用户和计算机的接口,同时也是计算机硬件和其他软件的接口。操作系统的功能包括管理计算机系统的硬件、软件及数据资源,控制程序运行,改善人机界面,为其它应用软件提供支持,让计算机系统所有资源最大限度地发挥作用,提供各种形式的用户界面,使用户有一个好的工作环境,为其它软件的开发提供必要的服务和相应的接口等。实际上,用户是不用接触操作系统的,操作系统管理着计算机硬件资源,同时按照应用程序的资源请求,分配资源,如:划分CPU时间,内存空间的开辟,调用打印机等。
一个用户或编程人员如果面对一台没有操作系统的裸机,会是一个什么样的情况呢?一是计算机的资源不会得到充分利用;二是计算机很难操作;三是编程也会变更异常困难。就像一人去了一个没有基础设施的城市,生活寸步难行。
首先从资源的角度去理解。从时间看,一台计算机系统至少涉及三类相差悬殊的处理速度。主机的节拍每秒可以执行上亿的指令,而带有电动机、继电器等电机械成分的外部设备,1秒只能完成上千次动作,而人呢,速度更慢了。从空间来看,计算机有大量主存和外部设备,一般一个应用只占这些资源很小的一部分。如果一次只有一个应用运行,则从空间和时间来说,都是资源很大的一个浪费。
因此,操作系统便应运而生了,操作系统对计算机资源和用户作业的调度管理,是重要的是“文件”概念。首先,有一大批供一切用户共享的“系统文件”,其中包括操作系统本身和各种语言的编译、解释程序,以及产生和修改文件用的编辑程序、连接程序等。还有用户在工作过程中逐步建立和积累的“用户文件”。同时,文件也并不限于文字或编码的信息,有些外部设备也可以当作“文件”看待。例如,键盘是一种“只读文件”,打印机则是“只写文件”。
文件的生成、修改、编辑、合并、删除和目录管理是操作系统最重要的功能之一。用户众多或文件成堆时还必须实行分层次的管理,允许建立和取消各级“子目录”,这些都是文件管理系统的任务。
输入和输出设备的管理是操作系统的另一项重要任务。用户所有的输入输出操作,都只能是向操作系统提出申请,由操作系统做出排队处理的安排。
还有实时操作系统的时钟管理、通信和网络管理、提供程序调试手段、窗口管理、虚拟存储管理、提供“中断”服务,以及作业和“进程”的排队调度等。
当然,还可以用操作系统命令编写脚本,然后把脚本名字当成新的操作系统命令一样使用。