7 Translation into Intermediate Code¶
7.1 中间表示概述¶
为什么需要IR?- 使用中间介质简化编译的路径种类:
7.1.1 IR分类:根据抽象层次¶
不考
方便实现一些比较high level的类型检查
7.1.2 IR分类:根据结构特征¶
不考
- 结构化表示 Structural - 基于图的表示
- 线性表示 Linear - 存储布局是线性的
- 混合表示 Hybrid
7.1.3 三地址码¶
目标:更接近目标机器的执行模型,例如机器码
特征:以指令为单位,每条指令有限数量的操作码
形式:
实现:
- 数据结构:
- 整个三地址指令序列被实现为一个链表数组。这种结构便于动态管理指令。
- 四元组(Quadruples):
- 最常见的实现方式是使用四元组,每个四元组包含四个字段:
- 操作字段:表示要执行的操作(如加法、减法等)。
- 地址字段:三个字段用于存储操作数的地址或结果的地址。
- 最常见的实现方式是使用四元组,每个四元组包含四个字段:
- 指令示例:
- 对于需要少于三个地址的指令,可以将一个或多个地址字段设置为 null 或“空”值。例如:
t1 = x > 0
可以表示为(gt, x, 0, t1)
。if_false t1 goto L1
可以表示为(if_f, t1, L1, _)
。fact = 1
可以表示为(asn, 1, fact, _)
。label L2
可以表示为(lab, L2, _, _)
。
- 对于需要少于三个地址的指令,可以将一个或多个地址字段设置为 null 或“空”值。例如:
- 其他实现方式:
- 如三元组(Triples)和间接三元组(Indirect Triples),这些都是不同的表示方法,适用于不同的需求。
静态单赋值SSA
7.2 树形中间表示¶
文法:
表示:
MEM(e)
在左边就是写,在右边就是取
一些表达式的中间表示的例子:
ESEQ的理解和副作用:
s
可能会影响e
的结果,导致有时候不可交换
7.3 翻译到IR Trees¶
一个IR Tree的例子:
7.3.1 exp的翻译¶
首先我们把exp分为三类:
转换的情况和方式:
7.3.1.1 Simple Variables¶
访问当前fp
内的变量:MEM[ptr地址+偏移量]
// todo : 在其他帧的变量
7.3.1.2 Array and Record Variables¶
在tiger语言里面的数组赋值规则:
其他语言:
7.3.1.3 Structured L-values¶
左值是可以被赋值的exp,从某种意义上代表了location
其表达方式为: