为什么你需要亲手写一门语言?
在开发工作中,我们习惯了使用 TypeScript、Python 或 Go 这些成熟的“工业级”工具,却往往对它们底层的运作机制一无所知。当代码运行出现性能瓶颈,或者需要处理复杂的元编程需求时,这种黑盒状态会让你无从下手。这门课程的核心价值,正是通过手写一个完整的编译器栈,强行打破你对编程语言的黑盒认知。你不需要从零发明一套语法,而是站在计算机科学的前沿,复现编译器诞生的经典路径:从字符流到 Token,从抽象语法树到字节码,再到最终的虚拟机执行。这种“知其然更知其所以然”的能力,是普通 CRUD 工程师迈向系统级架构师的必经之路。
适合谁学?建议先看哪里?
这门课有明确的门槛。它要求读者具备扎实的 TypeScript 基础,因为课程后半段的虚拟机实现完全基于 TypeScript 展开;同时,你需要对程序运行的基本原理有一定概念,了解什么是堆栈、内存分配等基础计算机科学常识。如果你是纯前端新手,或者完全没有接触过编译原理的任何碎片知识,直接上手可能会有挫败感。建议学习顺序如下:首先仔细研读开篇的两讲热身内容,建立对“词法分析”和“语法分析”的宏观直觉;接着重点攻克起步篇的 01 到 06 讲,这是构建语言表层结构的关键,务必确保自己能独立写出简单的解析器;最后再进入 07 和 08 讲,理解虚拟机与字节码的设计哲学。切勿跳步,因为底层理解的偏差会导致后续调试成本指数级上升。
学完能做什么?资料如何配合?
完成本课程后,你将不再只是语言的“使用者”,而是具备设计微型语言能力的“创造者”。你可以独立实现一门支持变量、函数、条件循环的 DSL(领域特定语言),并能解释类型系统在编译期是如何被检查和转换的。更重要的是,你对 TypeScript 类型系统、JIT 编译优化甚至 JavaScript 引擎底层机制的理解将产生质的飞跃。配套资料包中的代码示例并非标准答案,而是引导你填补逻辑缺口的脚手架。练习时,请务必先尝试自己写出词法分析器和递归下降解析器的核心逻辑,再对照资料中的实现进行差异比对。不要急于求成地复制粘贴代码,因为在这个过程中,每一个让你卡壳的 Bug,恰恰是你理解编译器内部机制的最佳契机。只有亲手踩过那些逻辑陷阱,你才能真正掌握这门“屠龙技”的精髓。
课程目录
开篇词 (2讲)
- 开篇词|让我们来写一门计算机语言吧
- 课前热身|开始学习之前我们要准备什么?
不定时加餐 (1讲)
- “屠龙之秘”|实现计算机语言这样的技术能用在哪里?(一)
期中测试 (1讲)
- 期中测试|快来检验你在起步篇的学习成果吧
用户分享 (1讲)
- “他山之石”|Sugar:这门课你可以试试这么学
起步篇:让一门超简单的语言跑起来 (21讲)
- 01|实现一门超简单的语言最快需要多久?
- 02|词法分析:识别Token也可以很简单吗?
- 03|支持表达式:解析表达式和解析语句有什么不同?
- 04|如何让我们的语言支持变量和类型?
- 05|函数实现:是时候让我们的语言支持函数和返回值了
- 06|怎么支持条件语句和循环语句?
- 07|怎么设计属于我们自己的虚拟机和字节码?
- 08|基于TypeScript的虚拟机(一):实现一个简单的栈机
- 09|基于TypeScript的虚拟机(二):丰富特性,支持跳转语句
- 10|基于C语言的虚拟机(一):实现一个简单的栈机
- 11|基于C语言的虚拟机(二):性能增长10倍的秘密
- 12|物理机上程序运行的硬件环境是怎么样的?
- 13|物理机上程序运行的软件环境是怎么样的?
- 14|汇编代码学习(一):熟悉CPU架构和指令集
- 15|汇编语言学习(二):熟悉X86汇编代码
- 16|生成本地代码第1关:先把基础搭好
- 17|生成本地代码第2关:变量存储、函数调用和栈帧维护
- 18|生成本地代码第3关:实现完整的功能
- 19|怎么实现一个更好的寄存器分配算法:原理篇
- 20|怎么实现一个更好的寄存器分配算法:实现篇
- 21|加深对栈的理解:实现尾递归和尾调用优化
进阶篇:让我们的语言更实用 (14讲)
- 22|增强编译器前端功能第1步:再识数据流分析技术
- 23|增强编译器前端功能第2步:增强类型体系
- 24|增强编译器前端功能第3步:全面的集合运算
- 25|增强编译器前端功能第4步:综合运用多种语义分析技术
- 26|增强更丰富的类型第1步:如何支持浮点数?
- 27|增加更丰富的类型第2步:如何支持字符串?
- 28|增加更丰富的类型第3步:支持数组
- 29|面向对象编程第1步:先把基础搭好
- 30|面向对象编程第2步:剖析一些技术细节
- 31|面向对象编程第3步:支持继承和多态
- 32|函数式编程第1关:实现高阶函数
- 33|函数式编程第2关:实现闭包特性
- 34|内存管理第1关:Arena技术和元数据
- 35|内存管理第2关:实现垃圾回收
优化篇:让程序的性能更高 (6讲)
- 36|节点之海:怎么生成基于图的IR?
- 37 _ 从AST到IR:体会数据流和控制流思维
- 38|中端优化第1关:实现多种本地优化
- 39|中端优化第2关:全局优化要怎么搞?
- 40|中端优化第3关:一起来挑战过程间优化
- 41|后端优化:生成LIR和指令选择
展望篇:实现自主语言的征途 (2讲)
- 42|到这里,我们的收获和未尽的工作有哪些?
- 期末考试|实现编程语言这些核心知识点,你掌握得咋样了?
结束语 (1讲)
- 结束语|等待你大展身手的那些领域





