编译器原理与实现: 使用 LLVM 创建自己的编程语言 | Programming Language with LLVM
编程语言的实践方法
你将会学到的
- LLVM 编译器基础设施
- LLVM 前端
- 使用 LLVM 创建自己的编程语言
- OOP:编译类
- 函数式编程:Lambda 函数和闭包
- 分支指令和控制流程
- LLVM IR
- 代码生成
要求
- 基本的 C++ 经验(必需)
说明
课程大纲
编程语言如何在幕后工作?编译器和解释器有什么区别?什么是虚拟机和JIT 编译器?那么函数式编程和命令式编程之间的区别是什么?
在实现编程语言时有很多问题!
学校中“编译器课程”的问题在于,此类课程通常被呈现为一些“硬核火箭科学”,仅适用于高级工程师。
此外,经典的编译器书籍从最不重要的主题开始,例如词法分析,直接深入到形式语法的理论方面。并且在实现第一个 Tokenizer 模块时,学生们对这个主题失去了兴趣,没有机会真正开始实现编程语言本身。所有这一切都蔓延到整整一个学期,在不了解编程语言的实际语义的情况下,弄乱了分词器和 BNF 语法。
我相信我们应该能够在 4-6 小时内构建和理解完整的端到端编程语言语义——内容直截了当,在现场编码会议中以结对编程的形式展示,并在可理解的方式。
在使用 LLVM类的编程语言中,我们专注于将我们的语言编译为LLVM IR,并构建一种较低级别的编程语言。与LLVM 编译器基础架构级别密切合作,您将了解低级编译和生产级语言(例如 C++、Rust 等)如今是如何工作的。
实现一门编程语言也会让你在其他编程语言方面的实践水平更加专业。
先决条件
这门课有三个先决条件。
Programming Language with LLVM课程是之前课程的自然延伸——编译器原理与实现: 从头开始构建解释器 | Building an Interpreter from scratch(也称为解释基础),我们还构建了一个完整的编程语言,但在更高的 AST 级别,并且还编译器原理与实现: 为编程语言构建虚拟机 | Building a Virtual Machine for Programming Language。除非您已经了解编程语言在此级别的工作方式,即什么是 eval、闭包、作用域链、环境和其他构造,否则您必须将解释器类作为先决条件。
此外,要降低生产语言所在的(bitcode/IR) 级别,我们需要具备基本的 C++ 经验。然而,此类与 C++无关,因此我们只使用非常基本的(并且可转移)到其他语言的结构。
这堂课是给谁的?
本课程面向任何好奇的工程师,他们希望获得构建复杂系统的技能(构建编程语言是一项高级工程任务!),并获得构建此类系统的可转移知识。
如果您对 LLVM、它的编译器基础结构以及如何构建您自己的语言特别感兴趣,那么本课程也适合您。
什么用于实施?
由于低级编译器是关于性能的,因此它们通常以低级语言(例如 C 或 C++)实现。这也正是我们使用的,但主要是 C++ 的基本功能,不会分散对 C++ 细节的注意力。代码应该可以轻松转换和移植到任何其他语言,例如 Rust 或什至更高级别的语言,如 Python。使用 C++ 还可以更轻松地实现进一步的 JIT 编译器。
注意:我们希望我们的学生自己真正遵循、理解和实现 LLVM 编译器的每个细节,而不是仅仅从最终解决方案中复制粘贴。尽管视频讲座中提供了该语言的完整源代码,但该项目的代码存储库包含/* Implement here */作业,学生必须解决这些作业。
这堂课有什么特点?
这些讲座的主要特点是:
- 简洁明了。每个讲座都是自给自足的,简洁的,并描述与主题直接相关的信息,而不是分散在不相关的材料或谈话上。
- 动画演示与实时编辑笔记相结合。这使得主题的理解更容易,并显示了对象结构是如何连接的。静态幻灯片根本不适用于复杂的内容。
- 带作业的端到端实时编码会话。完整的源代码,从头到尾都在视频讲座中展示
课程内容是什么?
课程分为四个部分,共20讲,每讲有多个子主题。下面是目录和课程表。
第 1 部分:LLVM 基本构造
在这一部分中,我们描述了编译和解释管道,开始构建我们的语言。讨论了 LLVM IR、对象、位码编译的主题。
第 2 部分:函数和堆栈
在这部分中,我们实现控制流结构,如 if 表达式和 while 循环,讨论堆栈变量、嵌套块和局部变量,以及编译函数。
第 3 部分:面向对象编程
在这部分我们实现 OOP 概念,例如类、实例,讨论堆分配和垃圾收集器。
第 4 部分:高阶函数
在这部分中,我们重点关注闭包、函数式编程、lambda 函数,并实现最终的可执行文件。
此课程面向哪些人:
- 编译器工程师
- 对编程语言感兴趣的好奇工程师
- 想要从头开始构建编程语言的开发人员
TheItzy » 编译器原理与实现: 使用 LLVM 创建自己的编程语言 | Programming Language with LLVM