前言
本篇文章讲述代码到可执行文件的流程概述,该流程主要分为五个阶段
- 源码阶段
- 预处理阶段
- 编译阶段
- 汇编阶段
- 链接阶段
源码阶段
- 源代码
使用编程语言书写代码文件
预处理阶段
- 预处理
代码首先由预处理器
(preprocessor)对 #include 和 #define 进行处理。具体来说,读入头文件,将所有的宏展开,这就是预处理(preprocess)。预处理的英文是 pre- process,就是指的在编译之前进行的处理
编译阶段
语法分析
-
词法分析
将预处理后的源文件分解为一个个独立的单词符号
-
语法分析
分析程序的短语结构
语义分析
-
语义动作
建立每个短语对应的抽象语法树
-
语义分析
确定每个短语的含义,建立变量和其声明的关联,检查表达式的类型,翻译每个短语
生成中间代码
-
栈帧布局
按机器要求的方式将变量、函数参数等分配于活跃记录(即栈帧)内 -
翻译
生成中间表示树(IR树),这是一种与任何特定程序设计语言和目标机器体系结构无关的表示 -
规范化
提取表达式中的副作用,整理条件分支,以方便下一阶段的处理
代码生成
-
指令选择
将IR树结点结合成与目标指令相对应的块 -
控制流分析
分析指令的顺序并建立控制流图,此图表示程序执行时可能流经的所有控制流 -
数据流分析
收集程序变量的数据流信息 -
寄存器分配
为程序中的每一个变量和临时数据分配一个寄存器,不在同一点活跃的两个变量可以共享一个寄存器 -
代码流出
用机器寄存器替代每一条机器指令中出现的临时变量名,这一阶段完成后,生成汇编代码
汇编阶段
- 汇编
使用汇编器
将汇编代码编程成机器代码文件,生成可重定位代码文件
链接阶段
- 链接
使用链接器
将可重定位代码文件链接到一起,生成可执行文件或者库文件。