在使用高级编程语言做应用软件开发的时候并不需要了解底层计算机各部件的工作细节,但是了解计算机各部门的工作原理对于学习编程知识非常有帮助。知识了解的越多,再学习其他知识速度也越快。
计算机的组成
计算机是由输入设备,存储设备,控制器,运算器,和输出设备这五大部分组成组成。它的工作流程可以简单的概括为
输入:由输入设备比如键盘,鼠标等输入程序和数据。
存储:将程序和数据以同等地位(指令和数据都是01组成的串0)存储在主存中
运算:控制器从主存中取指令和数据,调度运算器进行运算
输出:最后通过输出设备进行输出
CPU
运算器和控制器通常是封装在同一个芯片内部,叫做CPU。CPU只能理解处理机器语言。机器语言是由操作码和地址码两部分组成的。操作码表示机器所能执行的各种操作比如从内存取数,把数据写到内存,加减乘除运算等有限种操作。
某机器部分的指令集如下表:
操作码 | 操作性质 |
000001 | 取数-将指令地址码指示的存储单元中的操作数取到累加器ACC中 |
000010 | 存数-将ACC中的数存到指令的地址码指定的存储单元中 |
000011 | 加-将ACC中的数与指令地址码指示的存储单元中的数相加,并将结果存储到ACC中 |
000101 | 打印-将指令地址码指示的存储单元中的数据打印 |
内存
内存也叫做主存(Main Memory)。内存中最小的存储单位是byte(字节),每个字节有8bit(比特)。每个存储单位都有一个地址,也就是存储单位的编号。内存是程序运行时的存储空间,同时运行时所使用的数据也是保存在内存中。
内存是由DRAM芯片组成的。DRAM的全称Dynamic Random Access Memory(动态随机访问存储器)。我们可以把内存想象成一个大型的一维数组,其地址就是数组的下标,通过地址可以直接读写对应存储单元的数据。
要想运行一个程序就需要先将保存在磁盘上的数据和程序装载入内存中,然后CPU逐条从内存中读取指令解析执行。
在了解了内存和CPU的工作情况后,我们就可以使用机器指令在指挥机器做运算,比如说有两个数a和b, 将a 和b这两个数相加,将结果保存在c中
机器语言
要使用机器做如上运算,首先需要将代码和数据从硬盘装载到内存中
内存模型 | |||
指令和数据无差别的存储在主存单元中 | 指令 | 注释 | |
操作码 | 地址码 | ||
14 | a | 原始数据a存储在编号为14的内存单元中 | |
15 | b | 原始数据b存储在编号为15的内存单元中 | |
16 | c | 原始数据c存储在编号为16的内存单元中 | |
17 | 0000001 | 14 | 取内存地址为14存储单元中的数据到ACC |
18 | 0000010 | 15 | 将内存地址15存储单元中的数据和ACC中的数据相加,并将结果放到ACC中 |
19 | 000011 | 16 | 存数,将ACC中的数据写到内存编号为16的存储单元中 |
CPU所做的工作就是这样,从内存中取出一条指令解析执行,然后再从内存中取出吓一跳指令解析执行,有时候可能要将计算的结果在写会到内存。如果需要计算机做某些事情,就必须为其提供特殊的指令列表,确切的告诉计算机要做的事情以及如何去做。
不同的CPU的机器指令集是不同的,因此使用机器语言编写的程序,只能在特定的机器上运行,不具有可移植性。
平时和朋友交流时,可能用错几个单词,犯一两个语法错误,或者几句不完整的句子,对方也能明白你说什么。但是机器不像人这样聪明,我们和机器交流,指挥机器做事情,第一步做什么,第二步做什么,必须把每一个步骤做什么明确的写出来。
汇编语言
由于用01组合的串表示的指令对人的记忆和阅读非常的不友好,为了方便开发和阅读,于是就有了助记符号。比如从内存取数据的指令可以用LD表示,把数据写回到内存的指令可以用OUT表示,两个数相加的指令可以用ADD表示等等。
用助记符号表示指令就称作是汇编语言。助记符号和机器指令是一一对应的,在运行的时候呢,需要使用汇编器将助记符号在转换成机器指令然后运行。汇编语言同样不具有可移植性
// 上述的机器指令描述的加法运算,使用汇编来描述
LD 14
ADD 15
OUT 16
高级语言
从上边的内容可以看到,机器语言和汇编语言,都是机器的思维方式,需要把我们要做的事情按照机器的思维方式把每一个步骤都清晰的描述出来。这样做非常的繁琐,且需要软件开发人员对硬件非常的了解才能写程序。
20世纪六七十年代,逐步出现了面向问题的高级语言,比如Pascal,C 语言等。这类高级语言对问题的描述相比于汇编就非常接近人们的习惯,并且具有较强的通用性。
比如解决问题的顺序执行的步骤,if/else的分支判断的运行步骤,for/while循环,加减乘除的运算等等更接近人类的自然语言。
比如要计算a,b 两个数相加,并将结果保存到c 中,用C语言来描述就是
c = a + b
这样一条语句就可以了。程序员不需要知道CPU和内存的内部结构和工作模式,不需要只会CPU从内存取数,不需要指挥CPU从内存写数据,不需要直接指挥CPU做运算等等。这样程序员编写程序就不需要再了解这些机器的内部细节,且编码工作更加高效,代码量更少。
在这里需要注意,CPU只能识别机器语言,我们使用高级语言编写的程序,CPU是不认识的,在执行之前,需要先进行编译转换。