编译那些事儿2-编译、汇编、链接(完结)

之前介绍了计算机编译静态语言的过程,以及编译过程四个阶段中的第一个阶段预编译。

预编译就是编译前将程序内头文件相关以及条件编译相关的内容加入到程序文件中,去掉注释等对程序执行无用的相关信息。

预编译完成后就是编译阶段,这时编译器会将预编译产生的文件翻译成汇编代码。

编译阶段

编译器在编译阶段会根据编译器的语法规则对待编译文件(预处理阶段产生的*.i文件)进行语法和词法分析,然后将其转换为汇编语言,通过在编译选项中加入-S命令产生汇编文件。这不同于高级语言中的解释程序,解释程序是边解释边执行,一句一句地解释然后执行,而不是像底层C语言一样需要先编译成一个可执行文件,然后再运行这个可执行文件。

解释型程序有一个缺点就是执行速度比较慢,因为它是一边解释一边执行的,如果出现循环语句就要重复执行一个操作很多次,造成资源浪费,而编译型程序在编译过程中已经优化了很多程序的执行过程,相对而言速度比解释行程序快得多。

编译阶段是将高级语言源程序进行相应规则的转换,转换成机器能够识别的语言的程序,然后让计算机执行这个程序得到计算结果。

编译时,编译器先分析语法和词法,然后会优化代码,最后分配存储生成汇编程序。

汇编阶段

汇编是将编译阶段产生的汇编文件翻译成机器语言指令,然后打包成一个以.o为扩展明的二进制对象文件(object file),它的内容是机器语言指令而不是字符了。

链接阶段

对象文件生成后并不能直接执行,必须进一步转换成可以执行文件,这时因为我们之前预编译、编译、汇编阶段只是做源代码的汇集、翻译、汇编,这其中程序涉及到的标准库函数调用并没有最终将标准库的函数写入对象文件中,需要进一步的操作才可以,这就是链接阶段的工作。

链接阶段,编译器会把外部函数的代码加入到最重要生成的可执行文件中,这种直接将外部函数在编译阶段加载到可执行文件中的的链接操作叫静态链接,还有动态链接,动态链接是在程序需要调用外部函数库时再加载的链接方法,在我另一篇文章linux下的静态库、动态链接库、动态加载库中有相关介绍。

执行程序

直接在命令行执行程序就可以了,不过需要注意权限问题,根据源程序内容确认是否需要root权限执行即可。没什么其他说的了。

2018.06.30 北京 35°C+的夏天