《编译器设计(第2版)》权威学习地图

《编译器设计(第2版)》权威学习地图逐项覆盖20个正式目录层级,以ILOC、IR快照、分析集合、目标指令与运行轨迹建立可复查的编译器工程实验。

为什么最终输出正确仍然不够

、、、、共同构成本页坐标。把4部分、13章与2个附录组织为一条从源码到目标代码的工程证据链,并明确每章输入、输出与先修关系。

编译器是一串互相依赖的转换。错误的扫描器可能恰好产生可解析token,错误的语法树可能在语义动作中被修补,错误的数据流事实可能只在冷路径触发,错误的指令调度也可能在当前处理器上没有暴露。因此必须逐层保存输入、输出和不变量,定位最早偏离,而不能把“样例跑通”当作完整证明。

可复查的编译工程台账

实验固定源程序、编译器提交、ILOC方言、目标机模型、优化级别与随机种子。前端保存token、推导、AST与类型环境;中端保存基本块、CFG、支配关系、数据流集合、SSA和每个pass的前后IR;后端保存模式覆盖、依赖DAG、寄存器映射、逐出代码和最终指令。每份产物都带生成命令、退出状态与摘要值。

样本分为四组。正常样本证明主路径;边界样本覆盖空输入、深嵌套、临界立即数、不可归约控制流、寄存器压力和长延迟;失败样本只破坏一个语法、类型、数据流或机器约束;优化样本则同时保存未优化与优化版本,并用解释器或差分执行核对可观察行为。

诊断必须包含阶段、源位置或IR位置、实际状态、期望状态、相关前驱和首要根因。某一阶段失败后,不得继续消费旧缓存伪造下游结果。修改算法后先清理生成目录,再重建全部受影响事实;若一个pass令支配、活跃或别名信息失效,就必须显式重算或证明仍然有效。

性能结论与正确性结论分开记录。正确性要求语义等价和机器约束成立;性能要求给出静态成本、动态计数、代码大小、编译时间与硬件环境。一次偶然加速不能证明算法更优,一次慢化也不必然否定变换,关键是解释成本模型与实际瓶颈为何一致或偏离。

正式目录项映射到可追溯矩阵:每项至少关联一个输入、一个算法前提、一份结构化产物、一个失败对照和一个回归断言。跨章接口同时记录生产者与消费者,因而能发现“提到概念却没有验证”的空洞覆盖,也能在实现变化后只重放受影响的实验。

六阶段证据链

1. 固定源程序

围绕四部分路线预测输入和结构化结果,执行后比较第一条差分。进入“检查前端IR”前,确认语义、算法前提与成本记录均完整。

2. 检查前端IR

围绕13章主线预测输入和结构化结果,执行后比较第一条差分。进入“运行优化器”前,确认语义、算法前提与成本记录均完整。

3. 运行优化器

围绕ILOC预测输入和结构化结果,执行后比较第一条差分。进入“选择目标指令”前,确认语义、算法前提与成本记录均完整。

4. 选择目标指令

围绕优化证据预测输入和结构化结果,执行后比较第一条差分。进入“比较机器行为”前,确认语义、算法前提与成本记录均完整。

5. 比较机器行为

围绕后端闭环预测输入和结构化结果,执行后比较第一条差分。进入“归档阶段证据”前,确认语义、算法前提与成本记录均完整。

6. 归档阶段证据

围绕四部分路线预测输入和结构化结果,执行后比较第一条差分。进入“固定源程序”前,确认语义、算法前提与成本记录均完整。

可运行骨架

source -> front end -> IR -> optimizer -> IR -> back end -> target
loadI 7 => r1
loadI 5 => r2
add r1, r2 => r3
storeAI r3 => rarp, 0
./front sample.src > sample.iloc
./opt sample.iloc > sample.opt.iloc
./sim sample.opt.iloc

正式目录逐项讲解

第一部分 编译器前端

“第一部分 编译器前端”不能只作为名词记忆。本节先在“固定源程序”阶段固定输入、数据结构、前置事实与成本模型,再预测进入“检查前端IR”前应出现的IR、集合、图、表项、目标指令或运行时状态。实现时只改变一个条件,记录第一条结构或行为差分,避免最终程序碰巧正确掩盖中间错误。

验收时同时问四个问题:转换是否保持可观察语义,算法前提是否真的成立,时间与空间代价是否符合输入规模,以及失败是否停在最早可诊断边界。把答案连同原始产物、工具版本和最小反例写入台账,修复后清理旧输出并从源程序重建,才能证明本目录项被实际掌握。

第二部分 从源码映射到IR

“第二部分 从源码映射到IR”不能只作为名词记忆。本节先在“检查前端IR”阶段固定输入、数据结构、前置事实与成本模型,再预测进入“运行优化器”前应出现的IR、集合、图、表项、目标指令或运行时状态。实现时只改变一个条件,记录第一条结构或行为差分,避免最终程序碰巧正确掩盖中间错误。

验收时同时问四个问题:转换是否保持可观察语义,算法前提是否真的成立,时间与空间代价是否符合输入规模,以及失败是否停在最早可诊断边界。把答案连同原始产物、工具版本和最小反例写入台账,修复后清理旧输出并从源程序重建,才能证明本目录项被实际掌握。

第三部分 代码优化

“第三部分 代码优化”不能只作为名词记忆。本节先在“运行优化器”阶段固定输入、数据结构、前置事实与成本模型,再预测进入“选择目标指令”前应出现的IR、集合、图、表项、目标指令或运行时状态。实现时只改变一个条件,记录第一条结构或行为差分,避免最终程序碰巧正确掩盖中间错误。

验收时同时问四个问题:转换是否保持可观察语义,算法前提是否真的成立,时间与空间代价是否符合输入规模,以及失败是否停在最早可诊断边界。把答案连同原始产物、工具版本和最小反例写入台账,修复后清理旧输出并从源程序重建,才能证明本目录项被实际掌握。

第四部分 编译器后端

“第四部分 编译器后端”不能只作为名词记忆。本节先在“选择目标指令”阶段固定输入、数据结构、前置事实与成本模型,再预测进入“比较机器行为”前应出现的IR、集合、图、表项、目标指令或运行时状态。实现时只改变一个条件,记录第一条结构或行为差分,避免最终程序碰巧正确掩盖中间错误。

验收时同时问四个问题:转换是否保持可观察语义,算法前提是否真的成立,时间与空间代价是否符合输入规模,以及失败是否停在最早可诊断边界。把答案连同原始产物、工具版本和最小反例写入台账,修复后清理旧输出并从源程序重建,才能证明本目录项被实际掌握。

第1章 编译概观

“第1章 编译概观”不能只作为名词记忆。本节先在“比较机器行为”阶段固定输入、数据结构、前置事实与成本模型,再预测进入“归档阶段证据”前应出现的IR、集合、图、表项、目标指令或运行时状态。实现时只改变一个条件,记录第一条结构或行为差分,避免最终程序碰巧正确掩盖中间错误。

验收时同时问四个问题:转换是否保持可观察语义,算法前提是否真的成立,时间与空间代价是否符合输入规模,以及失败是否停在最早可诊断边界。把答案连同原始产物、工具版本和最小反例写入台账,修复后清理旧输出并从源程序重建,才能证明本目录项被实际掌握。

第2章 词法分析器

“第2章 词法分析器”不能只作为名词记忆。本节先在“归档阶段证据”阶段固定输入、数据结构、前置事实与成本模型,再预测进入“固定源程序”前应出现的IR、集合、图、表项、目标指令或运行时状态。实现时只改变一个条件,记录第一条结构或行为差分,避免最终程序碰巧正确掩盖中间错误。

验收时同时问四个问题:转换是否保持可观察语义,算法前提是否真的成立,时间与空间代价是否符合输入规模,以及失败是否停在最早可诊断边界。把答案连同原始产物、工具版本和最小反例写入台账,修复后清理旧输出并从源程序重建,才能证明本目录项被实际掌握。

第3章 语法分析器

“第3章 语法分析器”不能只作为名词记忆。本节先在“固定源程序”阶段固定输入、数据结构、前置事实与成本模型,再预测进入“检查前端IR”前应出现的IR、集合、图、表项、目标指令或运行时状态。实现时只改变一个条件,记录第一条结构或行为差分,避免最终程序碰巧正确掩盖中间错误。

验收时同时问四个问题:转换是否保持可观察语义,算法前提是否真的成立,时间与空间代价是否符合输入规模,以及失败是否停在最早可诊断边界。把答案连同原始产物、工具版本和最小反例写入台账,修复后清理旧输出并从源程序重建,才能证明本目录项被实际掌握。

第4章 上下文相关分析

“第4章 上下文相关分析”不能只作为名词记忆。本节先在“检查前端IR”阶段固定输入、数据结构、前置事实与成本模型,再预测进入“运行优化器”前应出现的IR、集合、图、表项、目标指令或运行时状态。实现时只改变一个条件,记录第一条结构或行为差分,避免最终程序碰巧正确掩盖中间错误。

验收时同时问四个问题:转换是否保持可观察语义,算法前提是否真的成立,时间与空间代价是否符合输入规模,以及失败是否停在最早可诊断边界。把答案连同原始产物、工具版本和最小反例写入台账,修复后清理旧输出并从源程序重建,才能证明本目录项被实际掌握。

第5章 中间表示

“第5章 中间表示”不能只作为名词记忆。本节先在“运行优化器”阶段固定输入、数据结构、前置事实与成本模型,再预测进入“选择目标指令”前应出现的IR、集合、图、表项、目标指令或运行时状态。实现时只改变一个条件,记录第一条结构或行为差分,避免最终程序碰巧正确掩盖中间错误。

验收时同时问四个问题:转换是否保持可观察语义,算法前提是否真的成立,时间与空间代价是否符合输入规模,以及失败是否停在最早可诊断边界。把答案连同原始产物、工具版本和最小反例写入台账,修复后清理旧输出并从源程序重建,才能证明本目录项被实际掌握。

第6章 过程抽象

“第6章 过程抽象”不能只作为名词记忆。本节先在“选择目标指令”阶段固定输入、数据结构、前置事实与成本模型,再预测进入“比较机器行为”前应出现的IR、集合、图、表项、目标指令或运行时状态。实现时只改变一个条件,记录第一条结构或行为差分,避免最终程序碰巧正确掩盖中间错误。

验收时同时问四个问题:转换是否保持可观察语义,算法前提是否真的成立,时间与空间代价是否符合输入规模,以及失败是否停在最早可诊断边界。把答案连同原始产物、工具版本和最小反例写入台账,修复后清理旧输出并从源程序重建,才能证明本目录项被实际掌握。

第7章 代码形式

“第7章 代码形式”不能只作为名词记忆。本节先在“比较机器行为”阶段固定输入、数据结构、前置事实与成本模型,再预测进入“归档阶段证据”前应出现的IR、集合、图、表项、目标指令或运行时状态。实现时只改变一个条件,记录第一条结构或行为差分,避免最终程序碰巧正确掩盖中间错误。

验收时同时问四个问题:转换是否保持可观察语义,算法前提是否真的成立,时间与空间代价是否符合输入规模,以及失败是否停在最早可诊断边界。把答案连同原始产物、工具版本和最小反例写入台账,修复后清理旧输出并从源程序重建,才能证明本目录项被实际掌握。

第8章 优化简介

“第8章 优化简介”不能只作为名词记忆。本节先在“归档阶段证据”阶段固定输入、数据结构、前置事实与成本模型,再预测进入“固定源程序”前应出现的IR、集合、图、表项、目标指令或运行时状态。实现时只改变一个条件,记录第一条结构或行为差分,避免最终程序碰巧正确掩盖中间错误。

验收时同时问四个问题:转换是否保持可观察语义,算法前提是否真的成立,时间与空间代价是否符合输入规模,以及失败是否停在最早可诊断边界。把答案连同原始产物、工具版本和最小反例写入台账,修复后清理旧输出并从源程序重建,才能证明本目录项被实际掌握。

第9章 数据流分析

“第9章 数据流分析”不能只作为名词记忆。本节先在“固定源程序”阶段固定输入、数据结构、前置事实与成本模型,再预测进入“检查前端IR”前应出现的IR、集合、图、表项、目标指令或运行时状态。实现时只改变一个条件,记录第一条结构或行为差分,避免最终程序碰巧正确掩盖中间错误。

验收时同时问四个问题:转换是否保持可观察语义,算法前提是否真的成立,时间与空间代价是否符合输入规模,以及失败是否停在最早可诊断边界。把答案连同原始产物、工具版本和最小反例写入台账,修复后清理旧输出并从源程序重建,才能证明本目录项被实际掌握。

第10章 标量优化

“第10章 标量优化”不能只作为名词记忆。本节先在“检查前端IR”阶段固定输入、数据结构、前置事实与成本模型,再预测进入“运行优化器”前应出现的IR、集合、图、表项、目标指令或运行时状态。实现时只改变一个条件,记录第一条结构或行为差分,避免最终程序碰巧正确掩盖中间错误。

验收时同时问四个问题:转换是否保持可观察语义,算法前提是否真的成立,时间与空间代价是否符合输入规模,以及失败是否停在最早可诊断边界。把答案连同原始产物、工具版本和最小反例写入台账,修复后清理旧输出并从源程序重建,才能证明本目录项被实际掌握。

第11章 指令选择

“第11章 指令选择”不能只作为名词记忆。本节先在“运行优化器”阶段固定输入、数据结构、前置事实与成本模型,再预测进入“选择目标指令”前应出现的IR、集合、图、表项、目标指令或运行时状态。实现时只改变一个条件,记录第一条结构或行为差分,避免最终程序碰巧正确掩盖中间错误。

验收时同时问四个问题:转换是否保持可观察语义,算法前提是否真的成立,时间与空间代价是否符合输入规模,以及失败是否停在最早可诊断边界。把答案连同原始产物、工具版本和最小反例写入台账,修复后清理旧输出并从源程序重建,才能证明本目录项被实际掌握。

第12章 指令调度

“第12章 指令调度”不能只作为名词记忆。本节先在“选择目标指令”阶段固定输入、数据结构、前置事实与成本模型,再预测进入“比较机器行为”前应出现的IR、集合、图、表项、目标指令或运行时状态。实现时只改变一个条件,记录第一条结构或行为差分,避免最终程序碰巧正确掩盖中间错误。

验收时同时问四个问题:转换是否保持可观察语义,算法前提是否真的成立,时间与空间代价是否符合输入规模,以及失败是否停在最早可诊断边界。把答案连同原始产物、工具版本和最小反例写入台账,修复后清理旧输出并从源程序重建,才能证明本目录项被实际掌握。

第13章 寄存器分配

“第13章 寄存器分配”不能只作为名词记忆。本节先在“比较机器行为”阶段固定输入、数据结构、前置事实与成本模型,再预测进入“归档阶段证据”前应出现的IR、集合、图、表项、目标指令或运行时状态。实现时只改变一个条件,记录第一条结构或行为差分,避免最终程序碰巧正确掩盖中间错误。

验收时同时问四个问题:转换是否保持可观察语义,算法前提是否真的成立,时间与空间代价是否符合输入规模,以及失败是否停在最早可诊断边界。把答案连同原始产物、工具版本和最小反例写入台账,修复后清理旧输出并从源程序重建,才能证明本目录项被实际掌握。

附录A ILOC

“附录A ILOC”不能只作为名词记忆。本节先在“归档阶段证据”阶段固定输入、数据结构、前置事实与成本模型,再预测进入“固定源程序”前应出现的IR、集合、图、表项、目标指令或运行时状态。实现时只改变一个条件,记录第一条结构或行为差分,避免最终程序碰巧正确掩盖中间错误。

验收时同时问四个问题:转换是否保持可观察语义,算法前提是否真的成立,时间与空间代价是否符合输入规模,以及失败是否停在最早可诊断边界。把答案连同原始产物、工具版本和最小反例写入台账,修复后清理旧输出并从源程序重建,才能证明本目录项被实际掌握。

附录B 数据结构

“附录B 数据结构”不能只作为名词记忆。本节先在“固定源程序”阶段固定输入、数据结构、前置事实与成本模型,再预测进入“检查前端IR”前应出现的IR、集合、图、表项、目标指令或运行时状态。实现时只改变一个条件,记录第一条结构或行为差分,避免最终程序碰巧正确掩盖中间错误。

验收时同时问四个问题:转换是否保持可观察语义,算法前提是否真的成立,时间与空间代价是否符合输入规模,以及失败是否停在最早可诊断边界。把答案连同原始产物、工具版本和最小反例写入台账,修复后清理旧输出并从源程序重建,才能证明本目录项被实际掌握。

附录中的ILOC与数据结构

“附录中的ILOC与数据结构”不能只作为名词记忆。本节先在“检查前端IR”阶段固定输入、数据结构、前置事实与成本模型,再预测进入“运行优化器”前应出现的IR、集合、图、表项、目标指令或运行时状态。实现时只改变一个条件,记录第一条结构或行为差分,避免最终程序碰巧正确掩盖中间错误。

验收时同时问四个问题:转换是否保持可观察语义,算法前提是否真的成立,时间与空间代价是否符合输入规模,以及失败是否停在最早可诊断边界。把答案连同原始产物、工具版本和最小反例写入台账,修复后清理旧输出并从源程序重建,才能证明本目录项被实际掌握。

分步视觉验证

先预测当前阶段的图、表、集合或指令,再运行变换;若不同,停在第一处分叉并保留原始证据。

常见误区

四类样本与通过条件

样本单一变量必查证据通过条件
正常一个最小语言或机器功能全部阶段快照与预测一致
边界深度、宽度、延迟或压力临界分支与成本边界可解释
失败一个文法、事实或约束首错与下游停止不产出伪结果
优化一个pass或策略前后IR与差分执行等价且收益可解释

练习

小结

  • 四部分路线:连接“固定源程序”的算法前提、结构化产物、成本与回归证据。
  • 13章主线:连接“检查前端IR”的算法前提、结构化产物、成本与回归证据。
  • ILOC:连接“运行优化器”的算法前提、结构化产物、成本与回归证据。
  • 优化证据:连接“选择目标指令”的算法前提、结构化产物、成本与回归证据。
  • 后端闭环:连接“比较机器行为”的算法前提、结构化产物、成本与回归证据。
  • 本页20个目录层级均已进入可追溯的编译工程证据链。

术语表

讨论

评论区加载中…