接触过编程的人对“汇编”,“解释”和“编译”三个名词一定不陌生,但要是详细区分起来,大多数人还是比较糊的,今天我就来谈谈这三个东西。
PS:有个问题需要说明一下,本文所讲的编译是一种思想,而实践应用中所说的编译是一种利用这种思想的技术,叫做编译技术,通常是指将源程序编译成机器码的全过程。当然,主要思想是编译思想,但如果仔细调查一下就会发现,编译技术里面三种思想都会所体现,这就是技术的特点与魅力吧
首先,来研究一下什么是编程。
和许多成型的技术或理论一样,编程也分广义编程和狭义编程。广义编程比较复杂,留作以后再详细研究,这里只谈谈与本文有关的狭义编程,也就是计算机指令编码。这种编程很好理解,学过计算机二级的人印像最深的就是写一段代码,然后以各种形式输出一些符号,用的最多的也是所有语言都有的print语句吧。但计算机本身只认识0和1,并不认得print是个什么东西,所需要一个“翻译”,把print翻译成01序列,计算机才会明白,下面来详细说说从高级语言代码到计算机执行的整个过程吧。
- 高级语言就是现代软件开发中所使用的类自然计算机编程语言,如BASIC, C, Java等。
- 这些语言的源代码首先要转化易于处理的临时数据结构,也叫作“中间代码”。
- 中间代码再一次处理后,生成了一种叫做“目标文件”的文件。目标文件可能是一种叫做“汇编代码”的东西,也可能是另外一种语言的源文件。
- 以上2-3步经过一次或多次反复之后,最终生成了汇编代码。
- 汇编器将汇编代码汇翻译成计算机可识别的01机器码。
- 但是光有机器码还是不够的,因为程序中有API(应用程序接口)调用,也就是程序要求操作系统做的一些事情,比如print语句一次会要求操作系统去操作显示器,这就是一种API调用。所以,链接器这时出来工作了。它把程序要求的API找出来并将地址等必要信息写入程序机器码中,这个过程叫做“链接”。
- 经过链接的机器码,就可以安心地交给计算机中央处理器( CPU)了。
- 中央处理器接到机器码指令后,会将机器码指令交与指令解码器,它的工作就是根据当前机器指令,去它自己的记忆库中找出配匹的一系列微码,交给处理器。
- 微码就是记录处理器中数据处理完整过程的指令,也就是说,这才是计算机真真正正能够识别读取的一种“语言”,好了,经过了千辛万苦,计算机总算是开始执行我们的程序了。
上面的过程中,许多地方都用到了语言之间的转化,也就是“翻译”,而这种“翻译”的思路,就有最开始提到的那三种方法。
一、汇编
汇编是三种方式中最接近“翻译”的本来意味的,因为汇编过程就是把汇编指令一对一地翻译成01机器码的过程。而采用这种处理方式的语言只有一类:汇编语言。
汇编语言是当今世界上历史最早,应用最广,功能最强大,运行速度最快的编程语言。这是有人可能要问了,汇编这么强,还要其它语言干嘛?那是因为它的缺点:开发工期长,可读性差,并且不能跨平台编程。
也许还有人对“应用最广”有意见,的确,程序员是基本不直接用汇编了,但汇编仍然用于基本所有的编译器和解译器当中,由上文3-4步可知,高级语言都是先被处理成汇编语言,然后由平台相关的汇编器和链接器汇编并链接系统后才生成可执行的二进制机器码的。
二、解释
解释过程,就是对于源文件中的每一条指令,都依次翻译成目标指令,并且执行的过程。
采用解释过程运行的语言有大名鼎鼎的BASIC,还有目前应用较广的大多数脚本语言。
特点就是需要一个解释器来实时地解释每一条指令并运行,所以运行比较慢。但它的优点是决定性的--平台无关性。任何平台只要装上解释器都可以运行完全相同的代码。
三、编译
编译过程,与解释挺像,区别就在于编译是将所有的源代码指令一次性成翻目标代码并执行。
采用编译的语言比较比,常见的用Pascal, C, C++等。
特点就是不需要解释器的参与,所以运行比较快,但缺点也是致命的--平台依赖性。编译好的程序只能在当前平台运行,是个局限性。
讲完了上面三种过程,各位可能会有遗憾,因为它们各有缺点。其实软件业发展到了今天,许多人正在为此努力并有了不少的成果。
高级语言的出现就解决了汇编语言开发工期长、可读性差的缺点。但高级语言的出现又引出了解释和编译的矛盾。取长补短是我们解决矛盾时第一想到的方法,现在,这种方法已经被Java、C#等语言所使用了。
Java和C#等语言所采用的思想是“虚拟机”概念。所谓虚拟机就是虚拟平台,先假设在当前平台上层还有一个平台,在这个虚拟的平台上采用编译方式,将源代码编译成易于虚拟平台解释的一种中间语言代码,然后虚拟平台再以解释方式在真正的平台上运行中间语言代码。这样,便实现了运行效率和平台移植的“双丰收”。
经常在网上看到有人在争论Java或C#是解释型语言还是编译型语言,其实,由上段所讲,这种争论根本就是毫无意义。存在争论无非就是因为学校课本上说语言分“解释”和“编译”,而现在分不出来了觉别扭,一定要分出类来才行。我想这些人也只能叫他只会读死书的书呆子吧。只会把知识留在书本上,不会深入思考其根本原理永远是学习的大忌。
给大家留道作业吧:指令解码器将机器码“翻译”到微码所用的是上面哪种过程?