中间代码
树和有向无环图(DAG)
- 高层表示,适用于程序源代码
三地址码(3-address code)
- 低层表示,靠近目标机器
控制流图(CFG)
- 更精细的三地址码,程序的图状表示
- 适合做程序分析。程序优化等
静态单复制形式(SSA)
- 更精细的控制流图
- 同时编码控制流信息和数据流信息
连续传递风格(CPS)
- 更一般的SSA,可以表达跨函数、跨模块的控制跳转,而SSA一般是函数内部
还有很多其他的中间表示。
为什么要划分成不同的中间表示?
(1)编译器工程上的考虑
- 阶段划分:把整个编译过程划分成不同的阶段。
- 任务分解:每个阶段只处理翻译过程的一个步骤。
- 软件工程:代码更容易实现、出错、维护和演进。
(2)程序分析和代码优化的需要
- 两者都和程序的中间表示密切相关,许多优化在特定的中间表示上才可以或才容易进行