[LLVM教程]LLVM之第一个语言前端

2023-10-27

目录:
[LLVM教程]LLVM之第一个语言前端
[LLVM教程]LLVM之第一个语言前端/“万花筒”:介绍与词法分析器
LLVM Tutorial: Table of Contents — LLVM 17.0.0git documentation
[LLVM]自制脚本语言实践
编译原理学习笔记

需求:这个教程假设你懂C++,但编译器经验不是必须的。

欢迎来到“LLVM之第一个语言前端”教程。我们通过实现一个简单的语言,来体验其乐趣与简单。本教程将展示一个使用LLVM生成代码的具体实例,来带你快速进入角色。

这个教程介绍了一个简单的语言“万花筒”,我们通过几章教程一步步构建它。这可以让我们感受到语言设计的多个层面以及LLVM的重要观念,同时教程也会展示和解释构建“万花筒”过程中的代码,并避免过度细节。我们强烈建议你制作一个代码的副本,并修改和试验。

警告:为了专注于教授编译器技术和LLVM,这个教程不关心软件工程原理中的最佳实践。例如,代码普遍使用全局变量,不使用访问器等等。但我们会尽量保持简单并专注于我们的话题。

该教程根据独立的话题划分了若干章节,可根据需求食用:

  • 第一章:“万花筒”与词语分析器(Lexer)——介绍我们的目标和想要构建的基本功能。一个词法分析器也是构建语言解析器的第一部分。我们搞一个简单又易于理解的的C++词法分析器。
  • 第二章:实现一个解析器(Parser)和抽象语法树AST——由词法分析器后,我们就可以讨论解析技术和基本的AST构建。本章解释了递归下降解析和运算符优先解析。
  • 第三章:生成LLVM中间代码(IR)——有抽象语法树后,我们会展示生成LLVM中间代码是多么容易,也会展示将LLVM融合到我们的项目中的简单方法。
  • 第四章:添加即时(JIT)和优化支持——LLVM的一个优点就是它支持即时编译,我们在这里深入讨论它,并展示添加JIT支持所需的三行代码。后面的章节将展示如何生成.o文件。
  • 第五章:扩展语言:控制流——语言启动和运行后,我们将展示如何扩展它使其支持控制流操作(“if”语句和“for”循环)。这给了我们一个讨论静态单赋值(SSA)构建和控制流的机会。
  • 第六章:扩展语言:用户定义操作符——本章扩展了语言,允许用户定义任意一元和二元运算符,并具有优先级分配能力!这允许我们构建语言的重要部分,库运行时。
  • 第七章:扩展语言:可变变量——本章讨论添加用户定义的附带赋值操作符的局部变量。它展示了从LLVM构建静态单赋值(SSA)的易用性:LLVM不需要前端构建静态单赋值形式就可以使用它。
  • 第八章:编译为目标文件——本章解释如何将LLVM IR编译为目标文件,就像静态编译器那样。
  • 第九章:调试信息——一个真正的语言需要支持调试器,所以我们添加了调试信息,这允许我们在“万花筒”的函数中设置断点、打印变量和调用函数!
  • 第十章:结论与花絮——本章通过讨论扩展语言的方法来结束本系列,并包括“特殊主题”信息的指向信息,像添加垃圾回收支持、异常、调试、“意大利面栈”的支持等。

到本教程结束时,我们将编写不到1000行代码(除注释和空行)。仅如此少量的代码,我们就可以构建一个不错的小编译器来构建一个非凡的语言——它包括一个手写的词法分析器、解析器、抽象语法树和代码生成支持,包括静态和即时!这一点充分证明了LLVM的能力,并说明了它为什么对于语言设计师和其它需要高性能代码生成的人是如此热门的对象。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[LLVM教程]LLVM之第一个语言前端 的相关文章

随机推荐

  • Android studio4.0 内嵌 UnityActivity

    Android studio4 0 内嵌 UnityActivity 用最简单方法嵌入UnityActivity 首先 得导出Unity Android工程 其次 新建android studio工程 排错 感言 问题 用最简单方法嵌入Un
  • 03系统多界面_秒懂:海湾JB-QB-GST200报警控制器系统调试步骤

    海湾JB QB GST200报警控制器系统调试步骤 此调试步骤可用于海湾消防JB QB GST200壁挂式火灾报警控制器 联动型 JB QB GST200立柜式火灾报警控制器 联动型 JB QB GST200琴台式火灾报警控制器 联动型 一
  • 报错处理(收集)

    1 vue axios 报错 Uncaught in promise TypeError Cannot convert undefined or null to object at Function keys
  • c++11 多线程支持 (std::shared_future)

    定义于头文件
  • 基于MYCAT的MYSQL主从与读写分离配置详解与示例

    原文地址 http blog csdn net dreamcode article details 49511833 第三版 基于Mycat的MySQL主从读写分离配置详解与示例 完整文章下载地址 http download csdn ne
  • R语言回归模型中的训练集和测试集划分

    训练集和测试集划分 set seed 1234 nn 0 8 data iris length iris 1 sub lt sample 1 nrow data round nrow data nn length sub data trai
  • Word‘由于宏安全设置 无法找到宏’问题解决

    针对这个问题 尝试试很多网上的做法无果后 意外发现是自己电脑的杀毒软件把该文件误认为是病毒隔离起来 只需将其恢复到信任区即可 若仍无法解决 检查word是否启用宏
  • 我靠TikTok抖音赚到了人生第一桶金:这个风口行业,真的很赚钱

    现代人的 懒 简直超乎你想象 吃饭靠外卖 买东西靠快递 凡是一切你能想到的 麻烦 现代科技都能替你搞定 而这 恰恰是一种新型的赚钱方式 十年前的淘宝被人嘲笑 说这是马云的异想天开 十年后的淘宝 拼多多 京东告诉你 这一切都已成真 而且带着一
  • 虚拟机迁移原理

    我们常常遇到需要迁移虚拟机的问题 比如需要维护某台设备 会将设备上的一切应用迁移到另一台设备 但是如何将虚拟机进行迁移呢 好比说 虚拟机中正在运行一个程序 这个程序有源源不断的数据访问 怎么使得在不影响这些访问的情况下把虚拟机迁移到领一台服
  • C语言图形库——EasyX常用函数

    上节讲到贴出一张图片的过程 本节接着介绍一些基本的图形库函数 头文件 include
  • 深入浅出SSD--5.1PCIE基础知识

    深入浅出SSD 5 1PCIE基础知识 1 关于PCIE的速度 SSD使用PCIe接口比SATA快 下面是PCIE1 0 2 0 3 0速度 表中的带宽 比如PCIe3 0 1 带宽为2GB s 是指双向带宽 即读写带宽 如果单指读或者写
  • 本周最新文献速递20220522

    本周最新文献速递20220522 一 精细解读文献 一 文献题目 Single nucleus chromatin accessibility profiling highlights regulatory mechanisms of co
  • xml转换word文档

    点击下载 download value flag let this this this axios method get url url lengthMeasurementTwice params machineId this machin
  • http请求头origin、referer和host区别

    1 Host 描述请求将被发送的目的地 包括且仅仅包括域名和端口号 HTTP 1 1 的所有请求报文中必须包含一个Host头字段 且只能设置一个 2 Origin 请求头origin表明了请求来自于哪个站点 包括且仅仅包括协议 域名和端口
  • 创维机顶盒E900刷LinuxNas系统

    家里有一个一直没用的创维E900的机顶盒 芯片是海思 hi3798v100 的 本着废物利用的原则 我想将他刷成linux 没想到网上真的有教程 https histb com 我看了一下 以我现在的技术 问题不大 大不了变砖罢了 反正都是
  • js 中数字小数点末尾的0显示与否

    js 中数字小数点末尾的0显示与否 不显示0 显示0 数字格式化 不显示0 我们先来看一道例题 然后围绕其展开 零 的讨论 问题 得到一个随机数组成的数组 数组长度为10 结果类似于 0 243 0 162 0 701 0 501 此处封装
  • Learn OpenGL with Qt——模型加载:Qt搭建Assimp环境

    如果你是中途开始学习本教程的 即使你对OpenGL已经非常熟悉 请至少了解以下几个章节 因为Qt中提供了OpenGL的很多便捷操作 熟悉这些操作可以让我们在Qt中高效的使用OpenGL进行绘图 创建OpenGL窗口 着色器程序以及着色器的创
  • 如何克服看到别人优于自己而感到的焦虑和迷茫?

    文章目录 每日一句正能量 前言 简述自己的感受 怎么做 如何调整自己的心态 后记 每日一句正能量 行动是至于恐惧的良药 而犹豫 拖延 将不断滋养恐惧 前言 虽然清楚知识需要靠时间沉淀 但在看到自己做不出来的题别人会做 自己写不出的代码别人会
  • 使用Java显示图片

    之前学习C和C 时总是和数据打交道 也许是学的浅薄的关系 当时觉得显示界面和图像是如此的神秘 如今学习了一段时间的Java 发现其实界面什么的也不是那么的难懂 下面写一个简单的例子 让我们的java为我们展示张图片来看看吧 面板源码 jav
  • [LLVM教程]LLVM之第一个语言前端

    目录 LLVM教程 LLVM之第一个语言前端 LLVM教程 LLVM之第一个语言前端 万花筒 介绍与词法分析器 LLVM Tutorial Table of Contents LLVM 17 0 0git documentation LLV