问题背景
控制流语句中,跳转目标往往在后续代码中才出现(先引用后定义)。
问题:生成跳转指令时目标标号尚未确定。
拉链反填思想
- 先将跳转指令的目标填为待定(链式结构)
- 待目标确定后反填(backpatching)正确的目标地址
重点 拉链反填是实现一遍扫描翻译控制流语句的关键技术。
链结构
- 链头(chain head):指向第一条未填充跳转指令
- 链尾(chain tail):指向最后一条未填充跳转指令
- 每条跳转指令中预留一个字段指向下一条同类跳转指令,形成链表
反填时从链头遍历,依次填入正确的目标地址。
三跳转链
控制流语句翻译涉及三类跳转链:
- 真链(true chain):条件为真时的跳转链
- 假链(false chain):条件为假时的跳转链
- 跳转链(jump chain):无条件跳转链
拉链反填演示
if 语句:if (A > B) X := 1
① (>, A, B, T1)
② JP T1, ________ ; 真链:待填
③ J, ________ ; 假链:待填
④ (:=, 1, _, X)
⑤ 后续代码
- 生成前三条指令时,跳转目标未知
- 遇到 后确定真链应跳转到 ④
- 反填 ② → 目标为 ④
- 假链应跳转到 ⑤(后续代码),反填 ③ → 目标为 ⑤
if-else 语句:if (A > B) X := 1 else Y := 2
① (>, A, B, T1)
② JP T1, ________ ; 真链:待填 → 反填为 ④
③ J, ________ ; 假链:待填 → 反填为 ⑥
④ (:=, 1, _, X)
⑤ J, ________ ; 跳转链:跳过else → 反填为 ⑦
⑥ (:=, 2, _, Y)
⑦ 后续代码
- 真链 ② → 反填 ④
- 假链 ③ → 反填 ⑥
- 跳转链 ⑤(跳过 else 部分)→ 反填 ⑦
while 语句:while (A > B) X := 1
L1: ① (>, A, B, T1)
② JP T1, ________ ; 真链:待填 → 反填为 ④
③ J, ________ ; 假链:待填 → 反填为 ⑤(退出)
④ (:=, 1, _, X)
⑤ J, L1 ; 回到条件判断(已知标号,无需反填)
⑥ 后续代码
- 真链 ② → 反填 ④(进入循环体)
- 假链 ③ → 反填 ⑤(退出循环)
重点 拉链反填次序:先生成链,目标确定后从链头遍历反填。