编译器原理与实现: 从头开始构建解释器 | Building an Interpreter from scratch
编程语言的语义
你将会学到的
- 从头开始构建编程语言
- 解释器和编译器
- AOT、JIT 编译器和转译器
- AST 解释器和虚拟机
- 字节码、LLVM、堆栈机器
- 一流的函数、Lambda 和闭包
- 调用堆栈和激活记录
- OOP:类、实例和原型
- 模块和抽象
要求
- 基本数据结构和算法
- 图、树、遍历
说明
编程语言如何在幕后工作?编译器和解释器有什么区别?什么是虚拟机和JIT 编译器?那么函数式编程和命令式编程之间的区别呢?
在实现编程语言时有很多问题!
学校中“编译器课程”的问题在于,它们通常被呈现为一些“核心火箭科学”,仅适用于高级工程师。
此外,经典编译器书籍从最不重要的主题开始,例如词法分析,直接深入到形式语法的理论方面。而在实现第一个 Tokenizer 模块时,学生们只是对该主题失去了兴趣,没有机会真正开始实现编程语言本身。所有这一切都蔓延到整个学期都在搞乱标记器和 BNF 语法,而没有了解编程语言的实际语义。
我相信我们应该能够在 4-6 小时内构建和理解完整的端到端编程语言语义——内容直截了当,在实时编码会话中显示为结对编程,并在一种可以理解的方式。
在解释基础课程中,我们特别关注运行时语义,并为非常类似于 JavaScript 或 Python 的编程语言构建解释器。
实现一种编程语言也会使你对其他编程语言的实际使用水平更加专业。
这门课是为谁准备的?
本课程适用于任何好奇的工程师,他们希望获得构建复杂系统的技能(构建编程语言确实是一项非常高级的工程任务!),并获得构建此类系统的可转移知识。
如果您对编译器、解释器和源代码转换工具特别感兴趣,那么这门课也适合您。
这个类的唯一先决条件是基本的数据结构和算法:树、列表、遍历。
什么用于实施?
由于我们构建的语言在语义上与 JavaScript 或 Python(当今最流行的两种编程语言)非常相似,因此我们专门使用 JavaScript——其优雅的多范式结构结合了函数式编程、基于类和基于原型的 OOP,非常适合那。
许多工程师都熟悉 JavaScript,因此立即开始编码应该更容易。然而,在实现中,我们并不依赖于过于特定的 JS 结构,并且课程中的代码很容易移植到 TypeScript、Python、Java、C++、Rust 和您喜欢的任何其他语言。
注意: 我们希望我们的学生自己真正遵循、理解和实施解释器的每一个细节,而不是仅仅从最终解决方案中复制粘贴。该语言的完整源代码可在视频讲座中获得,展示和指导如何构建特定模块。
这门课有什么特别的?
这些讲座的主要特点是:
- 简明扼要。每个讲座都是自给自足的,简洁的,并描述与主题直接相关的信息,而不是分散在不相关的材料或谈话上。
- 动画演示与实时编辑笔记相结合。这使得对主题的理解更容易,并显示对象结构是如何(以及何时)连接的。静态幻灯片根本不适用于复杂的内容。
- 带作业的端到端实时编码会话。完整的源代码,从头开始,一直到最后都在视频讲座课程中呈现。在课程中,我们为我们的编程语言实现了一个完整的AST 解释器。
阅读材料
作为本课程的进一步阅读和附加文献,推荐以下书籍:
- Harold Abelson 和 Gerald Jay Sussman的计算机程序的结构和解释 (SICP)
- 编程语言:应用和解释 (PLAI)由 Shriram Krishnamurthi
课程内容是什么?
课程分为四个部分,共18节课,每节课设多个子课题。请参阅课程以获取详细的讲座说明。
第 1 部分:编译器速成课程
在这一部分中,我们描述了不同的编译和解释管道,查看 JIT 编译器和 AOT 编译器之间的区别,讨论什么是虚拟机和字节码解释器,以及它与 AST 解释器的区别,展示本机代码示例和 LLVM IR 等主题。
第 2 部分:解释器:基本表达式和变量
在这一部分中,我们开始构建我们的编程语言,并考虑基本的表达式,例如数字、字符串、谈论变量、范围和词法环境、控制结构和触摸解析器生成器。
第 3 部分:功能和功能编程
在这一部分中,我们开始讨论和实现函数抽象和函数调用。我们描述了闭包、lambda 函数和 IILE(立即调用的 lambda 表达式)的概念。此外,我们还涉及调用堆栈、递归和语法糖等主题。
第 4 部分:面向对象的编程
课程的最后一部分致力于我们语言中的面向对象支持。我们描述了基于类和基于原型的方法,实现了类、实例和模块的概念。
我希望你会喜欢这堂课,并且很乐意在评论中讨论任何问题和建议。
——德米特里·索什尼科夫
此课程面向哪些人:
- 好奇的工程师想要了解和理解编程语言如何在幕后工作
TheItzy » 编译器原理与实现: 从头开始构建解释器 | Building an Interpreter from scratch