一、前言
写过代码的同学一定以下两个疑问:
(1)我们的代码是如何被机器运行的?是的,它们主要是由预处理器、编译器、汇编器、链接器、解释器这几个过程完成的;
当然,语言分为编译型,解释型语言和混合型语言:
编译型语言:编译器把源程序每一条语句都编译成机器语言,并保存成二进制文件,这样机器都能直接运行二进制文件,速度比较快。
解释型语言:解释器只是在程序执行的时候才一条条解释成机器可以理解的语言,当然速度不如编译后的语言运行的快。
混合型语言:混合型语言是把源程序编译为通用中间语言的字节码文件(比如Java的*.class文件)再由运行时解释器解释执行。
因为计算机只能理解机器语言(二级制形式)
(2)C++语言、C语言、Java语言等等,这些语言之间到底有什么不同。
二、源程序编译流程
那么上面所说的预处理器、编译器、汇编器、链接器、解释器应该怎么理解呢?
这个流程表述的非常清楚了,从源码到机器指令的过程。如果要解释每个过程的原理,那可能要引伸出很多其他知识点,所以这里只是简单介绍:
(1)预处理器:预处理器是在真正的编译开始之前由编译器调用的独立程序。预处理器可以删除注释、包含其他文件以及执行宏(宏macro是一段重复文字的简短描写)替代。
(2)编译器:编译器就是将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级语言)”的程序。一个现代编译器的主要工作流程:源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → 目标代码 (object code) → 链接器 (Linker) → 可执行程序 (executables)
(3)汇编器:是将汇编语言翻译为机器语言的程序。一般而言,汇编生成的是目标代码,需要经链接器(Linker)生成可执行代码才可以执行。
(4)链接器:链接器的工作就是解析未定义的符号引用,将目标文件中的占位符替换为符号的地址。链接器还要完成程序中各目标文件的地址空间的组织,这可能涉及重定位工作。
(5)解释器:能够把高级编程语言一行一行直接转译运行。解释器不会一次把整个程序转译出来,只像一位“中间人”,每次运行程序时都要先转成另一种语言再作运行,因此解释器的程序运行速度比较缓慢。它每转译一行程序叙述就立刻运行,然后再转译下一行,再运行,如此不停地进行下去。
三、编程语言标准
好,在看到上面的流程之后,相信你似乎对源程序翻译成机器语言已经有了一个大致的了解,理解了第一个问题。但是对于第二个问题呢?C++语言、C语言、Java语言等等,这些语言之间到底有什么不同?我的答案是他们仅仅是不同的高级编程语言标准,说他们高级,是因为它们是有我们写出来的,那我们自己肯定比机器高级啊,那不然为什么现在人工智能这么火热(当然,机器终究会比我们高级),说它们是编程语言标准,意思是指它是大家写翻译源代码的编译器时都同意(或必须)遵循的守则(标准)而已(这句话一定要认真体会、理解),它们除了语法上的不同,以及谁比谁更好用,功能更多等这些条件外,没有其他的不同。
就算这些语言之间是遵循不同的语法标准,它们基本上都要经过上面几个过程,那到底语法的不同会这样影响上述流程呢?答案是:它只会影响编译器(编译程序)的不同,为什么呢?刚刚不是说了吗?不同的语言标准,也就是大家写翻译源代码的编译器时都同意(或必须)遵循的守则(标准)而已。那为什么汇编器、链接器等不会被影响呢?那是因为编译器输出是汇编代码,而汇编语言是一种通用的语言标准,它作为高级语言与机器语言之间的桥梁,不管高级语言遵循什么样的标准,即不管你是用C++编写的还是用Java编写的或者是其他各种高级语言编写的HelloWorld,只要用它们各自的编译器代码运行,输出的文件都是相同的汇编代码(当然,有可能编译器的处理不一样,优化程度不同,会有差别,但大体是一样的),汇编代码中每条语句都以一种标准的文本格式确切的描述了一条低级机器语言(汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。),汇编代码没有C、C++这些高级语言好理解。
熟悉或者使用过Windows API和MFC框架编程的同学,你们是否有百度过这二者的区别?,结果上面关于编程语言标准的解释之后,这二者有一个区别就是他们所使用的语言标准不一样,Windows API使用的是C语言标准,而MFC使用的是C++语言标准,虽然在使用Windows下的IDE(如VS2010)进行程序开发时好像都能运行,但其实二者是采用不同的编译器标准的,我想可能是在那些IDE中(如VS2010)同时集成了两种语言标准的编译器或者用同一个编译器就能编译C和C++(因为C++本来就兼容了C)。
四、总结
什么是语言标准:就是大家写翻译源代码的编译器时都同意(或必须)遵循的守则(标准)而已。所以说C++语言、Java语言都是一种高级语言标准,学会了一种语言标准,会按照这个标准写程序,再要去学另外一种语言,那就简单了,因为你只需要写,然后再对应的编译器下编译运行它就可以了。
用高级语言编写的源程序代码依次经过预处理器、编译器、汇编器、链接器先从人能读的懂的高级语言(源程序代码)被翻译成次高级语言(汇编代码),然后再被翻译成人不能读懂的机器语言指令,这是一个逐渐向低级语言解释翻译的过程。