第五节 编程语言概述
本小节主要了解计算机执行程序时的内部过程,以便可以更好的理解程序的本质,达到更好的学习效果。本小节是了解内容,看不明白也没关系。
机器语言与汇编语言
计算机的CPU内部有很多个模块,称为计算逻辑单元,每个单元都只能做一件事情,比如只将两个数字相加,比如存储一个8位的二进制数据等等。为了命令他们工作,就给这些单元编号,比如给做加法的单元是1号,数据移动操作的是2号...电脑里面有一个逻辑单元会将这些编号运算导致编号是几,第几根线上面有电,其他线上面没有电,使得只有这个编号的运算单元工作,从而达到命令它们的目的,同时像加法,这些操作还需要告诉他们对应他们处理的数据在哪里等。可能最终对应这样一张表。
| 编号 | 对应数据地址 | 对应数据地址 | 对应操作 |
|---|---|---|---|
| 1 | 1号存储单元 | 2号存储单元 | 将位置1(一个存储数据的单元)里面的数和位置2里面的数相加 |
| 2 | 1号存储单元 | 0x000001 | 将内存0x00001(数据地址)中的数据放到数据1里面 |
| ... | ... | ... | ... |
但是我们知道,电脑中只有0和1,所以大于1的数都只能用0和1表示,所以修改后可能变成了下面的样子。
| 编号 | 对应数据地址 | 对应数据地址 | 对应操作 |
|---|---|---|---|
| 00001 | 0001 | 0010 | 将位置1里面的数和位置2里面的数相加 |
| 00010 | 0001 | 0x000001 | 将内存0x00001(数据地址)中的数据放到数据1里面 |
| ... | ... | ... | ... |
最终条命令可能就是00001 0001 0010这样,电脑内部会自动处理他们。像这样只有01两种代码组成的指令叫做机器语言,机器语言是一串只有0和1组成的指令串,上面分成三份还是,我为了和上面表格中对应加了空格,真是的指令串并没有就是一串完整的如(0000100010010),这样的代码稍稍写错一个字符就会导致出错,后来计算机科学家们给这些代码起名字,使用一些简单的英语单词(助记符)来代替那一串字符,比如上面做加法的00001改成ADD,并给上面的两个位置(位置1和位置2)起名叫寄存器,按照用处也设置成编号。这样就比01好记多了,但是电脑却看不懂了,这是就需要编写一个翻译程序,将这些名字翻译成对应的代码。这种使用简单单词编写的程序叫汇编程序,这种语言叫汇编语言。它们可能像如下的样子。
add ex rg
mov 0x00001 rg
...
平台
cpu制造商很多,虽然很多cpu的功能差不多,但是他们还是有差距,比如同样都可以做加法运算,但是他们内部编号可能不同,上面我们举例是1号,但是别的可能不是1号,而是3号或者5号,但是他们都使用相同的单词比如ADD,那么只要使用统一的ADD命令,就可以令他们完成一样的操作,这种情况称为平台,有些命令可能并不是直接对应一个真实的cpu运算单元,而是对应一堆指令,比如算一个乘法,有些cpu是有直接运行结果的运算单元,而有些则是通过调用多次加法来完成的(如3X5可能是3个5相加的结果),像这种对应多条命令的命令称为宏指令。这些不同cpu处理红指令的方法可能不同会造成命令的不同,同时早起可能由于大家彼此壁垒,产生了多种命名标准,产生了多套汇编语言,像这种各自支持各自cpu的汇编语言就是具有平台相关性的语言。虽然后来大家为了拉拢客户都使用软件层的方法实现了支持对方指令的软件,即兼容更多的汇编标准(兼容的好坏就是兼容性),但是平台的差异还是无法消除的。
高级语言
有了汇编语言,比直接操作cpu进步了不少,但是想要编写规模大一点的任务,还是不行,于是计算机科学家发明了高级语言,高级语言相比汇编语言,更加符合人的思维,使得编写程序就像用英文写作般流畅,但是它的本质却距离计算机的本质越来越远了,电脑根本无法识别这些人类看着很舒服的语言,于是就有了和该语言配套的翻译程序。同时,使用高级语言写出的程序也给它们起了一个名字叫源代码,翻译程序有两种,有两种翻译策略,一种是,一次只翻译一句,翻译一次就将cpu认识的结果给cpu让它执行,这种机制称为解释执行,另一种则是不管三七二十一将源代码全部翻译,并将翻译获得的这种cpu可以直接识别的结果保存在一个文件中,这个文件被称为目标程序。想运行程序,只需要运行目标程序就可以了。这种机制称为编译执行。而获取目标程序文件的过程就叫做编译。而负责编译源代码的程序就叫做编译器,而负责解释并执行源代码的程序叫做解释器。
编译执行和解释执行是两种不同的策略,各有优点。编译执行因为只翻译一次并保存翻译,不像解释执行,每次都需要现场翻译,所以会快很多,但是,编译的结果换到另一台电脑上是无法执行的,只能使用另一个平台对应的编译器重新编译,所以做不到跨平台。但是解释执行,编写一次代码,只需要编写不同平台上面的解释程序就可以在不同平台上运行相同的程序,可以做到跨平台。
像c语言就是编译执行的语言,而java则是编译+解释执行的语言,java为了可以实现跨平台,它编写了编译器和解释器,编译器并没有将源代码(xxx.java)编译成cpu可以直接识别的代码,而是编译成一种称为字节码(xxx.class)的东西,这个过程就是编译过程,对应的程序就是javac命令程序,同时为各个平台都配套了各自的解释器,解释器解释字节码执行程序,这个解释器就是对应的java命令行程序,它也叫java虚拟机。它即做到了跨平台同时又比完全解释执行快,所以很好的解决了问题,但是它相对于直接执行的语言来说还是要慢一点,毕竟中间夹了一层虚拟机。