第8章 代码生成
从目标机、基本块、DAG、局部优化、寄存器分配、指令选择和动态规划生成目标代码;用编译流水线、状态轨迹和等价性验证门交付基本块DAG、活跃区间、干涉图、指令匹配与目标执行对照
学习目标
- 能说明“第8章 代码生成”如何从目标机、基本块、DAG、局部优化、寄存器分配、指令选择和动态规划生成目标代码,并区分Pearson英文第二版、中文译本、现代工具和本站重写
- 能先预测“IR操作怎样在寄存器、内存和目标指令之间满足语义与代价约束?”会改变哪一个输入、表示、栈/图状态、IR、目标代码或验证结果,再操作三类交互证据
- 能只注入“窥孔删除看似冗余的存储,却忽略别名指针随后读取该内存”,定位首个偏离“定义—使用、活跃区间、寄存器类、调用约定、内存别名和代价模型一致”的状态,并从同一快照完成恢复
为什么从这个问题开始
“第8章 代码生成”围绕“IR操作怎样在寄存器、内存和目标指令之间满足语义与代价约束?”建立贯穿任务:为一个基本块执行指令选择、寄存器分配、溢出和窥孔优化。先写下哪个输入、表示、栈/图状态、IR、目标代码或验证结果会最先变化,再运行参考、故障和恢复路径;运行后补理由不算预测。只有守住“定义—使用、活跃区间、寄存器类、调用约定、内存别名和代价模型一致”并交付基本块DAG、活跃区间、干涉图、指令匹配与目标执行对照,编译成功、分析收敛、目标码长度或基准加速才构成机制证据。
原版书目、556个正式坐标与访问边界
“第8章 代码生成”以Pearson官方书页核对Alfred V. Aho、Monica S. Lam、Ravi Sethi、Jeffrey D. Ullman著 Compilers: Principles, Techniques, and Tools, Second Edition:英文精装ISBN 9780321486813,2006年版;Pearson明确列出12章与两个附录,并说明第10章“指令级并行”、第11章“并行与局部性优化”、第12章“过程间分析”是第二版新增重点。Pearson官方目录继续核对版本与章/附录框架。
“第8章 代码生成”再以中文版完整目录与高校馆藏书目核对赵建华、郑滔、戴新宇译《编译原理(第2版)》,机械工业出版社,2009年,631页,ISBN 9787111251217。正式分母计入12个章标题、2个附录标题、533个数字编号节/小节和附录A的9个编号节,合计556个核心目录层级;章末总结、练习、参考文献和索引不重复计为知识节点。
原书与译本均受版权保护,“第8章 代码生成”不复制、翻译或改写原文、图表、算法伪码和练习,只把官方目录当作范围坐标;中文讲解、状态轨迹、反例、交互、练习与答案均为独立教学重写。本页独立核对 1只用于核对现代IR、工具或实验边界,不反向证明原书采用本站表述。
原版目录层级与可验证机制
第8章 代码生成
↡代码生成对应正式目录坐标“第8章 代码生成”,在“第8章 代码生成”中用于声明阶段接口、名字/类型/状态角色和源—目标语义映射,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 1/56。 原版目录键 第8章 代码生成。在“第8章 代码生成”的第1个正式坐标中,「第8章 代码生成」通过声明阶段接口、名字/类型/状态角色和源—目标语义映射推进指令选择、寄存器与目标语义;复核者保存阶段快照、符号表、类型、IR谱系、诊断和源位置,出现阶段边界丢失绑定、类型、控制依赖或源位置就撤回结论。
8·1 代码生成器设计中的问题
↡代码生成器设计中的问题对应正式目录坐标“8.1 代码生成器设计中的问题”,在“第8章 代码生成”中用于声明阶段接口、名字/类型/状态角色和源—目标语义映射,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 2/56。 原版目录键 8.1 代码生成器设计中的问题。围绕“IR操作怎样在寄存器、内存和目标指令之间满足语义与代价约束?”,“第8章 代码生成”在坐标2把「8·1 代码生成器设计中的问题」落实为声明阶段接口、名字/类型/状态角色和源—目标语义映射;只有阶段快照、符号表、类型、IR谱系、诊断和源位置可重放且反例排除阶段边界丢失绑定、类型、控制依赖或源位置,本节点才算掌握。
8·1·1 代码生成器的输入
↡代码生成器的输入对应正式目录坐标“8.1.1 代码生成器的输入”,在“第8章 代码生成”中用于声明阶段接口、名字/类型/状态角色和源—目标语义映射,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 3/56。 原版目录键 8.1.1 代码生成器的输入。“第8章 代码生成”的目录节点3「8·1·1 代码生成器的输入」不能停在术语或伪码:它要声明阶段接口、名字/类型/状态角色和源—目标语义映射,交付阶段快照、符号表、类型、IR谱系、诊断和源位置,并把阶段边界丢失绑定、类型、控制依赖或源位置设为单一反事实。
8·1·2 目标程序
↡目标程序对应正式目录坐标“8.1.2 目标程序”,在“第8章 代码生成”中用于把“目标程序”放进指令选择、寄存器与目标语义的输入—状态—变换—验证链,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 4/56。 原版目录键 8.1.2 目标程序。对“第8章 代码生成”而言,「8·1·2 目标程序」在第4次检查中改变可观察状态,因为它负责把“目标程序”放进指令选择、寄存器与目标语义的输入—状态—变换—验证链;第8章 代码生成的输入角色、中间状态、输出、反例与等价性证据必须与“定义—使用、活跃区间、寄存器类、调用约定、内存别名和代价模型一致”对齐,不能接受只复述“目标程序”名称而没有可观察状态、单故障和恢复验证。
8·1·3 指令选择
↡指令选择对应正式目录坐标“8.1.3 指令选择”,在“第8章 代码生成”中用于在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 5/56。 原版目录键 8.1.3 指令选择。在“第8章 代码生成”的第5个正式坐标中,「8·1·3 指令选择」通过在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价推进指令选择、寄存器与目标语义;复核者保存基本块DAG、活跃区间、干涉图、指令匹配和差分执行,出现别名、寄存器类、调用约定或目标副作用被忽略就撤回结论。
8·1·4 寄存器分配
↡寄存器分配对应正式目录坐标“8.1.4 寄存器分配”,在“第8章 代码生成”中用于在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 6/56。 原版目录键 8.1.4 寄存器分配。围绕“IR操作怎样在寄存器、内存和目标指令之间满足语义与代价约束?”,“第8章 代码生成”在坐标6把「8·1·4 寄存器分配」落实为在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价;只有基本块DAG、活跃区间、干涉图、指令匹配和差分执行可重放且反例排除别名、寄存器类、调用约定或目标副作用被忽略,本节点才算掌握。
8·1·5 求值顺序
↡求值顺序对应正式目录坐标“8.1.5 求值顺序”,在“第8章 代码生成”中用于沿依赖图安排属性求值、语义动作和栈位置,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 7/56。 原版目录键 8.1.5 求值顺序。“第8章 代码生成”的目录节点7「8·1·5 求值顺序」不能停在术语或伪码:它要沿依赖图安排属性求值、语义动作和栈位置,交付属性依赖图、拓扑序、栈快照、值与副作用日志,并把属性未就绪、循环依赖或副作用错序设为单一反事实。
8·2 目标语言
↡目标语言对应正式目录坐标“8.2 目标语言”,在“第8章 代码生成”中用于在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 8/56。 原版目录键 8.2 目标语言。对“第8章 代码生成”而言,「8·2 目标语言」在第8次检查中改变可观察状态,因为它负责在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价;基本块DAG、活跃区间、干涉图、指令匹配和差分执行必须与“定义—使用、活跃区间、寄存器类、调用约定、内存别名和代价模型一致”对齐,不能接受别名、寄存器类、调用约定或目标副作用被忽略。
8·2·1 一个简单的目标机模型
↡一个简单的目标机模型对应正式目录坐标“8.2.1 一个简单的目标机模型”,在“第8章 代码生成”中用于在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 9/56。 原版目录键 8.2.1 一个简单的目标机模型。在“第8章 代码生成”的第9个正式坐标中,「8·2·1 一个简单的目标机模型」通过在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价推进指令选择、寄存器与目标语义;复核者保存基本块DAG、活跃区间、干涉图、指令匹配和差分执行,出现别名、寄存器类、调用约定或目标副作用被忽略就撤回结论。
8·2·2 程序和指令的代价
↡程序和指令的代价对应正式目录坐标“8.2.2 程序和指令的代价”,在“第8章 代码生成”中用于在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 10/56。 原版目录键 8.2.2 程序和指令的代价。围绕“IR操作怎样在寄存器、内存和目标指令之间满足语义与代价约束?”,“第8章 代码生成”在坐标10把「8·2·2 程序和指令的代价」落实为在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价;只有基本块DAG、活跃区间、干涉图、指令匹配和差分执行可重放且反例排除别名、寄存器类、调用约定或目标副作用被忽略,本节点才算掌握。
8·3 目标代码中的地址
↡目标代码中的地址对应正式目录坐标“8.3 目标代码中的地址”,在“第8章 代码生成”中用于把“目标代码中的地址”放进指令选择、寄存器与目标语义的输入—状态—变换—验证链,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 11/56。 原版目录键 8.3 目标代码中的地址。“第8章 代码生成”的目录节点11「8·3 目标代码中的地址」不能停在术语或伪码:它要把“目标代码中的地址”放进指令选择、寄存器与目标语义的输入—状态—变换—验证链,交付第8章 代码生成的输入角色、中间状态、输出、反例与等价性证据,并把只复述“目标代码中的地址”名称而没有可观察状态、单故障和恢复验证设为单一反事实。
8·3·1 静态分配
↡静态分配对应正式目录坐标“8.3.1 静态分配”,在“第8章 代码生成”中用于把“静态分配”放进指令选择、寄存器与目标语义的输入—状态—变换—验证链,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 12/56。 原版目录键 8.3.1 静态分配。对“第8章 代码生成”而言,「8·3·1 静态分配」在第12次检查中改变可观察状态,因为它负责把“静态分配”放进指令选择、寄存器与目标语义的输入—状态—变换—验证链;第8章 代码生成的输入角色、中间状态、输出、反例与等价性证据必须与“定义—使用、活跃区间、寄存器类、调用约定、内存别名和代价模型一致”对齐,不能接受只复述“静态分配”名称而没有可观察状态、单故障和恢复验证。
8·3·2 栈分配
↡栈分配对应正式目录坐标“8.3.2 栈分配”,在“第8章 代码生成”中用于把“栈分配”放进指令选择、寄存器与目标语义的输入—状态—变换—验证链,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 13/56。 原版目录键 8.3.2 栈分配。在“第8章 代码生成”的第13个正式坐标中,「8·3·2 栈分配」通过把“栈分配”放进指令选择、寄存器与目标语义的输入—状态—变换—验证链推进指令选择、寄存器与目标语义;复核者保存第8章 代码生成的输入角色、中间状态、输出、反例与等价性证据,出现只复述“栈分配”名称而没有可观察状态、单故障和恢复验证就撤回结论。
8·3·3 名字的运行时刻地址
↡名字的运行时刻地址对应正式目录坐标“8.3.3 名字的运行时刻地址”,在“第8章 代码生成”中用于把“名字的运行时刻地址”放进指令选择、寄存器与目标语义的输入—状态—变换—验证链,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 14/56。 原版目录键 8.3.3 名字的运行时刻地址。围绕“IR操作怎样在寄存器、内存和目标指令之间满足语义与代价约束?”,“第8章 代码生成”在坐标14把「8·3·3 名字的运行时刻地址」落实为把“名字的运行时刻地址”放进指令选择、寄存器与目标语义的输入—状态—变换—验证链;只有第8章 代码生成的输入角色、中间状态、输出、反例与等价性证据可重放且反例排除只复述“名字的运行时刻地址”名称而没有可观察状态、单故障和恢复验证,本节点才算掌握。
8·4 基本块和流图
↡基本块和流图对应正式目录坐标“8.4 基本块和流图”,在“第8章 代码生成”中用于在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 15/56。 原版目录键 8.4 基本块和流图。“第8章 代码生成”的目录节点15「8·4 基本块和流图」不能停在术语或伪码:它要在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价,交付基本块DAG、活跃区间、干涉图、指令匹配和差分执行,并把别名、寄存器类、调用约定或目标副作用被忽略设为单一反事实。
8·4·1 基本块
↡基本块对应正式目录坐标“8.4.1 基本块”,在“第8章 代码生成”中用于在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 16/56。 原版目录键 8.4.1 基本块。对“第8章 代码生成”而言,「8·4·1 基本块」在第16次检查中改变可观察状态,因为它负责在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价;基本块DAG、活跃区间、干涉图、指令匹配和差分执行必须与“定义—使用、活跃区间、寄存器类、调用约定、内存别名和代价模型一致”对齐,不能接受别名、寄存器类、调用约定或目标副作用被忽略。
8·4·2 下次使用信息
↡下次使用信息对应正式目录坐标“8.4.2 下次使用信息”,在“第8章 代码生成”中用于把“下次使用信息”放进指令选择、寄存器与目标语义的输入—状态—变换—验证链,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 17/56。 原版目录键 8.4.2 下次使用信息。在“第8章 代码生成”的第17个正式坐标中,「8·4·2 下次使用信息」通过把“下次使用信息”放进指令选择、寄存器与目标语义的输入—状态—变换—验证链推进指令选择、寄存器与目标语义;复核者保存第8章 代码生成的输入角色、中间状态、输出、反例与等价性证据,出现只复述“下次使用信息”名称而没有可观察状态、单故障和恢复验证就撤回结论。
8·4·3 流图
↡流图对应正式目录坐标“8.4.3 流图”,在“第8章 代码生成”中用于在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 18/56。 原版目录键 8.4.3 流图。围绕“IR操作怎样在寄存器、内存和目标指令之间满足语义与代价约束?”,“第8章 代码生成”在坐标18把「8·4·3 流图」落实为在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价;只有基本块DAG、活跃区间、干涉图、指令匹配和差分执行可重放且反例排除别名、寄存器类、调用约定或目标副作用被忽略,本节点才算掌握。
8·4·4 流图的表示
↡流图的表示对应正式目录坐标“8.4.4 流图的表示”,在“第8章 代码生成”中用于在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 19/56。 原版目录键 8.4.4 流图的表示。“第8章 代码生成”的目录节点19「8·4·4 流图的表示」不能停在术语或伪码:它要在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价,交付基本块DAG、活跃区间、干涉图、指令匹配和差分执行,并把别名、寄存器类、调用约定或目标副作用被忽略设为单一反事实。
8·4·5 循环
↡循环对应正式目录坐标“8.4.5 循环”,在“第8章 代码生成”中用于求解数据流固定点并证明变换在所有控制流路径上保语义,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 20/56。 原版目录键 8.4.5 循环。对“第8章 代码生成”而言,「8·4·5 循环」在第20次检查中改变可观察状态,因为它负责求解数据流固定点并证明变换在所有控制流路径上保语义;格值迭代、交汇/转移、收敛日志、前后CFG和等价性测试必须与“定义—使用、活跃区间、寄存器类、调用约定、内存别名和代价模型一致”对齐,不能接受边界值、不可执行路径、别名或单调性假设错误。
8·5 基本块的优化
↡基本块的优化对应正式目录坐标“8.5 基本块的优化”,在“第8章 代码生成”中用于声明阶段接口、名字/类型/状态角色和源—目标语义映射,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 21/56。 原版目录键 8.5 基本块的优化。在“第8章 代码生成”的第21个正式坐标中,「8·5 基本块的优化」通过声明阶段接口、名字/类型/状态角色和源—目标语义映射推进指令选择、寄存器与目标语义;复核者保存阶段快照、符号表、类型、IR谱系、诊断和源位置,出现阶段边界丢失绑定、类型、控制依赖或源位置就撤回结论。
8·5·1 基本块的DAG表示
↡基本块的DAG表示对应正式目录坐标“8.5.1 基本块的DAG表示”,在“第8章 代码生成”中用于把源级值、地址、类型、控制边和定义—使用关系编码为IR,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 22/56。 原版目录键 8.5.1 基本块的DAG表示。围绕“IR操作怎样在寄存器、内存和目标指令之间满足语义与代价约束?”,“第8章 代码生成”在坐标22把「8·5·1 基本块的DAG表示」落实为把源级值、地址、类型、控制边和定义—使用关系编码为IR;只有AST/DAG、类型证明、CFG、SSA链、地址计算与回填列表可重放且反例排除类型、phi输入、控制边、地址或定义—使用关系错位,本节点才算掌握。
8·5·2 寻找局部公共子表达式
↡寻找局部公共子表达式对应正式目录坐标“8.5.2 寻找局部公共子表达式”,在“第8章 代码生成”中用于把源级值、地址、类型、控制边和定义—使用关系编码为IR,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 23/56。 原版目录键 8.5.2 寻找局部公共子表达式。“第8章 代码生成”的目录节点23「8·5·2 寻找局部公共子表达式」不能停在术语或伪码:它要把源级值、地址、类型、控制边和定义—使用关系编码为IR,交付AST/DAG、类型证明、CFG、SSA链、地址计算与回填列表,并把类型、phi输入、控制边、地址或定义—使用关系错位设为单一反事实。
8·5·3 消除死代码
↡消除死代码对应正式目录坐标“8.5.3 消除死代码”,在“第8章 代码生成”中用于把“消除死代码”放进指令选择、寄存器与目标语义的输入—状态—变换—验证链,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 24/56。 原版目录键 8.5.3 消除死代码。对“第8章 代码生成”而言,「8·5·3 消除死代码」在第24次检查中改变可观察状态,因为它负责把“消除死代码”放进指令选择、寄存器与目标语义的输入—状态—变换—验证链;第8章 代码生成的输入角色、中间状态、输出、反例与等价性证据必须与“定义—使用、活跃区间、寄存器类、调用约定、内存别名和代价模型一致”对齐,不能接受只复述“消除死代码”名称而没有可观察状态、单故障和恢复验证。
8·5·4 代数恒等式的使用
↡代数恒等式的使用对应正式目录坐标“8.5.4 代数恒等式的使用”,在“第8章 代码生成”中用于把“代数恒等式的使用”放进指令选择、寄存器与目标语义的输入—状态—变换—验证链,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 25/56。 原版目录键 8.5.4 代数恒等式的使用。在“第8章 代码生成”的第25个正式坐标中,「8·5·4 代数恒等式的使用」通过把“代数恒等式的使用”放进指令选择、寄存器与目标语义的输入—状态—变换—验证链推进指令选择、寄存器与目标语义;复核者保存第8章 代码生成的输入角色、中间状态、输出、反例与等价性证据,出现只复述“代数恒等式的使用”名称而没有可观察状态、单故障和恢复验证就撤回结论。
8·5·5 数组引用的表示
↡数组引用的表示对应正式目录坐标“8.5.5 数组引用的表示”,在“第8章 代码生成”中用于以迭代域、访问关系和依赖约束证明循环变换、并行与局部性,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 26/56。 原版目录键 8.5.5 数组引用的表示。围绕“IR操作怎样在寄存器、内存和目标指令之间满足语义与代价约束?”,“第8章 代码生成”在坐标26把「8·5·5 数组引用的表示」落实为以迭代域、访问关系和依赖约束证明循环变换、并行与局部性;只有迭代空间、依赖关系、调度、缓存复用、同步与边界测试可重放且反例排除变换违反跨迭代依赖或只在样例尺寸上偶然正确,本节点才算掌握。
8·5·6 指针赋值和过程调用
↡指针赋值和过程调用对应正式目录坐标“8.5.6 指针赋值和过程调用”,在“第8章 代码生成”中用于把源级值、地址、类型、控制边和定义—使用关系编码为IR,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 27/56。 原版目录键 8.5.6 指针赋值和过程调用。“第8章 代码生成”的目录节点27「8·5·6 指针赋值和过程调用」不能停在术语或伪码:它要把源级值、地址、类型、控制边和定义—使用关系编码为IR,交付AST/DAG、类型证明、CFG、SSA链、地址计算与回填列表,并把类型、phi输入、控制边、地址或定义—使用关系错位设为单一反事实。
8·5·7 从DAG重新组装基本块
↡从DAG重新组装基本块对应正式目录坐标“8.5.7 从DAG重新组装基本块”,在“第8章 代码生成”中用于把源级值、地址、类型、控制边和定义—使用关系编码为IR,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 28/56。 原版目录键 8.5.7 从DAG重新组装基本块。对“第8章 代码生成”而言,「8·5·7 从DAG重新组装基本块」在第28次检查中改变可观察状态,因为它负责把源级值、地址、类型、控制边和定义—使用关系编码为IR;AST/DAG、类型证明、CFG、SSA链、地址计算与回填列表必须与“定义—使用、活跃区间、寄存器类、调用约定、内存别名和代价模型一致”对齐,不能接受类型、phi输入、控制边、地址或定义—使用关系错位。
8·6 一个简单的代码生成器
↡一个简单的代码生成器对应正式目录坐标“8.6 一个简单的代码生成器”,在“第8章 代码生成”中用于声明阶段接口、名字/类型/状态角色和源—目标语义映射,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 29/56。 原版目录键 8.6 一个简单的代码生成器。在“第8章 代码生成”的第29个正式坐标中,「8·6 一个简单的代码生成器」通过声明阶段接口、名字/类型/状态角色和源—目标语义映射推进指令选择、寄存器与目标语义;复核者保存阶段快照、符号表、类型、IR谱系、诊断和源位置,出现阶段边界丢失绑定、类型、控制依赖或源位置就撤回结论。
8·6·1 寄存器描述符和地址描述符
↡寄存器描述符和地址描述符对应正式目录坐标“8.6.1 寄存器描述符和地址描述符”,在“第8章 代码生成”中用于在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 30/56。 原版目录键 8.6.1 寄存器描述符和地址描述符。围绕“IR操作怎样在寄存器、内存和目标指令之间满足语义与代价约束?”,“第8章 代码生成”在坐标30把「8·6·1 寄存器描述符和地址描述符」落实为在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价;只有基本块DAG、活跃区间、干涉图、指令匹配和差分执行可重放且反例排除别名、寄存器类、调用约定或目标副作用被忽略,本节点才算掌握。
8·6·2 代码生成算法
↡代码生成算法对应正式目录坐标“8.6.2 代码生成算法”,在“第8章 代码生成”中用于声明阶段接口、名字/类型/状态角色和源—目标语义映射,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 31/56。 原版目录键 8.6.2 代码生成算法。“第8章 代码生成”的目录节点31「8·6·2 代码生成算法」不能停在术语或伪码:它要声明阶段接口、名字/类型/状态角色和源—目标语义映射,交付阶段快照、符号表、类型、IR谱系、诊断和源位置,并把阶段边界丢失绑定、类型、控制依赖或源位置设为单一反事实。
8·6·3 函数getReg的设计
↡函数getReg的设计对应正式目录坐标“8.6.3 函数getReg的设计”,在“第8章 代码生成”中用于把“函数getReg的设计”放进指令选择、寄存器与目标语义的输入—状态—变换—验证链,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 32/56。 原版目录键 8.6.3 函数getReg的设计。对“第8章 代码生成”而言,「8·6·3 函数getReg的设计」在第32次检查中改变可观察状态,因为它负责把“函数getReg的设计”放进指令选择、寄存器与目标语义的输入—状态—变换—验证链;第8章 代码生成的输入角色、中间状态、输出、反例与等价性证据必须与“定义—使用、活跃区间、寄存器类、调用约定、内存别名和代价模型一致”对齐,不能接受只复述“函数getReg的设计”名称而没有可观察状态、单故障和恢复验证。
8·7 窥孔优化
↡窥孔优化对应正式目录坐标“8.7 窥孔优化”,在“第8章 代码生成”中用于声明阶段接口、名字/类型/状态角色和源—目标语义映射,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 33/56。 原版目录键 8.7 窥孔优化。在“第8章 代码生成”的第33个正式坐标中,「8·7 窥孔优化」通过声明阶段接口、名字/类型/状态角色和源—目标语义映射推进指令选择、寄存器与目标语义;复核者保存阶段快照、符号表、类型、IR谱系、诊断和源位置,出现阶段边界丢失绑定、类型、控制依赖或源位置就撤回结论。
8·7·1 消除冗余的加载和保存指令
↡消除冗余的加载和保存指令对应正式目录坐标“8.7.1 消除冗余的加载和保存指令”,在“第8章 代码生成”中用于在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 34/56。 原版目录键 8.7.1 消除冗余的加载和保存指令。围绕“IR操作怎样在寄存器、内存和目标指令之间满足语义与代价约束?”,“第8章 代码生成”在坐标34把「8·7·1 消除冗余的加载和保存指令」落实为在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价;只有基本块DAG、活跃区间、干涉图、指令匹配和差分执行可重放且反例排除别名、寄存器类、调用约定或目标副作用被忽略,本节点才算掌握。
8·7·2 消除不可达代码
↡消除不可达代码对应正式目录坐标“8.7.2 消除不可达代码”,在“第8章 代码生成”中用于追踪栈帧、非局部绑定、根集、堆对象和收集阶段,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 35/56。 原版目录键 8.7.2 消除不可达代码。“第8章 代码生成”的目录节点35「8·7·2 消除不可达代码」不能停在术语或伪码:它要追踪栈帧、非局部绑定、根集、堆对象和收集阶段,交付活动记录、访问链、根集、对象图、写屏障与暂停统计,并把生命周期、根集或屏障错误导致悬垂引用、泄漏或误回收设为单一反事实。
8·7·3 控制流优化
↡控制流优化对应正式目录坐标“8.7.3 控制流优化”,在“第8章 代码生成”中用于声明阶段接口、名字/类型/状态角色和源—目标语义映射,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 36/56。 原版目录键 8.7.3 控制流优化。对“第8章 代码生成”而言,「8·7·3 控制流优化」在第36次检查中改变可观察状态,因为它负责声明阶段接口、名字/类型/状态角色和源—目标语义映射;阶段快照、符号表、类型、IR谱系、诊断和源位置必须与“定义—使用、活跃区间、寄存器类、调用约定、内存别名和代价模型一致”对齐,不能接受阶段边界丢失绑定、类型、控制依赖或源位置。
8·7·4 代数化简和强度削弱
↡代数化简和强度削弱对应正式目录坐标“8.7.4 代数化简和强度削弱”,在“第8章 代码生成”中用于把“代数化简和强度削弱”放进指令选择、寄存器与目标语义的输入—状态—变换—验证链,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 37/56。 原版目录键 8.7.4 代数化简和强度削弱。在“第8章 代码生成”的第37个正式坐标中,「8·7·4 代数化简和强度削弱」通过把“代数化简和强度削弱”放进指令选择、寄存器与目标语义的输入—状态—变换—验证链推进指令选择、寄存器与目标语义;复核者保存第8章 代码生成的输入角色、中间状态、输出、反例与等价性证据,出现只复述“代数化简和强度削弱”名称而没有可观察状态、单故障和恢复验证就撤回结论。
8·7·5 机器特有指令的使用
↡机器特有指令的使用对应正式目录坐标“8.7.5 机器特有指令的使用”,在“第8章 代码生成”中用于在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 38/56。 原版目录键 8.7.5 机器特有指令的使用。围绕“IR操作怎样在寄存器、内存和目标指令之间满足语义与代价约束?”,“第8章 代码生成”在坐标38把「8·7·5 机器特有指令的使用」落实为在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价;只有基本块DAG、活跃区间、干涉图、指令匹配和差分执行可重放且反例排除别名、寄存器类、调用约定或目标副作用被忽略,本节点才算掌握。
8·8 寄存器分配和指派
↡寄存器分配和指派对应正式目录坐标“8.8 寄存器分配和指派”,在“第8章 代码生成”中用于在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 39/56。 原版目录键 8.8 寄存器分配和指派。“第8章 代码生成”的目录节点39「8·8 寄存器分配和指派」不能停在术语或伪码:它要在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价,交付基本块DAG、活跃区间、干涉图、指令匹配和差分执行,并把别名、寄存器类、调用约定或目标副作用被忽略设为单一反事实。
8·8·1 全局寄存器分配
↡全局寄存器分配对应正式目录坐标“8.8.1 全局寄存器分配”,在“第8章 代码生成”中用于在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 40/56。 原版目录键 8.8.1 全局寄存器分配。对“第8章 代码生成”而言,「8·8·1 全局寄存器分配」在第40次检查中改变可观察状态,因为它负责在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价;基本块DAG、活跃区间、干涉图、指令匹配和差分执行必须与“定义—使用、活跃区间、寄存器类、调用约定、内存别名和代价模型一致”对齐,不能接受别名、寄存器类、调用约定或目标副作用被忽略。
8·8·2 使用计数
↡使用计数对应正式目录坐标“8.8.2 使用计数”,在“第8章 代码生成”中用于把“使用计数”放进指令选择、寄存器与目标语义的输入—状态—变换—验证链,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 41/56。 原版目录键 8.8.2 使用计数。在“第8章 代码生成”的第41个正式坐标中,「8·8·2 使用计数」通过把“使用计数”放进指令选择、寄存器与目标语义的输入—状态—变换—验证链推进指令选择、寄存器与目标语义;复核者保存第8章 代码生成的输入角色、中间状态、输出、反例与等价性证据,出现只复述“使用计数”名称而没有可观察状态、单故障和恢复验证就撤回结论。
8·8·3 外层循环的寄存器指派
↡外层循环的寄存器指派对应正式目录坐标“8.8.3 外层循环的寄存器指派”,在“第8章 代码生成”中用于在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 42/56。 原版目录键 8.8.3 外层循环的寄存器指派。围绕“IR操作怎样在寄存器、内存和目标指令之间满足语义与代价约束?”,“第8章 代码生成”在坐标42把「8·8·3 外层循环的寄存器指派」落实为在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价;只有基本块DAG、活跃区间、干涉图、指令匹配和差分执行可重放且反例排除别名、寄存器类、调用约定或目标副作用被忽略,本节点才算掌握。
8·8·4 通过图着色进行寄存器分配
↡通过图着色进行寄存器分配对应正式目录坐标“8.8.4 通过图着色进行寄存器分配”,在“第8章 代码生成”中用于在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 43/56。 原版目录键 8.8.4 通过图着色进行寄存器分配。“第8章 代码生成”的目录节点43「8·8·4 通过图着色进行寄存器分配」不能停在术语或伪码:它要在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价,交付基本块DAG、活跃区间、干涉图、指令匹配和差分执行,并把别名、寄存器类、调用约定或目标副作用被忽略设为单一反事实。
8·9 通过树重写来选择指令
↡通过树重写来选择指令对应正式目录坐标“8.9 通过树重写来选择指令”,在“第8章 代码生成”中用于在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 44/56。 原版目录键 8.9 通过树重写来选择指令。对“第8章 代码生成”而言,「8·9 通过树重写来选择指令」在第44次检查中改变可观察状态,因为它负责在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价;基本块DAG、活跃区间、干涉图、指令匹配和差分执行必须与“定义—使用、活跃区间、寄存器类、调用约定、内存别名和代价模型一致”对齐,不能接受别名、寄存器类、调用约定或目标副作用被忽略。
8·9·1 树翻译方案
↡树翻译方案对应正式目录坐标“8.9.1 树翻译方案”,在“第8章 代码生成”中用于把“树翻译方案”放进指令选择、寄存器与目标语义的输入—状态—变换—验证链,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 45/56。 原版目录键 8.9.1 树翻译方案。在“第8章 代码生成”的第45个正式坐标中,「8·9·1 树翻译方案」通过把“树翻译方案”放进指令选择、寄存器与目标语义的输入—状态—变换—验证链推进指令选择、寄存器与目标语义;复核者保存第8章 代码生成的输入角色、中间状态、输出、反例与等价性证据,出现只复述“树翻译方案”名称而没有可观察状态、单故障和恢复验证就撤回结论。
8·9·2 通过输入树的模式匹配生成代码
↡通过输入树的模式匹配生成代码对应正式目录坐标“8.9.2 通过输入树的模式匹配生成代码”,在“第8章 代码生成”中用于把“通过输入树的模式匹配生成代码”放进指令选择、寄存器与目标语义的输入—状态—变换—验证链,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 46/56。 原版目录键 8.9.2 通过输入树的模式匹配生成代码。围绕“IR操作怎样在寄存器、内存和目标指令之间满足语义与代价约束?”,“第8章 代码生成”在坐标46把「8·9·2 通过输入树的模式匹配生成代码」落实为把“通过输入树的模式匹配生成代码”放进指令选择、寄存器与目标语义的输入—状态—变换—验证链;只有第8章 代码生成的输入角色、中间状态、输出、反例与等价性证据可重放且反例排除只复述“通过输入树的模式匹配生成代码”名称而没有可观察状态、单故障和恢复验证,本节点才算掌握。
8·9·3 通过语法分析进行模式匹配
↡通过语法分析进行模式匹配对应正式目录坐标“8.9.3 通过语法分析进行模式匹配”,在“第8章 代码生成”中用于声明阶段接口、名字/类型/状态角色和源—目标语义映射,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 47/56。 原版目录键 8.9.3 通过语法分析进行模式匹配。“第8章 代码生成”的目录节点47「8·9·3 通过语法分析进行模式匹配」不能停在术语或伪码:它要声明阶段接口、名字/类型/状态角色和源—目标语义映射,交付阶段快照、符号表、类型、IR谱系、诊断和源位置,并把阶段边界丢失绑定、类型、控制依赖或源位置设为单一反事实。
8·9·4 语义检查例程
↡语义检查例程对应正式目录坐标“8.9.4 语义检查例程”,在“第8章 代码生成”中用于把“语义检查例程”放进指令选择、寄存器与目标语义的输入—状态—变换—验证链,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 48/56。 原版目录键 8.9.4 语义检查例程。对“第8章 代码生成”而言,「8·9·4 语义检查例程」在第48次检查中改变可观察状态,因为它负责把“语义检查例程”放进指令选择、寄存器与目标语义的输入—状态—变换—验证链;第8章 代码生成的输入角色、中间状态、输出、反例与等价性证据必须与“定义—使用、活跃区间、寄存器类、调用约定、内存别名和代价模型一致”对齐,不能接受只复述“语义检查例程”名称而没有可观察状态、单故障和恢复验证。
8·9·5 通用树匹配
↡通用树匹配对应正式目录坐标“8.9.5 通用树匹配”,在“第8章 代码生成”中用于把“通用树匹配”放进指令选择、寄存器与目标语义的输入—状态—变换—验证链,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 49/56。 原版目录键 8.9.5 通用树匹配。在“第8章 代码生成”的第49个正式坐标中,「8·9·5 通用树匹配」通过把“通用树匹配”放进指令选择、寄存器与目标语义的输入—状态—变换—验证链推进指令选择、寄存器与目标语义;复核者保存第8章 代码生成的输入角色、中间状态、输出、反例与等价性证据,出现只复述“通用树匹配”名称而没有可观察状态、单故障和恢复验证就撤回结论。
8·10 表达式的最优代码生成
↡表达式的最优代码生成对应正式目录坐标“8.10 表达式的最优代码生成”,在“第8章 代码生成”中用于声明阶段接口、名字/类型/状态角色和源—目标语义映射,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 50/56。 原版目录键 8.10 表达式的最优代码生成。围绕“IR操作怎样在寄存器、内存和目标指令之间满足语义与代价约束?”,“第8章 代码生成”在坐标50把「8·10 表达式的最优代码生成」落实为声明阶段接口、名字/类型/状态角色和源—目标语义映射;只有阶段快照、符号表、类型、IR谱系、诊断和源位置可重放且反例排除阶段边界丢失绑定、类型、控制依赖或源位置,本节点才算掌握。
8·10·1 Ershov数
↡Ershov数对应正式目录坐标“8.10.1 Ershov数”,在“第8章 代码生成”中用于在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 51/56。 原版目录键 8.10.1 Ershov数。“第8章 代码生成”的目录节点51「8·10·1 Ershov数」不能停在术语或伪码:它要在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价,交付基本块DAG、活跃区间、干涉图、指令匹配和差分执行,并把别名、寄存器类、调用约定或目标副作用被忽略设为单一反事实。
8·10·2 从带标号的表达式树生成代码
↡从带标号的表达式树生成代码对应正式目录坐标“8.10.2 从带标号的表达式树生成代码”,在“第8章 代码生成”中用于把源级值、地址、类型、控制边和定义—使用关系编码为IR,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 52/56。 原版目录键 8.10.2 从带标号的表达式树生成代码。对“第8章 代码生成”而言,「8·10·2 从带标号的表达式树生成代码」在第52次检查中改变可观察状态,因为它负责把源级值、地址、类型、控制边和定义—使用关系编码为IR;AST/DAG、类型证明、CFG、SSA链、地址计算与回填列表必须与“定义—使用、活跃区间、寄存器类、调用约定、内存别名和代价模型一致”对齐,不能接受类型、phi输入、控制边、地址或定义—使用关系错位。
8·10·3 寄存器数量不足时的表达式求值
↡寄存器数量不足时的表达式求值对应正式目录坐标“8.10.3 寄存器数量不足时的表达式求值”,在“第8章 代码生成”中用于把源级值、地址、类型、控制边和定义—使用关系编码为IR,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 53/56。 原版目录键 8.10.3 寄存器数量不足时的表达式求值。在“第8章 代码生成”的第53个正式坐标中,「8·10·3 寄存器数量不足时的表达式求值」通过把源级值、地址、类型、控制边和定义—使用关系编码为IR推进指令选择、寄存器与目标语义;复核者保存AST/DAG、类型证明、CFG、SSA链、地址计算与回填列表,出现类型、phi输入、控制边、地址或定义—使用关系错位就撤回结论。
8·11 动态规划代码生成
↡动态规划代码生成对应正式目录坐标“8.11 动态规划代码生成”,在“第8章 代码生成”中用于声明阶段接口、名字/类型/状态角色和源—目标语义映射,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 54/56。 原版目录键 8.11 动态规划代码生成。围绕“IR操作怎样在寄存器、内存和目标指令之间满足语义与代价约束?”,“第8章 代码生成”在坐标54把「8·11 动态规划代码生成」落实为声明阶段接口、名字/类型/状态角色和源—目标语义映射;只有阶段快照、符号表、类型、IR谱系、诊断和源位置可重放且反例排除阶段边界丢失绑定、类型、控制依赖或源位置,本节点才算掌握。
8·11·1 连续求值
↡连续求值对应正式目录坐标“8.11.1 连续求值”,在“第8章 代码生成”中用于把“连续求值”放进指令选择、寄存器与目标语义的输入—状态—变换—验证链,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 55/56。 原版目录键 8.11.1 连续求值。“第8章 代码生成”的目录节点55「8·11·1 连续求值」不能停在术语或伪码:它要把“连续求值”放进指令选择、寄存器与目标语义的输入—状态—变换—验证链,交付第8章 代码生成的输入角色、中间状态、输出、反例与等价性证据,并把只复述“连续求值”名称而没有可观察状态、单故障和恢复验证设为单一反事实。
8·11·2 动态规划算法
↡动态规划算法对应正式目录坐标“8.11.2 动态规划算法”,在“第8章 代码生成”中用于在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价,并受源程序、表示、规则、目标机、代价与验证边界约束。正式坐标 56/56。 原版目录键 8.11.2 动态规划算法。对“第8章 代码生成”而言,「8·11·2 动态规划算法」在第56次检查中改变可观察状态,因为它负责在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价;基本块DAG、活跃区间、干涉图、指令匹配和差分执行必须与“定义—使用、活跃区间、寄存器类、调用约定、内存别名和代价模型一致”对齐,不能接受别名、寄存器类、调用约定或目标副作用被忽略。
先预测,再操作三个章专属实验
1. 输入、表示与翻译流水线
为“第8章 代码生成”选择正式目录坐标,在参考流水线与单一故障间切换,逐阶段核对输入、变换、输出和不变量。
输入—表示—翻译流水线
第8章 代码生成
选择正式目录坐标,再比较参考编译合同与单一故障的首个状态分岔。
阶段 1/4
第8章 代码生成 · 输入与表示
- 输入
- 为一个基本块执行指令选择、寄存器分配、溢出和窥孔优化
- 变换
- 冻结指令选择、寄存器与目标语义所需的源程序、文法/IR/机器版本、shape和符号角色
- 输出证据
- 第8章 代码生成的输入合同、版本表与基线快照
- 不变量检查
- 第8章 代码生成的源位置、名字、类型、控制/数据依赖和可见性没有越界
第8章 代码生成的可重放协议
| 阶段 | 允许动作 | 必留证据 | 拒绝条件 |
|---|---|---|---|
| 第8章 代码生成 · 输入与表示 | 冻结指令选择、寄存器与目标语义所需的源程序、文法/IR/机器版本、shape和符号角色 | 第8章 代码生成的输入合同、版本表与基线快照 | 未满足“第8章 代码生成的源位置、名字、类型、控制/数据依赖和可见性没有越界” |
| 第8章 代码生成 · 状态变换 | 执行从目标机、基本块、DAG、局部优化、寄存器分配、指令选择和动态规划生成目标代码的最小算法并保存每一步状态 | 第8章 代码生成的参考轨迹、故障轨迹与首个状态分岔 | 未满足“第8章 代码生成每一步可由同一输入、规则、版本和顺序复算” |
| 第8章 代码生成 · 输出与代价 | 比较变换前后IR/目标状态、诊断、资源或分析精度 | 第8章 代码生成的前后差、语义映射、代价和恢复路径 | 未满足“第8章 代码生成没有把编译成功、分析收敛或单一基准加速当作完整正确性” |
| 第8章 代码生成 · 独立验证 | 重放预测、单故障、恢复和不适用边界 | 第8章 代码生成的接受、回退或拒绝理由 | 未满足“第8章 代码生成满足“定义—使用、活跃区间、寄存器类、调用约定、内存别名和代价模型一致”” |
unit: "dbc-unit-08"
question: "IR操作怎样在寄存器、内存和目标指令之间满足语义与代价约束?"
scenario: "为一个基本块执行指令选择、寄存器分配、溢出和窥孔优化"
invariant: "定义—使用、活跃区间、寄存器类、调用约定、内存别名和代价模型一致"
fault: "窥孔删除看似冗余的存储,却忽略别名指针随后读取该内存"
evidence: "基本块DAG、活跃区间、干涉图、指令匹配与目标执行对照"
reset: restore_concept_mode_stage_trace_step_case_gates_and_artifact“第8章 代码生成”要求从同一源程序、文法/IR/机器版本、规则、预算和执行顺序重放参考、故障与恢复路径。重置后若目录选择、模式、阶段、轨迹步骤、案例、证据门或交付包没有回到基线,本次比较已经混入状态泄漏。
本页回顾
掌握“第8章 代码生成”不是背术语、表格或伪码,而是围绕“IR操作怎样在寄存器、内存和目标指令之间满足语义与代价约束?”重建输入、表示、状态变换、输出、代价和独立验证,并用“定义—使用、活跃区间、寄存器类、调用约定、内存别名和代价模型一致”拒绝“窥孔删除看似冗余的存储,却忽略别名指针随后读取该内存”。最终交付为基本块DAG、活跃区间、干涉图、指令匹配与目标执行对照。
练习与答案
练习
- 问题 1:编译合同。 “第8章 代码生成”为什么必须先冻结源程序、文法/IR/机器版本、规则、预算和验证口径?
- 问题 2:目录逐项覆盖。 怎样证明“第8章 代码生成”的正式目录坐标已经进入机制、交互和练习?
- 问题 3:故障恢复。 怎样证明“窥孔删除看似冗余的存储,却忽略别名指针随后读取该内存”已经被修正?
名词解释
名词解释
本章出现的专业名词,用大白话再讲一遍。
- 代码生成
检索键 dbc-A 对应正式目录坐标「第8章 代码生成」;在“第8章 代码生成”中用于声明阶段接口、名字/类型/状态角色和源—目标语义映射,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 代码生成器设计中的问题
检索键 dbc-B 对应正式目录坐标「8·1 代码生成器设计中的问题」;在“第8章 代码生成”中用于声明阶段接口、名字/类型/状态角色和源—目标语义映射,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 代码生成器的输入
检索键 dbc-C 对应正式目录坐标「8·1·1 代码生成器的输入」;在“第8章 代码生成”中用于声明阶段接口、名字/类型/状态角色和源—目标语义映射,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 目标程序
检索键 dbc-D 对应正式目录坐标「8·1·2 目标程序」;在“第8章 代码生成”中用于把“目标程序”放进指令选择、寄存器与目标语义的输入—状态—变换—验证链,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 指令选择
检索键 dbc-E 对应正式目录坐标「8·1·3 指令选择」;在“第8章 代码生成”中用于在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 寄存器分配
检索键 dbc-F 对应正式目录坐标「8·1·4 寄存器分配」;在“第8章 代码生成”中用于在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 求值顺序
检索键 dbc-G 对应正式目录坐标「8·1·5 求值顺序」;在“第8章 代码生成”中用于沿依赖图安排属性求值、语义动作和栈位置,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 目标语言
检索键 dbc-H 对应正式目录坐标「8·2 目标语言」;在“第8章 代码生成”中用于在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 一个简单的目标机模型
检索键 dbc-I 对应正式目录坐标「8·2·1 一个简单的目标机模型」;在“第8章 代码生成”中用于在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 程序和指令的代价
检索键 dbc-J 对应正式目录坐标「8·2·2 程序和指令的代价」;在“第8章 代码生成”中用于在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 目标代码中的地址
检索键 dbc-K 对应正式目录坐标「8·3 目标代码中的地址」;在“第8章 代码生成”中用于把“目标代码中的地址”放进指令选择、寄存器与目标语义的输入—状态—变换—验证链,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 静态分配
检索键 dbc-L 对应正式目录坐标「8·3·1 静态分配」;在“第8章 代码生成”中用于把“静态分配”放进指令选择、寄存器与目标语义的输入—状态—变换—验证链,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 栈分配
检索键 dbc-M 对应正式目录坐标「8·3·2 栈分配」;在“第8章 代码生成”中用于把“栈分配”放进指令选择、寄存器与目标语义的输入—状态—变换—验证链,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 名字的运行时刻地址
检索键 dbc-N 对应正式目录坐标「8·3·3 名字的运行时刻地址」;在“第8章 代码生成”中用于把“名字的运行时刻地址”放进指令选择、寄存器与目标语义的输入—状态—变换—验证链,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 基本块和流图
检索键 dbc-O 对应正式目录坐标「8·4 基本块和流图」;在“第8章 代码生成”中用于在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 基本块
检索键 dbc-P 对应正式目录坐标「8·4·1 基本块」;在“第8章 代码生成”中用于在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 下次使用信息
检索键 dbc-Q 对应正式目录坐标「8·4·2 下次使用信息」;在“第8章 代码生成”中用于把“下次使用信息”放进指令选择、寄存器与目标语义的输入—状态—变换—验证链,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 流图
检索键 dbc-R 对应正式目录坐标「8·4·3 流图」;在“第8章 代码生成”中用于在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 流图的表示
检索键 dbc-S 对应正式目录坐标「8·4·4 流图的表示」;在“第8章 代码生成”中用于在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 循环
检索键 dbc-T 对应正式目录坐标「8·4·5 循环」;在“第8章 代码生成”中用于求解数据流固定点并证明变换在所有控制流路径上保语义,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 基本块的优化
检索键 dbc-U 对应正式目录坐标「8·5 基本块的优化」;在“第8章 代码生成”中用于声明阶段接口、名字/类型/状态角色和源—目标语义映射,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 基本块的DAG表示
检索键 dbc-V 对应正式目录坐标「8·5·1 基本块的DAG表示」;在“第8章 代码生成”中用于把源级值、地址、类型、控制边和定义—使用关系编码为IR,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 寻找局部公共子表达式
检索键 dbc-W 对应正式目录坐标「8·5·2 寻找局部公共子表达式」;在“第8章 代码生成”中用于把源级值、地址、类型、控制边和定义—使用关系编码为IR,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 消除死代码
检索键 dbc-X 对应正式目录坐标「8·5·3 消除死代码」;在“第8章 代码生成”中用于把“消除死代码”放进指令选择、寄存器与目标语义的输入—状态—变换—验证链,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 代数恒等式的使用
检索键 dbc-Y 对应正式目录坐标「8·5·4 代数恒等式的使用」;在“第8章 代码生成”中用于把“代数恒等式的使用”放进指令选择、寄存器与目标语义的输入—状态—变换—验证链,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 数组引用的表示
检索键 dbc-Z 对应正式目录坐标「8·5·5 数组引用的表示」;在“第8章 代码生成”中用于以迭代域、访问关系和依赖约束证明循环变换、并行与局部性,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 指针赋值和过程调用
检索键 dbc-AA 对应正式目录坐标「8·5·6 指针赋值和过程调用」;在“第8章 代码生成”中用于把源级值、地址、类型、控制边和定义—使用关系编码为IR,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 从DAG重新组装基本块
检索键 dbc-AB 对应正式目录坐标「8·5·7 从DAG重新组装基本块」;在“第8章 代码生成”中用于把源级值、地址、类型、控制边和定义—使用关系编码为IR,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 一个简单的代码生成器
检索键 dbc-AC 对应正式目录坐标「8·6 一个简单的代码生成器」;在“第8章 代码生成”中用于声明阶段接口、名字/类型/状态角色和源—目标语义映射,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 寄存器描述符和地址描述符
检索键 dbc-AD 对应正式目录坐标「8·6·1 寄存器描述符和地址描述符」;在“第8章 代码生成”中用于在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 代码生成算法
检索键 dbc-AE 对应正式目录坐标「8·6·2 代码生成算法」;在“第8章 代码生成”中用于声明阶段接口、名字/类型/状态角色和源—目标语义映射,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 函数getReg的设计
检索键 dbc-AF 对应正式目录坐标「8·6·3 函数getReg的设计」;在“第8章 代码生成”中用于把“函数getReg的设计”放进指令选择、寄存器与目标语义的输入—状态—变换—验证链,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 窥孔优化
检索键 dbc-AG 对应正式目录坐标「8·7 窥孔优化」;在“第8章 代码生成”中用于声明阶段接口、名字/类型/状态角色和源—目标语义映射,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 消除冗余的加载和保存指令
检索键 dbc-AH 对应正式目录坐标「8·7·1 消除冗余的加载和保存指令」;在“第8章 代码生成”中用于在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 消除不可达代码
检索键 dbc-AI 对应正式目录坐标「8·7·2 消除不可达代码」;在“第8章 代码生成”中用于追踪栈帧、非局部绑定、根集、堆对象和收集阶段,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 控制流优化
检索键 dbc-AJ 对应正式目录坐标「8·7·3 控制流优化」;在“第8章 代码生成”中用于声明阶段接口、名字/类型/状态角色和源—目标语义映射,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 代数化简和强度削弱
检索键 dbc-AK 对应正式目录坐标「8·7·4 代数化简和强度削弱」;在“第8章 代码生成”中用于把“代数化简和强度削弱”放进指令选择、寄存器与目标语义的输入—状态—变换—验证链,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 机器特有指令的使用
检索键 dbc-AL 对应正式目录坐标「8·7·5 机器特有指令的使用」;在“第8章 代码生成”中用于在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 寄存器分配和指派
检索键 dbc-AM 对应正式目录坐标「8·8 寄存器分配和指派」;在“第8章 代码生成”中用于在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 全局寄存器分配
检索键 dbc-AN 对应正式目录坐标「8·8·1 全局寄存器分配」;在“第8章 代码生成”中用于在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 使用计数
检索键 dbc-AO 对应正式目录坐标「8·8·2 使用计数」;在“第8章 代码生成”中用于把“使用计数”放进指令选择、寄存器与目标语义的输入—状态—变换—验证链,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 外层循环的寄存器指派
检索键 dbc-AP 对应正式目录坐标「8·8·3 外层循环的寄存器指派」;在“第8章 代码生成”中用于在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 通过图着色进行寄存器分配
检索键 dbc-AQ 对应正式目录坐标「8·8·4 通过图着色进行寄存器分配」;在“第8章 代码生成”中用于在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 通过树重写来选择指令
检索键 dbc-AR 对应正式目录坐标「8·9 通过树重写来选择指令」;在“第8章 代码生成”中用于在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 树翻译方案
检索键 dbc-AS 对应正式目录坐标「8·9·1 树翻译方案」;在“第8章 代码生成”中用于把“树翻译方案”放进指令选择、寄存器与目标语义的输入—状态—变换—验证链,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 通过输入树的模式匹配生成代码
检索键 dbc-AT 对应正式目录坐标「8·9·2 通过输入树的模式匹配生成代码」;在“第8章 代码生成”中用于把“通过输入树的模式匹配生成代码”放进指令选择、寄存器与目标语义的输入—状态—变换—验证链,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 通过语法分析进行模式匹配
检索键 dbc-AU 对应正式目录坐标「8·9·3 通过语法分析进行模式匹配」;在“第8章 代码生成”中用于声明阶段接口、名字/类型/状态角色和源—目标语义映射,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 语义检查例程
检索键 dbc-AV 对应正式目录坐标「8·9·4 语义检查例程」;在“第8章 代码生成”中用于把“语义检查例程”放进指令选择、寄存器与目标语义的输入—状态—变换—验证链,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 通用树匹配
检索键 dbc-AW 对应正式目录坐标「8·9·5 通用树匹配」;在“第8章 代码生成”中用于把“通用树匹配”放进指令选择、寄存器与目标语义的输入—状态—变换—验证链,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 表达式的最优代码生成
检索键 dbc-AX 对应正式目录坐标「8·10 表达式的最优代码生成」;在“第8章 代码生成”中用于声明阶段接口、名字/类型/状态角色和源—目标语义映射,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- Ershov数
检索键 dbc-AY 对应正式目录坐标「8·10·1 Ershov数」;在“第8章 代码生成”中用于在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 从带标号的表达式树生成代码
检索键 dbc-AZ 对应正式目录坐标「8·10·2 从带标号的表达式树生成代码」;在“第8章 代码生成”中用于把源级值、地址、类型、控制边和定义—使用关系编码为IR,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 寄存器数量不足时的表达式求值
检索键 dbc-BA 对应正式目录坐标「8·10·3 寄存器数量不足时的表达式求值」;在“第8章 代码生成”中用于把源级值、地址、类型、控制边和定义—使用关系编码为IR,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 动态规划代码生成
检索键 dbc-BB 对应正式目录坐标「8·11 动态规划代码生成」;在“第8章 代码生成”中用于声明阶段接口、名字/类型/状态角色和源—目标语义映射,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 连续求值
检索键 dbc-BC 对应正式目录坐标「8·11·1 连续求值」;在“第8章 代码生成”中用于把“连续求值”放进指令选择、寄存器与目标语义的输入—状态—变换—验证链,需要连接原版范围、状态轨迹、等价性证据和不适用边界。
- 动态规划算法
检索键 dbc-BD 对应正式目录坐标「8·11·2 动态规划算法」;在“第8章 代码生成”中用于在IR、寄存器、内存和目标指令间满足定义—使用、调用约定和代价,需要连接原版范围、状态轨迹、等价性证据和不适用边界。