• 翻译: 如何学习编译器: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/

  • 相关阅读:
    JavaScript中遍历对象的方法
    4 | Java Spark实现 WordCount
    考研日常记录(upd 24.4.24)
    ICCV 2023|小红书 4 篇入选论文亮点解读,「开集视频目标分割」获得 Oral
    django系列之事务操作
    如何去掉照片中多余路人?一分钟帮你搞定
    thinkPHP基于php的枣院二手图书交易系统--php-计算机毕业设计
    Vue.js 响应式系统深度剖析
    StarkNet新手指南
    leetCode 337. 打家劫舍 III 动态规划 房子都连成树了,偷不偷呢? “树形dp“ (递归三部曲 + 动规五部曲)
  • 原文地址:https://blog.csdn.net/zgpeace/article/details/128210360