跳转至

7 Translation into Intermediate Code

7.1 中间表示概述

为什么需要IR?- 使用中间介质简化编译的路径种类:

image-20250403144642172

7.1.1 IR分类:根据抽象层次

不考

image-20250403144832782

image-20250403144817718

image-20250403144912533

方便实现一些比较high level的类型检查

image-20250403145223125

7.1.2 IR分类:根据结构特征

不考

  • 结构化表示 Structural - 基于图的表示 image-20250403145350882
  • 线性表示 Linear - 存储布局是线性的 image-20250403145504383
  • 混合表示 Hybrid image-20250403145556437

7.1.3 三地址码

目标:更接近目标机器的执行模型,例如机器码

特征:以指令为单位,每条指令有限数量的操作码

形式:

image-20250403145801111

实现:

  1. 数据结构
    • 整个三地址指令序列被实现为一个链表数组。这种结构便于动态管理指令。
  2. 四元组(Quadruples)
    • 最常见的实现方式是使用四元组,每个四元组包含四个字段:
      • 操作字段:表示要执行的操作(如加法、减法等)。
      • 地址字段:三个字段用于存储操作数的地址或结果的地址。
  3. 指令示例
    • 对于需要少于三个地址的指令,可以将一个或多个地址字段设置为 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, _, _)
  4. 其他实现方式
    • 如三元组(Triples)和间接三元组(Indirect Triples),这些都是不同的表示方法,适用于不同的需求。

静态单赋值SSA

image-20250403145937848

7.2 树形中间表示

文法:

image-20250403151321669

表示:

image-20250403151348652

MEM(e)在左边就是写,在右边就是取

一些表达式的中间表示的例子:

image-20250403151752494

image-20250403151938706

ESEQ的理解和副作用:

s可能会影响e的结果,导致有时候不可交换

image-20250403152128744

7.3 翻译到IR Trees

一个IR Tree的例子:

image-20250403152645076

7.3.1 exp的翻译

首先我们把exp分为三类:

image-20250403152948627

转换的情况和方式:

image-20250403152936029

7.3.1.1 Simple Variables

访问当前fp内的变量:MEM[ptr地址+偏移量]

image-20250403153407919

// todo : 在其他帧的变量

7.3.1.2 Array and Record Variables

在tiger语言里面的数组赋值规则:

image-20250403153805925

其他语言:

image-20250403153822632

7.3.1.3 Structured L-values

左值是可以被赋值的exp,从某种意义上代表了location

其表达方式为: image-20250403154253941

7.3.1.4