2.1.4 编译、链接和运行

范例2-1和范例2-2在程序代码后面都给出了程序的输出结果,那么,从C程序代码到输出程序结果之间,其过程是怎么样的呢?这个过程需要经历编译、链接和运行三个步骤。

1.编译

编译工作是由编译器完成的。由于C程序代码不能被机器直接认识,因此,首先要将C程序代码转换为机器码。编译过程所做的就是把C程序翻译成机器认识的机器码的过程。这个过程又可以分为预编译、编译阶段、优化阶段和汇编阶段四个部分。

· 预编译也叫预处理,就是在正式编译前所做的工作。C程序中的预处理命令都在这个阶段完成,预编译完成的基本上是对源程序的“替代”工作,例如“#include <stdio.h>”,就是使用文件“stdio.h”的内容替换该命令。

· 编译阶段负责对预编译后的C程序进行词法分析和语法分析,C程序中的词法错误和语法错误会在这里被发现。确认所有语句符合词法规则和语法规则后,编译器把C程序转换为汇编代码或等价的中间代码。

· 为生成更优秀的编译结果,编译器在编译过程中可能会对程序进行一系列优化处理,优化工作在整个编译过程中都可能发生。

· 汇编阶段负责把中间代码或汇编代码翻译成目标机器代码,保存在目标文件中。

2.链接

经过编译后得到的目标文件中的机器码是相互独立的,因此,需要链接器将它们组合在一起,并解析它们之间的交叉引用。C程序如果调用了函数库,这个过程中就会将调用命令与被调用的函数库链接一起。例如,范例2-1中的printf函数,其为C语言标准函数,这个阶段会将调用命令与函数库中的函数相链接。如果找不到调用的目标函数,就会发生链接错误。

3.运行

完成链接后,就可以得到一个可执行文件,可以直接运行。运行后,就可以得到程序结果。如果程序中有屏幕输出的命令,便可以在屏幕上看到打印内容。图2-3描述了从编译到运行的整个流程,同时,该图也是基本的C程序开发流程。

提示:链接错误也有可能是程序外的错误,比如,没有正确包含函数库等。

图2-3 C程序开发流程

当前的C语言开发环境中都集成了以上这三个步骤,大大方便了C语言的开发使用。2.2节将讨论在不同的开发环境中开发C程序。