1、预处理
所谓预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所做的工作。当编译一个程序时,系统将自动调用预处理程序对程序中 # 号开头的预处理部分进行处理
头文件展开:将程序中所用的头文件用其内容来替换头文件名。
宏替换:扫描程序中的符号,将其 替换成宏所定义的内容。
去注释:去掉程序中的注释。
条件编译:筛选掉条件编译中的伪命令。
2、编译
这一阶段经过以下处理后在输出文件中,只有常量、变量的定义,以及C语言的关键字:
分析词法分析和语法,在确认所有的指令都符合语法规则之后,将其翻译成等价的中间代码表示或汇编代码。
代码优化:主要是删除公共表达式、循环优化(代码外提、强度削弱、变换循环控制条件、已知量的合并等)、复写传播以及无用赋值的删除,等等。
目标代码优化:最主要的是考虑是如何充分利用机器的各个硬件寄存器存放的有关变量的值,以减少对于内存的访问次数。另外根据机器硬件执行指令的特点(如流水线、RISC、CISC、VLIW等)而对指令进行一些调整使目标代码比较短,执行的效率比较高。
3、汇编
这一阶段是把汇编语言代码翻译成目标机器指令的过程。目标文件中所存放的也就是与源程序等效的目标的机器语言代码。目标文件由段组成。通常一个目标文件中至少有两个段:
代码段:该段中所包含的主要是程序的指令,一般是可读和可执行的,但一般却不可写。
数据段:主要存放程序中要用到的各种全局变量或静态的数据,该段都是可读,可写,可执行的。
4、链接
完成文件中各种调用的函数以及库的连接,并将它们一起打包合并形成可执行文件。