代码生成器

2024 年 8 月 28 日 | 阅读 2 分钟

代码生成器用于为三地址语句生成目标代码。它使用寄存器来存储三地址语句的操作数。

示例

考虑三地址语句 x:= y + z。它可能具有以下代码序列

MOV x, R0
         ADD y, R0

寄存器和地址描述符

  • 寄存器描述符包含每个寄存器中当前内容的跟踪。 寄存器描述符显示所有寄存器最初都是空的。
  • 地址描述符用于存储名称的当前值可以在运行时找到的位置。

代码生成算法

该算法将一系列三地址语句作为输入。 对于 a:= b op c 形式的每个三地址语句,执行各种操作。 这些如下

  1. 调用函数 getreg 以找出应存储计算 b op c 的结果的位置 L。
  2. 查阅 y 的地址描述以确定 y'。 如果 y 的值当前在内存和寄存器中,则首选寄存器 y'。 如果 y 的值尚未在 L 中,则生成指令 MOV y' , L 以将 y 的副本放置在 L 中。
  3. 生成指令 OP z' , L,其中 z' 用于显示 z 的当前位置。 如果 z 在两者中,则首选寄存器而不是内存位置。 更新 x 的地址描述符以指示 x 位于位置 L。如果 x 位于 L 中,则更新其描述符并从所有其他描述符中删除 x。
  4. 如果 y 或 z 的当前值没有下一个用途,或者未在块出口处或寄存器中处于活动状态,则更改寄存器描述符以指示在执行 x : = y op z 之后,那些寄存器将不再包含 y 或 z。

为赋值语句生成代码

赋值语句 d:= (a-b) + (a-c) + (a-c) 可以转换为以下三地址代码序列

示例的代码序列如下

语句生成的代码寄存器描述符
寄存器为空
地址描述符
t:= a - bMOV a, R0
SUB b, R0
R0 包含 tt 在 R0 中
u:= a - cMOV a, R1
SUB c, R1
R0 包含 t
R1 包含 u
t 在 R0 中
u 在 R1 中
v:= t + uADD R1, R0R0 包含 v
R1 包含 u
u 在 R1 中
v 在 R1 中
d:= v + uADD R1, R0
MOV R0, d
R0 包含 dd 在 R0 中
d 在 R0 和内存中

下一个主题机器无关