别只背理论,这门课让你亲手造出语言

很多人学编译原理,卡在抽象语法树和产生式推导里,最后只记住了考点,却不知道为什么要有“中间代码生成”这一步。这门课不跟你绕弯子,它解决的核心问题是:**如何把一个人类写的文本,变成机器能执行的指令**。

课程采用“原理篇 + 工具篇”双线并行结构。前半段从零开始,用正则文法和有限自动机纯手工打造词法分析器;接着通过公式计算器实战,理解递归下降和 LL(1) 分析的痛点;再引入 Antlr 工具,体验从手写解析到自动生成器的思维跃迁。后半段深入语义层,逐个攻克作用域、面向对象封装和闭包——这些不仅是面试题高频考点,更是你理解 JavaScript、Python 等现代语言运行时机制的基石。

适合谁?学前先看这三块

**基础要求**:你需要熟悉至少一门编程语言(如 Java 或 Python),了解函数、类、循环等基本结构即可。无需前置编译器知识,但如果你从未写过解析器,前几节课会有些陡峭。

**建议学习顺序**:
1. **开篇词**:先建立全局认知,明白“词法/语法/语义”三分法在工程中的意义。
2. **01-05 讲**:这是最关键的实操阶段。不要跳过“手工打造”环节,只有手写过一遍递归下降,才能真懂 Antlr 替你省了什么。
3. **06-07 讲**:用 Antlr 重构脚本语言,对比前后代码量,理解工具的价值边界。
4. **08-10 讲**:作用域、封装、闭包。这部分直接关联你日常编程中的 bug 根源,务必结合练习调试。

**资料配合**:课程提供配套的脚本语言项目源码。建议你边看边在本地复现每个阶段的实现,尤其是期中考试前的练习——那是检验你是否真能独立写出一个简单编译器前端的最佳时机。

学完能独立做什么

完成本课程后,你将具备以下能力:

- **独立设计并实现一门小型脚本语言的编译器前端**,包括词法分析、语法分析和语义分析模块。
- **理解并应用 Antlr 等解析器生成工具**,能快速搭建企业级 DSL(领域特定语言)的前端架构。
- **深入解释闭包、作用域链、类型系统**等高级特性背后的编译期机制,不再畏惧语言底层细节。
- **在面试中清晰阐述**从源码到目标代码的完整转化流程,并能针对具体语言(如 Python 的动态类型 vs Java 的静态检查)进行比较分析。

这门课不是理论科普,而是一次完整的“造轮子”实践。当你亲手让一段自定义语法运行起来时,你会真正看懂那些曾经晦涩的概念。

课程目录

开篇词 (1讲)

  1. 开篇词 _ 为什么你要学习编译原理?

编译原理 · 期中考试周 (1讲)

  1. 期中考试 _ 来赴一场100分的约定吧!

实现一门脚本语言 · 原理篇 (13讲)

  1. 01 _ 理解代码:编译器的前端技术
  2. 02 _ 正则文法和有限自动机:纯手工打造词法分析器
  3. 03 _ 语法分析(一):纯手工打造公式计算器
  4. 04 _ 语法分析(二):解决二元表达式中的难点
  5. 05 _ 语法分析(三):实现一门简单的脚本语言
  6. 06 _ 编译器前端工具(一):用Antlr生成词法、语法分析器
  7. 07 _ 编译器前端工具(二):用Antlr重构脚本语言
  8. 08 _ 作用域和生存期:实现块作用域和函数
  9. 09 _ 面向对象:实现数据和方法的封装
  10. 10 _ 闭包: 理解了原理,它就不反直觉了
  11. 11 _ 语义分析(上):如何建立一个完善的类型系统?
  12. 12 _ 语义分析(下):如何做上下文相关情况的处理?
  13. 13 _ 继承和多态:面向对象运行期的动态特性

实现一门脚本语言 · 应用篇 (2讲)

  1. 14 _ 前端技术应用(一):如何透明地支持数据库分库分表?
  2. 15 _ 前端技术应用(二):如何设计一个报表工具?

实现一门脚本语言 · 算法篇 (3讲)

  1. 16 _ NFA和DFA:如何自己实现一个正则表达式工具?
  2. 17 _ First和Follow集合:用LL算法推演一个实例
  3. 18 _ 移进和规约:用LR算法推演一个实例

实现一门脚本语言 · 热点答疑与用户故事 (2讲)

  1. 19 _ 案例总结与热点问题答疑:对于左递归的语法,为什么我的推导不是左递归的?
  2. 用户故事 _ 因为热爱,所以坚持

实现一门编译型语言 · 原理篇 (12讲)

  1. 20 _ 高效运行:编译器的后端技术
  2. 21 _ 运行时机制:突破现象看本质,透过语法看运行时
  3. 22 _ 生成汇编代码(一):汇编语言其实不难学
  4. 23 _ 生成汇编代码(二):把脚本编译成可执行文件
  5. 24 _ 中间代码:兼容不同的语言和硬件
  6. 25 _ 后端技术的重用:LLVM不仅仅让你高效
  7. 26 _ 生成IR:实现静态编译的语言
  8. 27 _ 代码优化:为什么你的代码比他的更高效?
  9. 28 _ 数据流分析:你写的程序,它更懂
  10. 29 _ 目标代码的生成和优化(一):如何适应各种硬件架构?
  11. 30 _ 目标代码的生成和优化(二):如何适应各种硬件架构?
  12. 加餐 _ 汇编代码编程与栈帧管理

实现一门编译型语言 · 应用篇 (2讲)

  1. 31 _ 内存计算:对海量数据做计算,到底可以有多快?
  2. 32 _ 字节码生成:为什么Spring技术很强大?

实现一门编译型语言 · 扩展篇 (3讲)

  1. 33 _ 垃圾收集:能否不停下整个世界?
  2. 34 _ 运行时优化:即时编译的原理和作用
  3. 35 _ 案例总结与热点问题答疑:后端部分真的比前端部分难吗?

面向未来的编程语言 (3讲)

  1. 36 _ 当前技术的发展趋势以及其对编译技术的影响
  2. 37 _ 云编程:云计算会如何改变编程模式?
  3. 38 _ 元编程:一边写程序,一边写语言

结束语 (2讲)

  1. 第二季回归 _ 这次,我们一起实战解析真实世界的编译器
  2. 结束语 _ 用程序语言,推动这个世界的演化

结课测试 (1讲)

  1. 结课测试 _ 编译原理的这些知识,你都掌握了吗?