编译器和编程语言是一个很大的话题。您不能只选择学习路径并在某个时候完成它。有许多不同的区域,每个区域都是无穷无尽的。
在这里,我想分享一些有助于学习编译器的链接。这份清单不可能详尽无遗——每个人都很忙,没有人有时间阅读龙书。
每个链接背后的主要标准:
- 我可以亲自推荐这些材料
- 每个条目应该相对较短,并且可以在合理的时间内消费
我非常喜欢通过练习来学习。因此,主要关注点是 LLVM,因为您可以使用实际程序做一些很酷的事情!
该列表由四组组成:一般理论、前端、中端和后端。
在第一次运行时,您可以从每组中取出第一项,这应该会让您踏实。
1. 一般理论/介绍
-
AOSA 书籍:LLVM。这是《开源应用程序体系结构》一书中的一章。它由 Chris Lattner 编写,涵盖高级 LLVM 设计。
-
编译器。该课程由 Alex Aiken 教授。在本课程中,您将从头开始为真正的编程语言构建编译器。它涵盖了整个编译管道:解析、类型检查、优化、代码生成。除了实践部分,它还深入探讨了理论。
-
自动机理论。该课程由 Jeffrey Ullman 教授。这个在理论上相当沉重。它从相对简单的主题开始,例如状态机和有限自动机(确定性和其他)。它逐渐转向更复杂的事物,例如图灵机、计算复杂性、著名的 P 与 NP 等。
或者
- 计算理论。本课程由 Michael Sipser 教授。它与上面的类似,但以不同的风格提供。它对特定主题进行了更详细的介绍。
2. 前端
编译器前端是与实际源代码进行交互的地方。编译器将源代码解析为抽象语法树(AST),进行语义分析和类型检查,并将其转换为中间表示(IR)。
上面的编译器课程涵盖了一般部分。以下是一些特定于 Clang 的链接:
-
了解 Clang AST。本文由 Jonas Devlieghere 撰写。它详细介绍了 Clang 的 AST 的实现细节。它也有很多很好的链接,可以更深入地研究这个主题。
-
clang-tutor。这个存储库由 Andrzej Warzyński 维护。它包含几个涵盖各种主题的 Clang 插件,从简单的 AST 遍历到更复杂的主题,如自动重构和混淆。
3. 中端
中端是发生各种优化的地方。通常,中端使用一些中间表示。LLVM 的中间表示通常称为 LLVM IR 或 LLVM Bitcode。简而言之,它是一种用于伪机器(即 IR 不针对任何特定 CPU)的人类可读汇编语言。LLVM IR 维护某些属性:它采用静态单一分配 (SSA) 形式,组织为控制流图 (CFG)。
-
LLVM IR 教程 - Phis、GEP 和其他东西!. 这是 Vince Bridgers 和 Felipe de Azevedo Piovezan 的精彩演讲。
-
LLVM 简介。Eric Christopher 和 Johannes Doerfert 提供的来自 LLVM 开发人员会议的一小时长的演讲/教程。另一个很棒的教程更好地建立在上一个视频之上。
-
CS 6120:高级编译器。该课程由 Adrian Sampson 教授。标题说“高级”,但它涵盖了人们对现代生产级编译器的期望:SSA、CFG、优化、各种分析。
-
比特码揭秘 ( 🔌 )。它给出了 LLVM 位码是什么的高级描述。
-
llvm-tutor。这个也是来自 Andrzej Warzyński。它涵盖了 LLVM 插件(所谓的 pass),允许人们分析和转换 LLVM IR 形式的程序。
4. 后端
编译的最后阶段是后端。此阶段旨在将中间表示转换为机器代码(零和一)。后面的 0 和 1 可以在 CPU 上运行。因此,要了解后端,您需要了解机器代码以及 CPU 的工作原理。
-
从第一原理构建现代计算机:从 Nand 到俄罗斯方块。由 Shimon Schocken 和 Noam Nisan 授课。本课程从头开始:首先,您构建逻辑门(与、或、异或等),然后使用逻辑门构建算术逻辑单元 (ALU),然后使用 ALU 构建 CPU。然后你学习如何用 0 和 1(机器代码)控制 CPU,最后,你开发你的汇编器来将人类可读的汇编转换成机器代码。
-
解析 Mach-O 文件(🔌)。它展示了如何在 macOS (Mach-O) 上解析目标文件。如果您使用的是 Linux 或 Windows,请分别搜索关于elf和PE/COFF文件的类似文章。
-
现代 CPU 的性能分析和调优。丹尼斯·巴赫瓦洛夫 (Denis Bakhvalov) 的书。虽然它是关于性能的,但它很好地介绍了 CPU 的工作原理。
5. 更多学习资源
以下是我推荐查看的更多 LLVM 相关频道:
-
LLVM 的 YouTube 频道。在这里你可以找到很多来自开发者会议的演讲。
-
LLVM Weekly.。由 Alex Bradbury 运营的每周时事通讯。这是我所知道的唯一一份没有广告的时事通讯!
-
LLVM Blog。这是 LLVM 的博客。
-
LLVM Tutorials。好的起点,即使您对编译器一无所知。
-
嵌入学术界。John Regehr 的博客有很多关于 LLVM 和编译器的好东西!
6. 祝你好运
编译器是一个巨大的领域!如果你浏览了上面的材料,你会学到很多东西,但你在整个编译管道中仍然会有一些知识空白(我当然有)。但好处是 - 您会知道差距是什么以及如何解决它们!
祝你好运!
参考
https://lowlevelbits.org/how-to-learn-compilers-llvm-edition/