Origami404 的 Blog 有空的话就随便逛逛吧 www

LLVM Kaleidoscope 第 8 章:编译到目标文件

8.1 前言

欢迎来到 我的第一个基于 LLVM 的语言前端 教程第八章。本章将描述如何将我们实现的语言编译到目标文件 (object file)。

LLVM Kaleidoscope 第 6 章:扩展语言:自定义运算符

6.1 前言

欢迎来到 我的第一个基于 LLVM 的语言前端 教程第六章。麻雀虽小,五脏俱全,现在我们已经有了一个相对完备的小型函数式编程语言。但目前我们的语言还有一个大缺点:它缺少很多有用的运算符 (比如除法和逻辑非,我们甚至还没有除了小于之外的任何比较运算符!)

本章将会讨论如何让语言支持自定义运算符。诚然,自定义运算符可能让我们的语言变得丑陋 – 但同时它也能给予我们的语言强大的表达力。自创语言的醍醐味就在于你可以 (并且需要!) 做出你自己的判断,不论是好是坏。本教程将选择允许用户自定义运算符,同时在实现它的过程中讨论一些有趣的语法解析技术。

在本教程的结尾,我们将编写一个渲染曼德博集合Kaleidoscope 程序。它同时也会作为一个示范,告诉你 Kaleidoscope 的强大之处,以及如何使用 Kaleidoscope 做出更多有趣的事情。

LLVM Kaleidoscope 第 -1 章 翻译者的话

本教程原文于 LLVM Tutorial.

网上现见有一些翻译:

作为一个编译技术的入门菜鸟,我很感谢上面这些 (以及千千万万的) 无私付出的翻译者。

鄙人最近又开始了学习编译技术的学习,在学习之余,也想为社区做一份贡献。于是我斗胆尝试翻译一下本篇教程,重点在之前译者没有翻译的章节上,尽量保证在今年 4 月前翻译完成整个教程。

因本人水平有限,如有错误,请多多指正、包涵。如有勘误,欢迎提出 issue/pr 于此 仓库. 也可以直接联系本人 Origami404 at foxmail.com

本翻译同时也发布在 HITsz LUG wiki 上.

本翻译使用 CC BY-NC-SA 4.0 协议发布到公共领域.

目录位于 这里.

LLVM Kaleidoscope 第 0 章 我的第一个基于 LLVM 的语言前端

前置技能: 本教程要求你有 C++ 基础,但你并不需要先去做一个编译器再来看这个教程。

欢迎来到“我的第一个基于 LLVM 的语言前端”教程。在本教程我们将会自己动手实现一个简单的语言,你将会看到这有多简单以及有趣。在接下来的教程里,你将会快速而确切地学习到使用 LLVM 来生成程序的方法。

本教程引入了一门简单的叫 Kaleidoscope(万花筒) 的语言。在接下来的几章内,我们将会一步步向你展示构建它的过程。在这个过程中我们会介绍一系列的语言设计与 LLVM 思想,给予你实现这门语言的程序的详细代码,并尽量减少各种各样的细节。我们强烈建议你跟着教程一起动手,在我们给予的代码的基础上去 hack,去实验,去探索新的可能。

LLVM Kaleidoscope 第 1 章 Kaleidoscope 与 lexer

暂未翻译,敬请参阅连城大佬的译文.

译文较老,请与原文对比以确保自己的代码是更新之后的。

本教程其他翻译将基于新版本教程。

下一章在此

LLVM Kaleidoscope 第 2 章 实现 Parser 与 AST

暂未翻译,敬请参阅连城大佬的译文.

译文较老,请与原文对比以确保自己的代码是更新之后的。

本教程其他翻译将基于新版本教程。

下一章在此

LLVM Kaleidoscope 第 3 章 生成 LLVM IR

暂未翻译,敬请参阅连城大佬的译文.

译文较老,请与原文对比以确保自己的代码是更新之后的。

本教程其他翻译将基于新版本教程。

下一章在此

LLVM Kaleidoscope 第 4 章 增加 JIT 与优化

4.1 前言

欢迎来到 我的第一个基于 LLVM 的语言前端 教程第四章。前三章描述了一门简单语言的实现与生成 LLVM IR 的过程,而本章将要描述两种新技术 – 增加优化器 (optimizer) 与 JIT 编译器支持 – 它们将会告诉你如何生成优雅高效的中间代码。

LLVM Kaleidoscope 第 5 章 扩展语言:控制流

5.1 前言

欢迎来到 我的第一个基于 LLVM 的语言前端 教程第五章。前四章描述了一门简单语言的实现,生成 LLVM IR 并优化,随后即时编译到本地代码的过程。不幸的是,至少到目前为止,Kaleidoscope 还不堪大用:它没有控制流结构 (除了函数调用与返回). 这意味着你不能用它写出带条件分支的代码,这显著地影响了 Kaleidoscope 的威力。在本章,我们将扩展 Kaleidoscope,使其支持 if/then/else 表达式和一个简单的 for 循环。

矢量运算与高阶线性结构的构造性定义

前言

上大学了, 终于有大段的时间来整理数学和物理学内容了.

本文有其思想上的参考: 3b1b: 发明新数学是怎样一种体验?

“最原始的"双线性二元运算

让我们来考虑矢量的运算吧!

假如我们需要在线性空间 $\mathbb{V}$ 上定义二元运算, 显然我们会希望这个运算至少是线性的, 否则为啥我们要在线性空间上搞呢. 同时如果一个二元运算是双线性的(就是说对于两个操作数而言它都是线性的), 那么我们只需要对 $\mathbb{V}$ 的基底定义此运算即可.

换句话说, 对于双线性运算 $\mathbf{a} \otimes \mathbf{b}$, 我们可以将其按基底展开:

$$ \begin{aligned} \mathbf{a} \otimes \mathbf{b} &= (\sum_{i=1}^n a_i \mathbf{e_i}) \otimes (\sum_{i=1}^n b_i \mathbf{e_i}) \\ &= \sum_{i=1}^n \sum_{j=1}^n a_i b_j (\mathbf{e_i} \otimes \mathbf{e_j}) \end{aligned} $$

那么, 我们只需要定义所有的 $\mathbf{e_i} \otimes \mathbf{e_j}$ (一共 $n^2$ 个) 即可.

等等, 这都啥跟啥啊????