这页补大学计算机专业里最容易被误读的一门系统课:编译原理。它不是只写一个 parser,也不是只背龙书目录;它回答课程视角的问题:人写的源代码怎样被机器理解、检查、优化并执行,为什么词法、语法、AST、符号表、类型检查、IR、优化、代码生成、链接加载、JIT、GC 和运行时会共同决定程序行为。
编译原理的核心不是“把代码变成机器码”这么窄,而是把人写的文本逐步变成可信结构、可验证语义、可执行计划和可诊断错误。
| 课程 / 模块 | 主问题 | 关键对象 | 继续下钻 |
|---|---|---|---|
| 形式语言与自动机基础 | 语言结构怎样被形式化识别 | 正则语言、上下文无关文法、自动机、递归、栈 | 理论计算机科学课群 |
| 词法分析 | 字符流怎样变成 Token 流 | 关键字、标识符、字面量、操作符、行列号、错误字符 | 如何设计编译器 |
| 语法分析与 AST | Token 怎样组织成程序结构 | 文法、优先级、结合性、递归下降、Pratt parser、AST、错误恢复 | 编译器设计训练 |
| 语义分析与类型检查 | 名字和类型怎样被验证 | 符号表、作用域、类型系统、类型推导、泛型、错误诊断 | 编程语言设计 |
| IR 与优化 | 程序怎样变成更适合优化和执行的中间表示 | IR、SSA、常量折叠、死代码消除、内联、逃逸分析、寄存器分配 | 编译器与运行时底座 |
| 代码生成、链接与加载 | 执行形式怎样落到机器、VM 或解释器 | 字节码、机器码、ABI、调用约定、栈帧、动态库、加载器 | 运行时底座 |
| 运行时系统 | 程序执行时还需要哪些语言服务 | JIT、GC、对象布局、协程、事件循环、GIL、异常、调试信息 | 性能工程 |
把正则、文法、递归、栈、表达式优先级和 AST 先接起来。这里不是为了做题,而是理解为什么程序文本能被稳定解析。
能 parse 不等于程序正确。符号表、作用域、类型检查、错误提示和源位置映射,决定编译器能不能提前阻止错误。
IR 是从“语言结构”到“执行计划”的桥。优化不是炫技,而是在语义不变的前提下降低执行成本,并保留可诊断性。
JIT、GC、对象布局、ABI、异常、调试信息和 profiler,把编译原理和操作系统、体系结构、多语言对比接到一起。
| 现象 | 优先回到哪门课 | 为什么 | 不要只做 |
|---|---|---|---|
| 写了 parser,但一遇到复杂表达式就乱 | 语法分析 + 表达式优先级 | 优先级、结合性、括号、递归和错误恢复没有设计清楚 | 继续堆 if else |
| 语法能过,但字段名、作用域、类型经常错 | 符号表 + 类型检查 | 名字解析、作用域、类型兼容和错误提示属于语义分析,不是 parser 能单独解决的 | 等运行时报错 |
| 优化后结果错了 | IR + 语义保持 | 优化必须证明语义不变;副作用、求值顺序、空值和异常都可能让优化不安全 | 只看性能提升 |
| 同一段代码 debug 和 release 表现差很远 | 优化 + 代码生成 | 内联、逃逸、死代码、寄存器分配、边界检查消除都会改变执行路径 | 只怪编译器玄学 |
| Java 服务预热后变快,冷启动慢 | JIT + 运行时 | 热点收集、分层编译、类加载、代码缓存和连接池预热共同影响启动窗口 | 用第一分钟代表稳态 |
| 跨语言调用或 native 扩展偶发崩溃 | ABI + 调用约定 + 运行时边界 | 类型布局、栈帧、符号、动态库版本和内存所有权都可能不匹配 | 只看上层异常日志 |
| 页面 | 负责什么 | 什么时候看 |
|---|---|---|
| 本页:编译原理、运行时与语言实现课群 | 负责把编译原理按大学课程顺序、语言实现对象和工程卡点接成学习路线 | 你要补大学编译原理,而不是直接写一个工业编译器时 |
| 组成原理、体系结构与数字硬件课群 | 负责机器表示、指令、内存层级和硬件结构对代码生成的约束 | 你想知道编译原理怎样落到真实机器时 |
| 操作系统课群 | 负责运行时使用线程、内存、文件、系统调用和资源隔离的方式 | 你想知道程序执行怎样依赖 OS 时 |
| 如何设计编译器 | 负责用 LedgerRule 贯穿源码、Token、AST、符号表、类型检查、IR、优化、代码生成和诊断 | 你想从一个小语言亲手走完整条编译器设计链时 |
| 理论计算机科学课群 | 负责把自动机、形式语言、逻辑、类型和可计算性作为编译原理的理论基础 | 你要解释类型检查、优化正确性和静态分析怎样约束程序性质时 |
| 编译器与运行时底座 | 负责语言运行时、JIT、GC、对象布局、ABI、多语言性能和并发差异 | 你要解释语言生态为什么表现不同,或排查运行时性能时 |
| 如何设计一门编程语言 | 负责语言目的、语法、语义、类型、错误提示、执行模型和工具链的上游设计 | 你还没想清楚语言要表达什么、为什么需要这门语言时 |