编译器把「人能读的程序」翻译成「机器能跑的东西」——这中间的每一层(词法、语法、语义、优化、生成)都是抽象与权衡的艺术。理解编译器的各个阶段,是深入语言运行时与性能优化的钥匙。
本专题共收录 48 篇深度文章,从词法分析器出发,依次展开语法分析与 AST、语义分析与中间表示、中间代码优化、目标代码生成,最终落到解释器与 JIT 编译,形成「前端 → IR → 优化 → 后端 → 运行时」的完整编译器实现链路。扩展部分进一步覆盖手写 AST 解释器的求值语义、LLVM 与 LLVM IR 后端、类型系统与类型推断、现代优化 Pass 管线、运行时与内存管理,以及错误恢复与诊断,补齐了从求值模型到内存子系统的关键拼图。最新一批文章继续深入寄存器分配与图着色、JIT 热点优化与去优化、编译器架构与多遍设计、并行与增量编译、宏系统与元编程,以及编译器正确性与验证,把编译器的后端资源分配、运行时自适应优化与工程可信度一并纳入专题版图。本批再新增六篇,把视野从编译器内部延伸到与它协同工作的整条工具链:链接加载与运行时启动、数据流分析框架、向量化与 SIMD、垃圾回收算法、语言服务器与 IDE 工具链,以及交叉编译与多目标后端,补上了「编译产物如何落地、优化如何被系统化计算、代码如何面向多平台」这三块拼图。本批再添六篇,把编译器的「分析与生成」推进到更细的纵深:以运行时画像驱动布局的 PGO 与 BOLT、滑动窗口改写与 E-graph 搜索的窥孔与超优化、建立在格与不动点之上的抽象解释与形式化验证、从前端生成视角看语法描述的解析器生成器与 DSL、面向动态语言的内联缓存与去优化,以及把并行映射到 GPU 的异构卸载编译。本批六篇继续把「优化理论」与「工程可信度」向纵深推进:循环变换与依赖分析、MLIR 的多层次方言与渐进降级、零成本异常与表驱动栈展开、约束求解与类型类解析、可复现构建与确定性输出,以及把 WebAssembly 作为编译目标与执行环境的后端实践。 本批再新增六篇,聚焦 SSA 构造与销毁、逃逸分析与栈上分配、LTO 与 ThinLTO、协程与 async 降级、ABI 与调用约定,以及调试信息与源码映射,把中间表示的构造、跨模块优化与调试保真度补入链路。本批再新增六篇,继续深化后端代码生成与工程可信度:指令选择与指令调度、编译期求值与 constexpr/comptime、ELF/Mach-O/COFF 目标文件格式、Sanitizer 与编译期安全加固、查询式增量类型检查的 Salsa 架构,以及浮点语义与 fast-math 优化。
📌 相关专题:计算机基础专题 (算法与数据结构)、C++ 专题 (底层实现语言)、Rust 专题 (系统编程)、Java 专题 (JVM 运行时)
一、编译器前端
- 词法分析器实现 — 正则到 NFA、Thompson 构造、子集构造、DFA 最小化、最长匹配
- 语法分析与 AST 构建 — 递归下降、FIRST/FOLLOW、LR 冲突消解、Pratt 解析
- 类型系统与类型推断 — 静态类型判定规则、Hindley-Milner 合一、泛型与约束求解、联合类型
- 错误恢复与诊断 — 错误恢复策略、诊断信息设计、lint 与静态分析、增量编译
- 宏系统与元编程 — 宏展开、卫生宏与捕获避免、编译期计算、过程宏与 DSL 代码生成
- 解析器生成器与 DSL 前端 — LL(1) 的 FIRST/FOLLOW 与预测分析表、LALR 项集闭包与冲突、PEG 有序选择与回溯、生成器与手写递归下降的取舍、错误恢复与增量解析
- 编译期求值与 constexpr/comptime — C++ constexpr/consteval 的逐步放宽、Rust const fn 与 Zig comptime 语义差异、语义分析阶段的内置解释器、步数限制与资源预算、常量折叠与诊断质量
二、IR 与优化
- 语义分析与中间表示 — 符号表与作用域、类型检查与合一、三地址码、控制流图与 SSA
- 中间代码优化 — 常量折叠与传播、死代码消除、公共子表达式、循环优化与数据流分析
- 现代优化 Pass 管线 — 函数内联、循环展开与向量化、SSA 常量传播、PGO 与 pass 调度
- LLVM 与 LLVM IR 后端 — SSA 形式、IRBuilder 生成、优化 Pass 管线、目标代码生成与前端桥接
- 数据流分析框架 — 格与偏序、不动点迭代、到达定值与活跃变量、可用表达式与常量传播、支配树与 SSA 稀疏分析、worklist 算法
- 向量化与 SIMD — 依赖分析与合法性判定、循环向量化、SLP 向量化、掩码与归约、内建函数与 intrinsics、实际收益与阻碍因素
- 窥孔优化与超优化 — 滑动窗口局部改写、指令代价模型与收益判定、E-graph 与等式饱和、超优化器枚举搜索、SMT 等价性验证与规则安全
- 抽象解释与形式化验证 — Galois 连接与格上抽象、区间域与多面体域、加宽与收窄保证终止、SMT 求解与有界模型检验、不变式推断与验证边界
- 循环优化与依赖分析 — 循环变换分类与合法性、依赖距离与方向向量、依赖测试与消解、多面体模型与循环展开融合、向量化前置条件
- MLIR 与多层次 IR — 方言与操作的组织方式、渐进式降级的时机与收益、pass pipeline 与调度、与 LLVM 后端的衔接、多目标复用与可扩展性
- 浮点语义与快速数学优化 — IEEE 754 正确舍入契约、结合律与分配律在浮点上失效、NaN 传播与符号零、-ffast-math 各子开关放宽了什么、FMA 与数值稳定性取舍
三、后端与运行时
- 目标代码生成 — 指令选择、图着色寄存器分配、栈帧与 ABI、指令调度与窥孔优化
- 解释器与 JIT 编译 — AST 解释、字节码虚拟机、内联缓存、热点探测与分层编译
- 手写 AST 解释器与求值语义 — 树遍历求值、环境与作用域、闭包与递归、引用与值、求值顺序
- 运行时与内存管理 — 栈帧与调用约定、堆与逃逸分析、GC 策略、内存安全边界
- 寄存器分配与图着色 — 活跃性分析、冲突图构建、图着色与溢出、线性扫描、SSA 解构与伪寄存器
- JIT 编译进阶与热点优化 — 分层编译、热点探测与 OSR、去优化与激进优化、编译屏障与跨平台 JIT
- 链接、加载与运行时启动 — 符号解析与重定位、静态 vs 动态链接、GOT/PLT 与延迟绑定、动态库加载、_start 到 main 的启动流程、链接脚本
- 垃圾回收算法 — 可达性与根集、标记清除/复制/标记整理、分代与晋升、三色标记与写屏障、并发与增量 GC、STW 暂停与调优
- 交叉编译与多目标后端 — 目标三元组、ABI 与调用约定差异、sysroot 与工具链、多后端代码生成与目标描述、浮点与字节序、构建与测试策略
- 配置文件引导优化 PGO 与 BOLT — 插桩与采样画像、分支权重与热点识别、基本块布局与函数重排、BOLT 后链接优化、画像陈旧与训练数据采集
- 内联缓存与动态语言优化 — 隐藏类与形状转移、单态/多态/巨态内联缓存、去优化与栈帧重建、逃逸分析与标量替换、动态语言的类型反馈
- 异构计算与 GPU 卸载编译 — OpenMP target 与 OpenACC 卸载、CUDA 与 SYCL 编程模型、grid/block/thread 映射、共享内存分块与访存合并、统一内存与多流重叠
- WebAssembly 后端与编译 — WAT 与二进制格式、栈机执行模型、线性内存与表、wasm 优化与 JIT/AOT 对比、可验证性与跨平台一致性
- 异常处理编译与栈展开 — 零成本异常的开销转移、表驱动栈展开与两阶段展开、landing pad 与清理代码、与 GC 和析构的交互、异常路径性能取舍
- 指令选择与指令调度 — 树覆盖与 DAG 覆盖、BURS 与 SelectionDAG、列表调度与关键路径、寄存器压力模型、软件流水与工程取舍
- 目标文件格式:ELF、Mach-O 与 COFF — ELF 节表与程序头表、Mach-O 加载命令与两段式布局、COFF/PE 节表、符号表与重定位记录、链接视图与执行视图、readelf/otool/dumpbin 实操
四、架构、工程与验证
- 编译器架构与多遍设计 — 前端/中端/后端分层、IR 选择与切换、遍管理与调度、调试信息与可插拔优化
- 并行与增量编译 — 模块依赖图、并行任务调度、增量缓存与指纹、memoization 与构建产物复用
- 编译器正确性与验证 — 随机模糊测试、差分测试、回归与黄金测试、形式化验证与健全性边界
- 语言服务器与 IDE 工具链 — LSP 协议与能力协商、增量解析与文档同步、符号索引、跳转定义/补全/重命名、诊断与格式化、性能与缓存
- 约束求解与类型类 — Hindley-Milner 的约束方程扩展、trait/typeclass 实例解析、关联类型与超类约束、约束错误诊断、求解顺序与终止性
- 可复现构建与确定性输出 — 可复现性判定标准、时间戳与绝对路径消除、哈希遍历顺序与并行调度、构建缓存与增量正确性、验证工具与复现实践
- Sanitizer 与编译期安全加固 — ASan 影子内存与红区布局、TSan 的 happens-before 追踪、MSan/UBSan 检测原理、CFI 与 SafeStack、FORTIFY 加固与 CI 集成
- 查询式编译器与增量类型检查 — 查询图与记忆化、Salsa 键值模型与修订号追踪依赖、失效传播与循环不动点、rust-analyzer 的增量类型检查、缓存淘汰与工程陷阱
五、SSA、链接时优化与调试信息
- SSA 构造与销毁 — 支配树与支配边界、Φ 函数插入与最小 SSA、变量重命名、SSA 销毁与并行复制、临界边拆分与正确性
- 逃逸分析与栈上分配 — 逃逸状态格与不动点迭代、过程内/过程间分析、标量替换与栈上分配、锁消除、保守边界与去优化
- 链接时优化:LTO 与 ThinLTO — 全程序 LTO 与增量式 ThinLTO、摘要索引与导入导出、跨模块内联与死代码消除、构建时间与内存权衡、分布式后端
- 协程与 async 降级 — 状态机拆解与恢复点、栈式与无栈协程、await 降级与帧布局、调度器接口、异常与取消传播
- ABI 与调用约定 — 寄存器与栈传参规则、调用者/被调用者保存、结构体传递与返回值、栈对齐与红区、跨语言 ABI 与版本兼容
- 调试信息与源码映射 — DWARF 段结构与 DIE 树、行号表与地址映射、变量位置描述、优化后调试信息保真、内联栈与源码映射
延伸阅读
专题统计
- 文章数量: 48 篇核心教程
- 覆盖领域: 词法、语法、语义、类型推断、IR、优化、代码生成、寄存器分配、图着色、解释器、JIT、热点优化、分层编译、OSR、LLVM、运行时、内存管理、错误恢复、诊断、编译器架构、多遍设计、增量编译、并行编译、宏、元编程、模糊测试、差分测试、形式化验证、链接与加载、重定位、GOT/PLT、数据流分析、不动点迭代、支配树、向量化、SIMD、垃圾回收、三色标记、写屏障、并发 GC、语言服务器、LSP、增量解析、交叉编译、目标三元组、ABI、sysroot、多目标后端、PGO、BOLT、基本块布局、超优化、E-graph、等式饱和、SMT 求解、抽象解释、Galois 连接、多面体域、解析器生成器、LALR、PEG、内联缓存、隐藏类、去优化、逃逸分析、异构计算、GPU 卸载、SYCL、统一内存、循环优化、依赖分析、距离向量、多面体模型、MLIR、方言、渐进降级、pass pipeline、WebAssembly、WAT、栈机、线性内存、异常处理、零成本异常、栈展开、landing pad、约束求解、类型类、trait、实例解析、可复现构建、确定性输出、构建缓存
- 难度分布: 入门 13% → 中级 47% → 进阶 40%
- 先修要求: 数据结构与算法基础、任一编程语言
- 总预估阅读时间: 约 1720 分钟