第7章 翻译成中间代码

把Tiger表达式、声明和控制流翻译成规范树形中间表示;用C编译流水线、状态轨迹和端到端验证门交付AST—IR映射、临时变量、标签、控制边与副作用计数

学习目标

  • 能说明“第7章 翻译成中间代码”如何把Tiger表达式、声明和控制流翻译成规范树形中间表示,并区分作者C/Java/ML轨道、中文C版与本站重写
  • 能先预测“值、语句和条件三类翻译结果怎样组合而不重复副作用?”会改变哪一个C接口、树/图状态、AST/IR、汇编或运行结果,再操作三类交互证据
  • 能只注入“把带副作用表达式复制进两个IR位置,运行时执行两次”,定位首个偏离“第7章 翻译成中间代码的C模块接口、数据结构、状态变换、输出语义与测试始终一致”的状态,并从同一快照完成恢复

为什么从这个问题开始

“第7章 翻译成中间代码”围绕“值、语句和条件三类翻译结果怎样组合而不重复副作用?”建立贯穿任务:在Tiger C实现轨道中复现“第7章 翻译成中间代码”的输入、状态、变换与验证。先写下哪个C接口、树/图状态、AST/IR、汇编或运行结果会最先变化,再运行参考、故障和恢复路径;运行后补理由不算预测。只有守住“第7章 翻译成中间代码的C模块接口、数据结构、状态变换、输出语义与测试始终一致”并交付AST—IR映射、临时变量、标签、控制边与副作用计数,单模块测试、编译成功或性能变化才构成机制证据。

原版书目、296个正式坐标与C轨道边界

“第7章 翻译成中间代码”以Andrew W. Appel作者官方目录核对 Modern Compiler Implementation 的C、Java、ML三种实现轨道、2部分、21章和Tiger语言附录;以作者C版页面核对Andrew·W·Appel与Maia Ginsburg、Cambridge University Press、C实现轨道、平装ISBN 0-521-60765-5、软件/练习模块与勘误入口,再以Cambridge C版页面核对原版身份。

“第7章 翻译成中间代码”以中文版修订版完整目录核对赵克佳、黄春、沈志宇译《现代编译原理:C语言描述(修订版)》,人民邮电出版社,2018年,385页,ISBN 9787115476883。“第7章 翻译成中间代码”的正式分母为2个部分标题、21个章标题、1个附录标题、251个编号节/小节、附录4节和17个正式“程序设计”项目,合计296个核心层级;每章重复的推荐阅读与习题不另计。

作者页面可访问不等于允许复制书稿,“第7章 翻译成中间代码”不复制、翻译或改写原文、图表、伪码与习题;所有中文讲解、C接口示意、状态轨迹、反例、交互、练习和答案均为独立教学重写。本页独立核对 1本页独立核对 2只用于核对本页C实现或现代IR边界,不能混入Java/ML轨道或反向证明原书采用本站表述。

原版目录层级与C项目机制

第7章 翻译成中间代码

正式坐标 1/22。 原版目录键 第7章 翻译成中间代码。在“第7章 翻译成中间代码”的第1个正式坐标中,「第7章 翻译成中间代码」通过把Tiger AST降到规范树IR、基本块和可调度控制流推进Tiger AST、树IR与副作用;复核者保存AST—IR映射、临时变量、标签、CFG、规范化与差分执行,出现副作用重复、标签错连或轨迹调度破坏控制语义就撤回结论。

7·1 中间表示树

正式坐标 2/22。 原版目录键 7.1 中间表示树。围绕“值、语句和条件三类翻译结果怎样组合而不重复副作用?”,“第7章 翻译成中间代码”在坐标2把「7·1 中间表示树」落实为把Tiger AST降到规范树IR、基本块和可调度控制流;只有AST—IR映射、临时变量、标签、CFG、规范化与差分执行可重放且反例排除副作用重复、标签错连或轨迹调度破坏控制语义,本节点才算掌握。

7·2 翻译为树中间语言

正式坐标 3/22。 原版目录键 7.2 翻译为树中间语言。“第7章 翻译成中间代码”的目录节点3「7·2 翻译为树中间语言」不能停在术语或伪码:它要把Tiger AST降到规范树IR、基本块和可调度控制流,交付AST—IR映射、临时变量、标签、CFG、规范化与差分执行,并把副作用重复、标签错连或轨迹调度破坏控制语义设为单一反事实。

7·2·1 表达式的种类

正式坐标 4/22。 原版目录键 7.2.1 表达式的种类。对“第7章 翻译成中间代码”而言,「7·2·1 表达式的种类」在第4次检查中改变可观察状态,因为它负责把对象布局、动态分派或闭包环境与调用约定降到IR;类/vtable布局、自由变量、闭包对象、调用和求值轨迹必须与“第7章 翻译成中间代码的C模块接口、数据结构、状态变换、输出语义与测试始终一致”对齐,不能接受对象偏移、自由变量、环境槽或求值策略错误。

7·2·2 简单变量

正式坐标 5/22。 原版目录键 7.2.2 简单变量。在“第7章 翻译成中间代码”的第5个正式坐标中,「7·2·2 简单变量」通过把语言规则映射到测试、AST、类型、IR、运行时和诊断推进Tiger AST、树IR与副作用;复核者保存规则—测试矩阵、AST/类型/IR快照、运行结果与诊断,出现语言规范、内建签名与编译器实现不一致就撤回结论。

7·2·3 追随静态链

正式坐标 6/22。 原版目录键 7.2.3 追随静态链。围绕“值、语句和条件三类翻译结果怎样组合而不重复副作用?”,“第7章 翻译成中间代码”在坐标6把「7·2·3 追随静态链」落实为决定变量逃逸、帧布局、静态链和过程调用/返回序列;只有逃逸集合、帧布局、调用序列、地址与寄存器轨迹可重放且反例排除捕获变量生命周期、参数位置或调用约定不一致,本节点才算掌握。

7·2·4 数组变量

正式坐标 7/22。 原版目录键 7.2.4 数组变量。“第7章 翻译成中间代码”的目录节点7「7·2·4 数组变量」不能停在术语或伪码:它要把语言规则映射到测试、AST、类型、IR、运行时和诊断,交付规则—测试矩阵、AST/类型/IR快照、运行结果与诊断,并把语言规范、内建签名与编译器实现不一致设为单一反事实。

7·2·5 结构化的左值

正式坐标 8/22。 原版目录键 7.2.5 结构化的左值。对“第7章 翻译成中间代码”而言,「7·2·5 结构化的左值」在第8次检查中改变可观察状态,因为它负责把“结构化的左值”放进Tiger AST、树IR与副作用的C接口—状态—变换—验证链;第7章 翻译成中间代码的输入角色、中间状态、输出、反例与整合证据必须与“第7章 翻译成中间代码的C模块接口、数据结构、状态变换、输出语义与测试始终一致”对齐,不能接受只复述“结构化的左值”名称而没有可观察状态、项目实现和恢复验证。

7·2·6 下标和域选择

正式坐标 9/22。 原版目录键 7.2.6 下标和域选择。在“第7章 翻译成中间代码”的第9个正式坐标中,「7·2·6 下标和域选择」通过把“下标和域选择”放进Tiger AST、树IR与副作用的C接口—状态—变换—验证链推进Tiger AST、树IR与副作用;复核者保存第7章 翻译成中间代码的输入角色、中间状态、输出、反例与整合证据,出现只复述“下标和域选择”名称而没有可观察状态、项目实现和恢复验证就撤回结论。

7·2·7 关于安全性的劝告

正式坐标 10/22。 原版目录键 7.2.7 关于安全性的劝告。围绕“值、语句和条件三类翻译结果怎样组合而不重复副作用?”,“第7章 翻译成中间代码”在坐标10把「7·2·7 关于安全性的劝告」落实为把“关于安全性的劝告”放进Tiger AST、树IR与副作用的C接口—状态—变换—验证链;只有第7章 翻译成中间代码的输入角色、中间状态、输出、反例与整合证据可重放且反例排除只复述“关于安全性的劝告”名称而没有可观察状态、项目实现和恢复验证,本节点才算掌握。

7·2·8 算术操作

正式坐标 11/22。 原版目录键 7.2.8 算术操作。“第7章 翻译成中间代码”的目录节点11「7·2·8 算术操作」不能停在术语或伪码:它要把“算术操作”放进Tiger AST、树IR与副作用的C接口—状态—变换—验证链,交付第7章 翻译成中间代码的输入角色、中间状态、输出、反例与整合证据,并把只复述“算术操作”名称而没有可观察状态、项目实现和恢复验证设为单一反事实。

7·2·9 条件表达式

正式坐标 12/22。 原版目录键 7.2.9 条件表达式。对“第7章 翻译成中间代码”而言,「7·2·9 条件表达式」在第12次检查中改变可观察状态,因为它负责把语言规则映射到测试、AST、类型、IR、运行时和诊断;规则—测试矩阵、AST/类型/IR快照、运行结果与诊断必须与“第7章 翻译成中间代码的C模块接口、数据结构、状态变换、输出语义与测试始终一致”对齐,不能接受语言规范、内建签名与编译器实现不一致。

7·2·10 字符串

正式坐标 13/22。 原版目录键 7.2.10 字符串。在“第7章 翻译成中间代码”的第13个正式坐标中,「7·2·10 字符串」通过把“字符串”放进Tiger AST、树IR与副作用的C接口—状态—变换—验证链推进Tiger AST、树IR与副作用;复核者保存第7章 翻译成中间代码的输入角色、中间状态、输出、反例与整合证据,出现只复述“字符串”名称而没有可观察状态、项目实现和恢复验证就撤回结论。

7·2·11 记录和数组的创建

正式坐标 14/22。 原版目录键 7.2.11 记录和数组的创建。围绕“值、语句和条件三类翻译结果怎样组合而不重复副作用?”,“第7章 翻译成中间代码”在坐标14把「7·2·11 记录和数组的创建」落实为把“记录和数组的创建”放进Tiger AST、树IR与副作用的C接口—状态—变换—验证链;只有第7章 翻译成中间代码的输入角色、中间状态、输出、反例与整合证据可重放且反例排除只复述“记录和数组的创建”名称而没有可观察状态、项目实现和恢复验证,本节点才算掌握。

7·2·12 while循环

正式坐标 15/22。 原版目录键 7.2.12 while循环。“第7章 翻译成中间代码”的目录节点15「7·2·12 while循环」不能停在术语或伪码:它要求解数据流与支配关系并证明优化/SSA变换保语义,交付固定点、支配树、phi放置、重命名、循环森林与前后IR,并把别名、溢出、关键边或跨迭代依赖被忽略设为单一反事实。

7·2·13 for循环

正式坐标 16/22。 原版目录键 7.2.13 for循环。对“第7章 翻译成中间代码”而言,「7·2·13 for循环」在第16次检查中改变可观察状态,因为它负责求解数据流与支配关系并证明优化/SSA变换保语义;固定点、支配树、phi放置、重命名、循环森林与前后IR必须与“第7章 翻译成中间代码的C模块接口、数据结构、状态变换、输出语义与测试始终一致”对齐,不能接受别名、溢出、关键边或跨迭代依赖被忽略。

7·2·14 函数调用

正式坐标 17/22。 原版目录键 7.2.14 函数调用。在“第7章 翻译成中间代码”的第17个正式坐标中,「7·2·14 函数调用」通过把“函数调用”放进Tiger AST、树IR与副作用的C接口—状态—变换—验证链推进Tiger AST、树IR与副作用;复核者保存第7章 翻译成中间代码的输入角色、中间状态、输出、反例与整合证据,出现只复述“函数调用”名称而没有可观察状态、项目实现和恢复验证就撤回结论。

7·3 声明

正式坐标 18/22。 原版目录键 7.3 声明。围绕“值、语句和条件三类翻译结果怎样组合而不重复副作用?”,“第7章 翻译成中间代码”在坐标18把「7·3 声明」落实为构造带源位置AST并沿作用域环境执行名字绑定和类型检查;只有CST—AST映射、环境快照、类型推导、错误路径与作用域恢复可重放且反例排除节点语义、绑定顺序、类型约束或作用域恢复错位,本节点才算掌握。

7·3·1 变量定义

正式坐标 19/22。 原版目录键 7.3.1 变量定义。“第7章 翻译成中间代码”的目录节点19「7·3·1 变量定义」不能停在术语或伪码:它要把语言规则映射到测试、AST、类型、IR、运行时和诊断,交付规则—测试矩阵、AST/类型/IR快照、运行结果与诊断,并把语言规范、内建签名与编译器实现不一致设为单一反事实。

7·3·2 函数定义

正式坐标 20/22。 原版目录键 7.3.2 函数定义。对“第7章 翻译成中间代码”而言,「7·3·2 函数定义」在第20次检查中改变可观察状态,因为它负责把“函数定义”放进Tiger AST、树IR与副作用的C接口—状态—变换—验证链;第7章 翻译成中间代码的输入角色、中间状态、输出、反例与整合证据必须与“第7章 翻译成中间代码的C模块接口、数据结构、状态变换、输出语义与测试始终一致”对齐,不能接受只复述“函数定义”名称而没有可观察状态、项目实现和恢复验证。

7·3·3 片段

正式坐标 21/22。 原版目录键 7.3.3 片段。在“第7章 翻译成中间代码”的第21个正式坐标中,「7·3·3 片段」通过把“片段”放进Tiger AST、树IR与副作用的C接口—状态—变换—验证链推进Tiger AST、树IR与副作用;复核者保存第7章 翻译成中间代码的输入角色、中间状态、输出、反例与整合证据,出现只复述“片段”名称而没有可观察状态、项目实现和恢复验证就撤回结论。

程序设计:翻译成树

正式坐标 22/22。 原版目录键 程序设计:翻译成树。围绕“值、语句和条件三类翻译结果怎样组合而不重复副作用?”,“第7章 翻译成中间代码”在坐标22把「程序设计:翻译成树」落实为把Tiger AST降到规范树IR、基本块和可调度控制流;只有AST—IR映射、临时变量、标签、CFG、规范化与差分执行可重放且反例排除副作用重复、标签错连或轨迹调度破坏控制语义,本节点才算掌握。

先预测,再操作三个C轨道实验

分步1 / 3

1. C模块、输入与翻译流水线

为“第7章 翻译成中间代码”选择正式目录坐标,在参考流水线与单一故障间切换,逐阶段核对接口、状态、输出和不变量。

输入—表示—翻译流水线

第7章 翻译成中间代码

选择正式目录坐标,再比较参考编译合同与单一故障的首个状态分岔。

阶段 1/4

第7章 翻译成中间代码 · C模块与输入

输入
在Tiger C实现轨道中复现“第7章 翻译成中间代码”的输入、状态、变换与验证
变换
冻结Tiger AST、树IR与副作用所需的C接口、源程序、规则、数据结构和版本
输出证据
第7章 翻译成中间代码的模块合同、输入快照与所有权表
不变量检查
第7章 翻译成中间代码的类型、所有权、源位置、名字和接口布局没有错位

第7章 翻译成中间代码的可重放协议

阶段允许动作必留证据拒绝条件
第7章 翻译成中间代码 · C模块与输入冻结Tiger AST、树IR与副作用所需的C接口、源程序、规则、数据结构和版本第7章 翻译成中间代码的模块合同、输入快照与所有权表未满足“第7章 翻译成中间代码的类型、所有权、源位置、名字和接口布局没有错位”
第7章 翻译成中间代码 · 算法与状态执行把Tiger表达式、声明和控制流翻译成规范树形中间表示的最小算法并保存每一步状态第7章 翻译成中间代码的参考轨迹、故障轨迹与首个状态分岔未满足“第7章 翻译成中间代码每一步可由同一C接口、输入、规则和执行顺序复算”
第7章 翻译成中间代码 · 输出与整合比较变换前后AST/IR/汇编/运行时状态和跨模块传递第7章 翻译成中间代码的前后差、接口谱系与恢复路径未满足“第7章 翻译成中间代码没有把单模块通过或单一样例正确当作端到端正确性”
第7章 翻译成中间代码 · 独立验证重放预测、单故障、恢复和不适用边界第7章 翻译成中间代码的接受、回退或拒绝理由未满足“第7章 翻译成中间代码满足“第7章 翻译成中间代码的C模块接口、数据结构、状态变换、输出语义与测试始终一致””
unit: "tbc-unit-07"
question: "值、语句和条件三类翻译结果怎样组合而不重复副作用?"
scenario: "在Tiger C实现轨道中复现“第7章 翻译成中间代码”的输入、状态、变换与验证"
invariant: "第7章 翻译成中间代码的C模块接口、数据结构、状态变换、输出语义与测试始终一致"
fault: "把带副作用表达式复制进两个IR位置,运行时执行两次"
evidence: "AST—IR映射、临时变量、标签、控制边与副作用计数"
reset: restore_concept_mode_stage_trace_step_case_gates_and_artifact

“第7章 翻译成中间代码”要求从同一C接口、源程序、规则、数据结构、目标机、预算和执行顺序重放参考、故障与恢复路径。重置后若目录选择、模式、阶段、轨迹步骤、案例、证据门或交付包没有回到基线,本次比较已经混入状态泄漏。

本页回顾

掌握“第7章 翻译成中间代码”不是背术语、表格或伪码,而是围绕“值、语句和条件三类翻译结果怎样组合而不重复副作用?”重建C接口、输入、状态变换、输出、整合和端到端验证,并用“第7章 翻译成中间代码的C模块接口、数据结构、状态变换、输出语义与测试始终一致”拒绝“把带副作用表达式复制进两个IR位置,运行时执行两次”。最终交付为AST—IR映射、临时变量、标签、控制边与副作用计数。

练习与答案

练习

  1. 问题 1:C实现合同。 “第7章 翻译成中间代码”为什么必须先冻结C接口、源程序、规则、数据结构、目标机和验证口径?
  1. 问题 2:目录逐项覆盖。 怎样证明“第7章 翻译成中间代码”的正式目录坐标已经进入机制、交互和程序设计项目?
  1. 问题 3:故障恢复。 怎样证明“把带副作用表达式复制进两个IR位置,运行时执行两次”已经被修正?

名词解释

名词解释

本章出现的专业名词,用大白话再讲一遍。

翻译成中间代码

检索键 tbc-A 对应正式目录坐标「第7章 翻译成中间代码」;在“第7章 翻译成中间代码”中用于把Tiger AST降到规范树IR、基本块和可调度控制流,需要连接C轨道范围、状态轨迹、整合证据和不适用边界。

中间表示树

检索键 tbc-B 对应正式目录坐标「7·1 中间表示树」;在“第7章 翻译成中间代码”中用于把Tiger AST降到规范树IR、基本块和可调度控制流,需要连接C轨道范围、状态轨迹、整合证据和不适用边界。

翻译为树中间语言

检索键 tbc-C 对应正式目录坐标「7·2 翻译为树中间语言」;在“第7章 翻译成中间代码”中用于把Tiger AST降到规范树IR、基本块和可调度控制流,需要连接C轨道范围、状态轨迹、整合证据和不适用边界。

表达式的种类

检索键 tbc-D 对应正式目录坐标「7·2·1 表达式的种类」;在“第7章 翻译成中间代码”中用于把对象布局、动态分派或闭包环境与调用约定降到IR,需要连接C轨道范围、状态轨迹、整合证据和不适用边界。

简单变量

检索键 tbc-E 对应正式目录坐标「7·2·2 简单变量」;在“第7章 翻译成中间代码”中用于把语言规则映射到测试、AST、类型、IR、运行时和诊断,需要连接C轨道范围、状态轨迹、整合证据和不适用边界。

追随静态链

检索键 tbc-F 对应正式目录坐标「7·2·3 追随静态链」;在“第7章 翻译成中间代码”中用于决定变量逃逸、帧布局、静态链和过程调用/返回序列,需要连接C轨道范围、状态轨迹、整合证据和不适用边界。

数组变量

检索键 tbc-G 对应正式目录坐标「7·2·4 数组变量」;在“第7章 翻译成中间代码”中用于把语言规则映射到测试、AST、类型、IR、运行时和诊断,需要连接C轨道范围、状态轨迹、整合证据和不适用边界。

结构化的左值

检索键 tbc-H 对应正式目录坐标「7·2·5 结构化的左值」;在“第7章 翻译成中间代码”中用于把“结构化的左值”放进Tiger AST、树IR与副作用的C接口—状态—变换—验证链,需要连接C轨道范围、状态轨迹、整合证据和不适用边界。

下标和域选择

检索键 tbc-I 对应正式目录坐标「7·2·6 下标和域选择」;在“第7章 翻译成中间代码”中用于把“下标和域选择”放进Tiger AST、树IR与副作用的C接口—状态—变换—验证链,需要连接C轨道范围、状态轨迹、整合证据和不适用边界。

关于安全性的劝告

检索键 tbc-J 对应正式目录坐标「7·2·7 关于安全性的劝告」;在“第7章 翻译成中间代码”中用于把“关于安全性的劝告”放进Tiger AST、树IR与副作用的C接口—状态—变换—验证链,需要连接C轨道范围、状态轨迹、整合证据和不适用边界。

算术操作

检索键 tbc-K 对应正式目录坐标「7·2·8 算术操作」;在“第7章 翻译成中间代码”中用于把“算术操作”放进Tiger AST、树IR与副作用的C接口—状态—变换—验证链,需要连接C轨道范围、状态轨迹、整合证据和不适用边界。

条件表达式

检索键 tbc-L 对应正式目录坐标「7·2·9 条件表达式」;在“第7章 翻译成中间代码”中用于把语言规则映射到测试、AST、类型、IR、运行时和诊断,需要连接C轨道范围、状态轨迹、整合证据和不适用边界。

字符串

检索键 tbc-M 对应正式目录坐标「7·2·10 字符串」;在“第7章 翻译成中间代码”中用于把“字符串”放进Tiger AST、树IR与副作用的C接口—状态—变换—验证链,需要连接C轨道范围、状态轨迹、整合证据和不适用边界。

记录和数组的创建

检索键 tbc-N 对应正式目录坐标「7·2·11 记录和数组的创建」;在“第7章 翻译成中间代码”中用于把“记录和数组的创建”放进Tiger AST、树IR与副作用的C接口—状态—变换—验证链,需要连接C轨道范围、状态轨迹、整合证据和不适用边界。

while循环

检索键 tbc-O 对应正式目录坐标「7·2·12 while循环」;在“第7章 翻译成中间代码”中用于求解数据流与支配关系并证明优化/SSA变换保语义,需要连接C轨道范围、状态轨迹、整合证据和不适用边界。

for循环

检索键 tbc-P 对应正式目录坐标「7·2·13 for循环」;在“第7章 翻译成中间代码”中用于求解数据流与支配关系并证明优化/SSA变换保语义,需要连接C轨道范围、状态轨迹、整合证据和不适用边界。

函数调用

检索键 tbc-Q 对应正式目录坐标「7·2·14 函数调用」;在“第7章 翻译成中间代码”中用于把“函数调用”放进Tiger AST、树IR与副作用的C接口—状态—变换—验证链,需要连接C轨道范围、状态轨迹、整合证据和不适用边界。

声明

检索键 tbc-R 对应正式目录坐标「7·3 声明」;在“第7章 翻译成中间代码”中用于构造带源位置AST并沿作用域环境执行名字绑定和类型检查,需要连接C轨道范围、状态轨迹、整合证据和不适用边界。

变量定义

检索键 tbc-S 对应正式目录坐标「7·3·1 变量定义」;在“第7章 翻译成中间代码”中用于把语言规则映射到测试、AST、类型、IR、运行时和诊断,需要连接C轨道范围、状态轨迹、整合证据和不适用边界。

函数定义

检索键 tbc-T 对应正式目录坐标「7·3·2 函数定义」;在“第7章 翻译成中间代码”中用于把“函数定义”放进Tiger AST、树IR与副作用的C接口—状态—变换—验证链,需要连接C轨道范围、状态轨迹、整合证据和不适用边界。

片段

检索键 tbc-U 对应正式目录坐标「7·3·3 片段」;在“第7章 翻译成中间代码”中用于把“片段”放进Tiger AST、树IR与副作用的C接口—状态—变换—验证链,需要连接C轨道范围、状态轨迹、整合证据和不适用边界。

翻译成树

检索键 tbc-V 对应正式目录坐标「程序设计:翻译成树」;在“第7章 翻译成中间代码”中用于把Tiger AST降到规范树IR、基本块和可调度控制流,需要连接C轨道范围、状态轨迹、整合证据和不适用边界。

讨论

评论区加载中…