一个源程序运行得到结果一般都要经过编译和执行的过程,C语言的编译和执行过程如下:
编译的过程:
编译的功能是将人们能看懂的高级语言,转换成计算机能看懂的二进制语言,可以分为下面的六个阶段:
- 词法分析阶段:根据语言的词法规则来进行分析,词法的规则可用正规文法或正规式来表示是指有限自动机能识别正规文法的语言和正规式组成的集合。
- 语法分析阶段:在词法分析的基础上将单词分别分解成各类语法单位,它依据语言的语法规则对源程序结构进行分析。
- 语义分析阶段:检查代码是否有语义错误,为代码生成阶段做准备。
- 中间代码生成阶段:经过上边述阶段后,会生成一个中间代码,即把源程序转化为一种内部的记号语言,这一阶段依据的是中间代码生成规则。
- 代码优化阶段:对中间代码进行改造和优化,使得代码节省时间和空间,提高执行效率。
- 目标代码生成阶段:把中间代码转化为机器上的指令代码,生成的目标代码与机器的硬件和系统有关。
一个源文件经过上述的6个过程即可转化成目标代码文件,把高级语言转化成机器语言。
C语言编译的完整过程如下图:
1、编译预处理
处理伪指令和特殊符号。伪指令一般指以“#”为开头的指令,包含以下四个方面:
(1)宏定义指令
宏定义又称为宏替换,指用一个表达式替换另一个式子,简称为宏。
(2)条件指令
条件指令可以使程序员通过定义不同的宏自由控制程序代码的执行,执行哪些代码,跳过哪些代码。预编译处理会将那些多余的代码去掉。
(3)头文件指令
如#include<stdio.h>
,是指把相应的头文件包含至程序中,包含头文件是为了包含头文件中系统定义的函数,以便程序直接调用。
(4)特殊符号
预编译的时候会检测有无特殊符号,如LINE和FILE都被当做特殊符号处理,用适当的值来代替。
源文件经过预编译处理后会变成一个没有宏定义、头文件、条件指令和特殊符号的文件,这个文件与源文件的功能是一样的但是内容有所改变。
2、编译和优化
编译:把预编译得到的文件进行词法、语法、语义分析等,使之转化为功能等价的中间代码或者汇编代码。
优化:对代码进行优化,减小代码的时间和空间,提高执行效率。
3、汇编程序
一个程序要执行必须转化成机器语言,汇编程序是将汇编代码转化成机器代码,即机器所能识别的代码。
4、链接程序
链接程序把彼此有关的目标文件都联系起来,即把这些文件都联系成一个统一的整体转入机器的内存中,是目标文件能够相互调用。