1.4 C程序变成EXE文件的过程——编译、连接和执行
本章前面已经编写了一些如代码1-1和代码1-2的程序。所谓程序,就是一组让计算机能识别和执行的命令。每一条指令使计算机执行特定的操作。用高级语言(如C)编写的程序称为“源程序”。计算机只能识别和执行由0和1组成的二进制指令,而不能识别和执行高级语言写的指令。为了使计算机能够执行编写好的程序,必须先把源程序编译成计算机内部能够认识的语言,也就是“二进制”形式的“目标程序”,然后将该目标程序与计算机系统内部的库函数或者还有其他目标程序连接起来,形成最终想要的可执行的目标程序。因此C语言编写的源代码经过“预编译→编译→汇编→连接”几个步骤最终生成可执行文件(也就是Windows平台上的应用程序),如图1-15所示。
图1-15 C程序的编译过程
1.编译预处理
读取源程序,把源代码中的“宏”展开并把包含文件的源代码插入程序的源代码中。预编译程序所完成的基本上是对源程序的“替代”工作。经过此种替代,生成一个没有宏定义、没有条件编译指令、没有特殊符号的输出文件。这个文件的含义同没有经过预处理的源文件是相同的,但内容有所不同。下一步,此输出文件将作为编译程序的输出而被翻译成机器指令。
2.编译阶段
经过预编译得到的输出文件中,将只有常量。如数字、字符串、变量的定义,以及C语言的关键字,如main,if,else,for,while,{,},+,-,*,\,等。预编译程序所要做的工作就是通过代码中的词法跟语法进行,在确认所有的指令都符合语法规则之后,再将其翻译成等价的中间代码表示或汇编代码。
注意:经过编译的文件已经比预处理后的文件小了很多,去除了很多不必要的东西,比如说没用到的类型声明和函数声明等。
3.汇编过程
汇编过程实际上指把汇编语言代码翻译成目标机器指令的过程。对于被翻译系统处理的每一个C语言源程序,都将最终经过这一处理而得到相应的目标文件。目标文件中所存放的也就是与源程序等效的目标的机器语言代码。
4.连接过程
把目标代码和二进制的库文件及其他内容合并成最终的可执行文件。
通常,C程序在编译和执行过程中有四个不同的文件与其关联。
(1)源程序。是用户创建的文件,这类文件以“.c”为文件扩展名保存。
(2)头文件。含有函数的声明和预处理语句,用于帮助访问主函数外部定义的函数。头文件的扩展名为“.h”。
(3)目标文件。是编译器的输出结果。虽然这些文件为二进制格式,但是它们自己无法执行。这类文件的常见扩展名为“.o”或“.obj”。
(4)二进制可执行文件。是连接过程的输出结果。连接器是用于链接多个目标文件以创建二进制可执行文件的程序。二进制可执行文件的扩展名为“.exe”。
也许现在对本节的内容不大理解,不要着急,1.5节将用实例演示C程序的编译和运行。