---
title: 编译原理：从表达式到可执行程序的学习路线
url: https://doc.liz6.com/compilers/00-learning-path
locale: zh
area: compilers
tags:
- 编译原理
date: 2026-09-12
modified: 2026-09-12
description: 完成后交付一个能报告错误位置、区分语法和名字错误、执行或生成代码的小语言，并解释每个阶段输入输出的含义。
---

# 编译原理：从表达式到可执行程序的学习路线

适合能写函数、递归、数组和简单映射的读者。先选自己熟悉的一门语言实现练习；开始时不要求掌握汇编、LLVM 或自动机证明。整条主线围绕一个支持整数、变量、括号和加减乘除的小语言，避免每章换一个互不相关的玩具。

## 学完要能做什么

完成后交付一个能报告错误位置、区分语法和名字错误、执行或生成代码的小语言，并解释每个阶段输入输出的含义。

## 必读顺序与阶段自检

1. [词法器设计](01-lexical-analysis/02-lexer-design.md) → [递归下降与 LL 分析](02-syntax-analysis/01-recursive-descent-and-ll-analysis.md) → [AST 设计与错误恢复](02-syntax-analysis/03-ast-design-and-error-recovery.md)。

   先把字符变成 token，再按优先级构建 AST。自检：`1+2*3` 与 `(1+2)*3` 的树不同；缺少右括号时给出位置而不是崩溃。

2. [符号表与作用域](03-semantic-analysis/01-symbol-tables-and-scopes.md) → [类型系统](03-semantic-analysis/02-type-systems.md)。

   给小语言加入局部变量、块作用域和布尔值。自检：同名变量的遮蔽可以解释；引用未定义名字和对错误类型做运算都在执行前被识别。

3. [LLVM IR 实战](04-intermediate-representation/02-llvm-ir-in-practice.md) → [链接与加载](07-runtime/02-linking-and-loading.md)。

   把已检查的程序接到一种执行路径。可先写 AST 解释器，再用文中的 LLVM 示例理解 IR、目标文件与链接。自检：同一有效输入两种实现结果一致，能区分编译成功与链接成功。

## 选读与前置边界

[正则与自动机](01-lexical-analysis/01-regular-expressions-and-automata.md)解释词法识别的基础；[LR 分析](02-syntax-analysis/02-lr-parsing.md)是另一条解析路线，无需把 LL 与 LR 同时实现才算入门。之后再读 [SSA](04-intermediate-representation/01-ssa-form.md) → [数据流分析](05-optimization/01-data-flow-analysis.md) → [经典优化](05-optimization/02-classic-optimizations.md)。优化前后需要比较语义，不能只看指令减少。JIT、GC、寄存器分配和 LSP 按项目需求选读。

## 完成主线的交付物

保留一组正常输入、优先级边界、错误输入和作用域反例。用一页图说明字符、token、AST、语义检查与执行结果的关系，展示一次错误从输入定位到诊断的全过程。看不懂 ABI 时，接[系统编程路线](../systems-programming/00-learning-path.md)，无需提前读完内核。

首次阅读允许跳过长证明和实现细节，但要先完成各阶段自检。出现“知道术语、解释不了结果”时，回到当前例子改变一个条件，再进入下一篇；不需要先通读整个目录。
