使用 LLVM 开发新语言 Kaleidoscope 教程

本贴最后更新于 1638 天前,其中的信息可能已经时移俗易

原文链接: 使用 LLVM 开发新语言 Kaleidoscope 教程

前言: 本系列是 My First Language Frontend with LLVM Tutorial 译文,诣在熟悉 LLVM 的开发流程,网上有一些翻译只有前三个部分,没有翻译全,并且都是四五年前的没有更新过。由于对于编译器的概念只停留在理论上,想从代码的角度深入理解一下编译器,希望通过这部分的练习可以帮助到我。利用国庆假期这几天,我会仔细阅读此系列文档及源码并尝试翻译和记录。

要求: 本教程只需要了解 C++ 语言知识,编译器的相关经验不是必需的。

本教程介绍了一种简单语言的实现,展示了它多么有趣和轻松。本文将帮助我们快速入门,运行并演示使用 LLVM 生成代码的具体示例。

本教程将开发一个简单的“Kaleidoscope”语言,并在连续几章中对其进行迭代构建,并展示如何逐步构建。这样一来,我们就可以涵盖一系列语言设计和 LLVM 特定思想,一路展示和解释其代码,并减少大量的细节分析。我们强烈建议动手复制修改并运行代码,以此加深对编译器实现的理解。

友情提示: 为了专注于专门讲授编译器技术和 LLVM,本教程没有展示软件工程原理的最佳实践。例如,代码普遍使用全局变量,不使用 visiters 设计模式等,而是使事情保持简单并专注于手头的编译器实现。

本教程分为以下十章,涵盖各个主题,你可以随意跳过从感兴趣的地方开始看:

  • 第一章:Kaleidoscope 语言和 Lexer 这部分展示了我们要做的基本功能。词法分析器也是构建语言解析器的第一部分,我们使用了易于理解的简单 C++ 词法分析器。
  • 第二章:实现解析器和 AST 有了词法分析器,我们可以讨论解析技术和基本 AST 构造。本章介绍了递归下降解析和运算符优先级解析。
  • 第三章: 生成 LLVM 中间代码 IR 在准备好 AST 之后,我们将展示 LLVM 生成 IR 的简便性,并展示了一种将 LLVM 集成到项目中的简单方法。
  • 第四章: 添加 JIT 和 Optimizer 支持 LLVM 的一大优点是它对 JIT 编译的支持,因此我们将深入探讨它,并展示添加 JIT 支持所需的三行内容。后面的章节介绍了如何生成.o 文件。
  • 第五章: 扩展语言---控制流 随着基本语言的启动和运行,我们展示了如何通过控制流操作(“ if”语句和“ for”循环)进行扩展。这使我们有机会讨论 SSA 的构建和控制流程。
  • 第六章: 扩展语言---用户定义运算符 本章扩展了语言,使用户可以定义任意一元和二进制运算符并具有相应的优先级。这使我们可以将很大一部分“语言”构建为库例程。
  • 第七章: 扩展语言---可变变量 本章节讨论如何用赋值语句添加用户自定义地本地变量。有趣的是,构造 SSA 在 LLVM 是相当简单的,但是 LLVM 并不要求你的前端来构造 SSA 结构。
  • 第八章: 编译为目标代码 本章介绍如何获取 LLVM IR 并将其编译为目标代码,就像静态编译器一样。
  • 第九章: 增加调试信息 一种真正的语言需要支持调试器,因此我们添加了调试信息,该信息允许在 Kaleidoscope 函数中设置断点,输出参数变量和调用函数!
  • 第十章: 总结和其他技巧 本章通过讨论扩展语言的方式来总结本系列,并包括指向“special topics”的信息的指针,例如添加垃圾收集支持、异常处理、调试和对“spaghetti stacks”的支持等。

在本教程结束时,我们将编写不超过 1000 行(除去注释和空行)代码。借助少量的代码,我们将为一个普通的语言构建一个功能齐全的小型编译器,其中包括手写词法分析器,解析器,AST,以及代码生成(包括静态编译和 JIT 编译)。这种扩展充分证明了 LLVM 的优势,并说明了为什么 LLVM 被众多语言设计人员和其他研究高性能代码生成的人所喜爱。


参考:My First Language Frontend with LLVM Tutorial

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • Ever

    卧槽,这么顶吗?收藏了。

    1 回复
  • Hanseltu
    作者

    😂 有机会多交流~

  • beanflame

    卧槽,这写的好么,那就收藏一下了

推荐标签 标签

  • RIP

    愿逝者安息!

    8 引用 • 92 回帖 • 286 关注
  • LaTeX

    LaTeX(音译“拉泰赫”)是一种基于 ΤΕΧ 的排版系统,由美国计算机学家莱斯利·兰伯特(Leslie Lamport)在 20 世纪 80 年代初期开发,利用这种格式,即使使用者没有排版和程序设计的知识也可以充分发挥由 TeX 所提供的强大功能,能在几天,甚至几小时内生成很多具有书籍质量的印刷品。对于生成复杂表格和数学公式,这一点表现得尤为突出。因此它非常适用于生成高印刷质量的科技和数学类文档。

    9 引用 • 32 回帖 • 179 关注
  • OpenShift

    红帽提供的 PaaS 云,支持多种编程语言,为开发人员提供了更为灵活的框架、存储选择。

    14 引用 • 20 回帖 • 596 关注
  • BND

    BND(Baidu Netdisk Downloader)是一款图形界面的百度网盘不限速下载器,支持 Windows、Linux 和 Mac,详细介绍请看这里

    107 引用 • 1281 回帖 • 21 关注
  • 正则表达式

    正则表达式(Regular Expression)使用单个字符串来描述、匹配一系列遵循某个句法规则的字符串。

    31 引用 • 94 回帖
  • IPFS

    IPFS(InterPlanetary File System,星际文件系统)是永久的、去中心化保存和共享文件的方法,这是一种内容可寻址、版本化、点对点超媒体的分布式协议。请浏览 IPFS 入门笔记了解更多细节。

    20 引用 • 245 回帖 • 232 关注
  • 服务

    提供一个服务绝不仅仅是简单的把硬件和软件累加在一起,它包括了服务的可靠性、服务的标准化、以及对服务的监控、维护、技术支持等。

    41 引用 • 24 回帖
  • NetBeans

    NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。

    78 引用 • 102 回帖 • 636 关注
  • Swift

    Swift 是苹果于 2014 年 WWDC(苹果开发者大会)发布的开发语言,可与 Objective-C 共同运行于 Mac OS 和 iOS 平台,用于搭建基于苹果平台的应用程序。

    34 引用 • 37 回帖 • 496 关注
  • WebClipper

    Web Clipper 是一款浏览器剪藏扩展,它可以帮助你把网页内容剪藏到本地。

    3 引用 • 9 回帖 • 2 关注
  • IDEA

    IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

    180 引用 • 400 回帖
  • 大数据

    大数据(big data)是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

    89 引用 • 113 回帖
  • Redis

    Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

    284 引用 • 247 回帖 • 212 关注
  • SEO

    发布对别人有帮助的原创内容是最好的 SEO 方式。

    35 引用 • 200 回帖 • 17 关注
  • Mobi.css

    Mobi.css is a lightweight, flexible CSS framework that focus on mobile.

    1 引用 • 6 回帖 • 689 关注
  • gRpc
    10 引用 • 8 回帖 • 48 关注
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    9 引用 • 83 回帖
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    160 引用 • 470 回帖
  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖 • 1 关注
  • 单点登录

    单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    9 引用 • 25 回帖 • 8 关注
  • Sphinx

    Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

    1 引用 • 170 关注
  • Vue.js

    Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

    261 引用 • 662 回帖 • 2 关注
  • Gzip

    gzip (GNU zip)是 GNU 自由软件的文件压缩程序。我们在 Linux 中经常会用到后缀为 .gz 的文件,它们就是 Gzip 格式的。现今已经成为互联网上使用非常普遍的一种数据压缩格式,或者说一种文件格式。

    9 引用 • 12 回帖 • 105 关注
  • 链滴

    链滴是一个记录生活的地方。

    记录生活,连接点滴

    126 引用 • 3621 回帖
  • Ruby

    Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。在 Ruby 社区,松本也被称为马茨(Matz)。

    7 引用 • 31 回帖 • 166 关注
  • GitBook

    GitBook 使您的团队可以轻松编写和维护高质量的文档。 分享知识,提高团队的工作效率,让用户满意。

    3 引用 • 8 回帖 • 1 关注
  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    138 引用 • 268 回帖 • 219 关注