翻译: 如何学习编译器:LLVM Edition

Posted AI架构师易筋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了翻译: 如何学习编译器:LLVM Edition相关的知识,希望对你有一定的参考价值。

编译器和编程语言是一个很大的话题。您不能只选择学习路径并在某个时候完成它。有许多不同的区域,每个区域都是无穷无尽的。

在这里,我想分享一些有助于学习编译器的链接。这份清单不可能详尽无遗——每个人都很忙,没有人有时间阅读龙书

每个链接背后的主要标准:

  • 我可以亲自推荐这些材料
  • 每个条目应该相对较短,并且可以在合理的时间内消费

我非常喜欢通过练习来学习。因此,主要关注点是 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/

以上是关于翻译: 如何学习编译器:LLVM Edition的主要内容,如果未能解决你的问题,请参考以下文章

如何自主开发一个LLVM后端

LLVM编译器

LLVM之父Chris Lattner:编译器的黄金时代

编译器简介

如何 AOT(提前)编译 C++ 程序

编译器入门:没有siri的那些年,我们如何实现人机对话?