编译器的各阶段
序号 | 阶段 | 描述 |
1 | 词法分析 | 将源文件分解为一个个独立的单词符号 |
2 | 语法分析 | 分析程序的短语结构 |
3 | 语义动作 | 建立每个短语对应的抽象语法树 |
4 | 语义分析 | 确定每个短语的含义,建立变量和其声明的关联,检查表达式的类型,翻译每个短语 |
5 | 栈帧布局 | 按机器要求的方式将变量,函数参数等分配于活跃的记录(即栈帧)内 |
6 | 翻译 | 生成中间表示树(IR树),这是一种与任何特定程序设计语言和目标机器体系结构无关的表示 |
7 | 规范化 | 提取表达式中的副作用,整理条件分支,以方便下一阶段的处理 |
8 | 指令选择 | 将IR树节点组合成与目标机器指令相对应的块 |
9 | 控制流分析 | 分析指令的顺序并建立控制流程图,此图表示程序执行时可能流经的所用控制流 |
9 | 数据流分析 | 收集程序变量的数据流信息,例如,活跃分析(liveness analysis)计算每一个变量仍需要使用其值的地点(即他的活跃点) |
10 | 寄存器分配 | 为程序中每一个变量和临时数据选择一个寄存器,不在同一个活跃的两个变量可以共享同一个寄存器 |
11 | 代码流出 | 用机器寄存器替代每一条机器指令中出现的临时变量名 |