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

news2024/9/22 9:56:02

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

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/67869.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端知识大全之CSS

目录 一、概念讲解 学习CSS之前必学的HTML (超链接) 二、正文代码 1.行内样式 2.内部样式(选择器) 3.外部样式 4.样式的优先级 5.简单选择器之定义单个标签(id) 6.简单选择器之定义多个标签&#xff…

低代码平台,企业业务创新的最佳路径

数字化转型的必然趋势及面临的问题 数字经济时代,数字化转型是企业在行业赛道上领先的必经之路,然而,数字化转型升级的道路并不是畅通无阻的,也不是企业单枪匹马就能干成的,各个企业在转型过程中都或多或少会遇到技术…

MySQL-索引

一、介绍 索引是数据库对象之一,用于提高字段检索效率,使用者只需要对哪个表中哪些字段建立索引即可,其余什么都不做,数据库会自行处理。 索引提供指向存储在表的指定列中的数据值的指针,如同图书的目录,…

【MMDetection】MMDetection中AnchorGenerator学习笔记

文章目录初始化-AnchorGenerator()Anchor平移-grid_priors计算有效anchor-valid_flags参考文献初始化-AnchorGenerator() TASK_UTILS.register_module() class AnchorGenerator:def __init__(self, strides, ratios, scalesNone, base_sizesNone, scale_majorTrue, octave_bas…

numpy的部分通用函数浅谈

numpy的部分通用函数 1.数组算术运算符 运算符对应的通用函数描述np.add加法运算(即112)-np.substract减法运算(即3-21)-np.negative负数运算(即-2)*Nnp.multiply乘法运算(即2*36)/np.divide除…

Optional用法与争议点

Optional用法与争议点 简介 要说Java中什么异常最容易出现,我想NullPointerException一定当仁不让,为了解决这种null值判断问题,Java8中提供了一个新的工具类Optional,用于提示程序员注意null值,并在特定场景中简化代…

软件测试8年,却被应届生踩在头上,是应届生太牛了,还是我们太弱了?

前几天有个朋友向我哭诉,说他在公司干了8年的软件测试,却被一个实习生代替了,该何去何从? 这是一个值得深思的问题,作为职场人员,我们确实该思考,我们的工作会被实习生代替吗?这是一个很尖锐的问题&…

MFC基于对话框——仿照Windows计算器制作C++简易计算器

目录 一、界面设计 二、设置成员变量 三、初始化成员变量 四、初始化对话框 ​五、添加控件代码 1.各个数字的代码(0~9) 2.清除功能的代码 3.退格功能的代码 4.加减乘除功能的代码 5.小数点功能的代码 6.正负号功能的代码 7.等于功能的代码…

算法day42|背包问题

目录 01背包问题 二维 01背包问题 一维 416. 分割等和子集 背包问题分为:01背包,完全背包,多种背包01背包指的是有n种物品,每种物品只能取一个完全背包指的是有n种物品,每种物品可以取无限个多种背包指的是有n种物品,每…

公众号网课搜题接口

公众号网课搜题接口 本平台优点: 多题库查题、独立后台、响应速度快、全网平台可查、功能最全! 1.想要给自己的公众号获得查题接口,只需要两步! 2.题库: 查题校园题库:查题校园题库后台(点击…

常用的在线工具网站

1,在线Photoshop软件 https://www.uupoop.com/ PS在线图片编辑器是一个专业精简的在线ps图片照片制作处理软件工具,绿色免安装,免下载,直接在浏览器打开就可用它修正,调整和美化图像。 2,bilibili视频编辑器 https://bilibili.clipchamp.com/ 由哔哩哔哩…

(保姆级)国内1块钱注册火爆全网的OpenAI-ChatGPT机器人

下面有给出完整的注册流程。首先介绍一下它是什么,如果只想看注册往下翻! 1块钱注册火爆全网的OpenAI-ChatGPT机器人OpengAI-ChatGPT能做什么如何注册1块钱收取验证码使用注册的账号登录ChatGPTOpengAI-ChatGPT能做什么 我作为一个程序员用了一段时间&a…

金蝶云星空生产管理(冲刺学习)

物料“基本”和“生产”相关属性字段介绍 物料属性:生产中常用的物料属性包括自制、委外、外购、虚拟、配置、特征。 自制:一般是指由企业自己生产的物料,一般会建BOM、生产订单; 委外:是指委托给其他加工单位进行加工…

DevTools 无法加载来源映射:无法加载 chrome-extension: 警告的原因以及如何去除(全网最全 最详细解决方案)

是类似这样的一个警告。每次都有看着还是挺难受的。 这个警告的原因是你的浏览器插件造成的。例如警告已经很明确的告诉你是chrome-extension,也就是谷歌插件的问题。后面的字符串其实就是这个插件的id。 chrome-extension://cfhdojbkjhnklbpkdaibdccddilifddb/br…

QT笔记——QSlider滑动条滚轮事件和点击鼠标位置事件问题

需求:我们需要对一个滑动条 滚轮事件 和 点击到滑动条的位置 实时显示 问题:其中在做的时候遇到了很多的问题,一开始感觉很简单,现在将这些问题记录下来 ui图: 问题1:处理QSlider 滚轮事件的时候 这里有…

AlphaFold2源码解析(8)--模型之三维坐标构建

AlphaFold2源码解析(8)–模型之三维坐标构建 这个模块我们讲解AlphaFold的Structure module模块,该结构模块将蛋白质结构的抽象表示映射为具体的三维原子坐标。 Evoformer的单一表征被用作初始单一表征siinitial{s^{initial}_i }siinitial​,siinitial∈…

同步整流 降压恒流 输入4-40V 功率可达40W 电流3.6A 原理图

◆PCB 布线参考PCB 布局应遵循如下规则以确保芯片的正常工作。1:功率线包括地线,LX线和VIN线应该尽量做到短、 直和宽。2:输入电容应尽可能靠近芯片管脚(VIN 和 )。输入电源引脚可增加一个 0.1uF 的陶瓷电容以增强芯片的抗高频噪声能力。3:功…

小迪-day13(MySQL注入)

一、information_schema information_schema 数据库跟 performance_schema 一样,都是 MySQL 自带的信息数据库。其中 performance_schema 用于性能分析,而 information_schema 用于存储数据库元数据(关于数据的数据),例如数据库名、表名、列…

信号和电源隔离的有效设计技术

介绍 如今,电子产品设计师比以往任何时候都更面临着一系列共同的目标:实现更高的吞吐量、更高的分辨率、更高效的系统和缩短上市时间。在工业自动化、医疗电子或电信系统等领域,通常需要电隔离多个信号,以使子系统能够共享数据或…

农民歌唱家大衣哥外出商演,大衣嫂在家晒麦子,真是一对金童玉女

在中国华语乐坛,曾经有很多对模范夫妻,比如说任静和付笛声,他们也是音乐领域的金童玉女。其实大家都忽略了一对夫妻,农民歌唱家大衣哥,和他的结发妻子玉华,同样是中国华语乐坛的骄傲。 只是因为大衣哥过于低…