内容出自编译原理(虎书)
编译器各阶段如下图:
词法分析(Lex):将源文件分解为一个个独立的单词符号;
语法分析(Parse):分析程序的短语结构;
语法动作(Parsing Actions):建立每个短语对应的抽象语法树;
语义分析(Semantic Analysis):;
栈帧布局(Frame Layout):按机器要求的方式将变量、函数参数分配于活动记录(即栈帧)内;
翻译(Translate):生成中间表示树(IR trees),这是一种与任何特定程序设计语言和目标机体系结构无关的表示;
规范化(Canonicalize):提取表达式中的副作用,整理条件分支,以方便下一阶段的处理;
指令选择(Instruction Selection):将IR树节点组合成与目标机指令相对应的块;
控制流分析(Control Flow Analysis):分析指令的顺序并建立控制流图,此图表示程序执行时可能流经的所有控制流;
数据流分析(Data Flow Analysis):收集程序变量的数据流信息,例如活跃分析(liveness analysis),计算每个变量仍需使用其值的地点;
寄存器分配(Register Allocation):为程序中的每个变量和临时数据选择一个寄存器,不在同一点活跃的两个变量;
代码流出(Code Emission):用机器寄存器代替每一条机器指令中出现的临时变量;
汇编器(Assembler):;
链接器(Linker):
这种模块化设计其实是很多真实编译器的典型设计,但是,也有一些编译器把语法分析、语义分析、翻译和规范化合并成一个阶段,还有一些将编译器的指令选择安排在更后一些的位置,并将它与代码流出合并在一起。简单的编译器通常没有专门的控制流分析、数据流分析和寄存器分配。