主要观点:探讨编译器中间表示(IR)的设计,包括能够仅利用局部信息做决策、控制流图(CFG)、基于寄存器的 IR、静态单赋值(SSA)、延续传递风格(CPS)、类型信息、静态单信息(SSI)、节点海(SoN)、规范具体化等方面,以及这些设计的特点、优势和潜在问题,还提及可能有待探索和发明的其他概念。
关键信息:
- 控制流图将代码分解为基本块和有向边,代表块间跳转,扩展基本块允许每个块有多个控制出口,多数编译器使用普通基本块。
- 基于寄存器的 IR 中指令以命名输入和输出,更易移动,需处理名称定义多次的情况。
- SSA 中每个变量只能定义一次,便于分析,与 CPS 可表示相同程序但各适用于不同语言。
- 类型信息可注释 IR 节点,SSA 存储指令类型信息更易分析,添加类型信息时要问对问题。
- SSI 可在 IR 内部编码新的元数据,通过细化信息来存储,可不用完全 SSI 也获得很多好处,但要注意隐含的执行顺序。
- 节点海将每个指令作为图的顶点,显式表示数据和控制依赖,有“LearnFact”节点等。
- 规范具体化可将操作的完整语义细化到 IR 中让优化器处理,如内联语义等。
重要细节: - 以
sumto
函数为例展示控制流图的构建和转换。 - 说明在不同 IR 形式中指令的操作和数据表示方式。
- 提及各种 IR 设计的相关研究和实践,如 MLton 使用 SSA 等。
- 介绍相关论文和实现,如 Ananian 的论文、Simple 等。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。