Compiler

Rust 开发编译器速成(二):计算编译器

书接上文。本章节会接触一些真正硬核的东西,包括从 Ast 生成 IR,以及制作一个迷你版的 LLVM,并且能够输出 LLVM IR 代码。 目标 我们会实现一个 AOT 编译器,它能够编译类似如下的语句: 11;-mem*3-1;print(mem);print(mem+7); 输出: 1-4 23 可以使用命令行 1calc -e "1;-mem*3-1;print(mem);print(mem+7);" | lli - 来运行。 环境准备 我们会沿用上一章节的代码,所以请确保你已经完成了上一章节的代码。 然后我们虽然不需要依赖 LLVM 就能生成 LLVM IR,但为了能够运行 LLVM IR,我们还是需要安装 LLVM。以 MacOS 为例: 1brew install llvm 确保 lli 命令能够运行即可。 另外我们多了一个依赖: 1id-arena = "2.2.1" 它的作用是提供竞技场分配,这样我们可以避免使用令人头秃的 Rc<RefCell<T>> 以及对应的 Weak。下面用了你就知道了。 生成 IR 前的准备 LLVM 中的 Value 首先需要介绍一下 Value。 Value 是所有 IR 实体的基类。每个 Value 都是一个命名的值,可以是整数、浮点数、指针、函数等等。Value 可以作为操作数用于构建表达式或指令,并用于定义全局变量、局部变量和函数的参数和返回值。 Value 有许多子类,如 Instruction、Argument、Constant 等等,它们各自有不同的功能。但是,不同的 Value 实例都有一些共同的特点,例如它们都有一个唯一的名称(以及命名前缀),可以拥有一个类型,还可以被分配给任何指令作为操作数。 Read more...

Rust 开发编译器速成(一):计算解释器

在本系列的第一篇文章中,我们将学习如何使用 Rust 编写一个简单的计算解释器。本文的目标是让你理解如何使用 Pest 的 PEG 文法解析器生成器处理字符串。这个过程主要涉及到编译的前端,但基本只是调包,不需要太多的编译原理知识。 目标 我们会实现一个解释器,它能够解释如下的语句: 11 + 2;print(mem); 输出: 3 环境准备 首先,我们需要创建一个新的 Rust 项目。打开终端,输入以下命令: 1$ cargo new calc-comp 2 Created binary (application) `calc-comp` package 3$ code calc-comp 这样就能创建一个名为 calc-comp 的新项目,并用 Visual Studio Code 打开。 同时,编辑 Cargo.toml 安装如下依赖: 1[dependencies] 2lazy_static = "1.4.0" 3pest = "2.5.5" 4pest_derive = "2.5.5" lazy_static 用于定义静态模块全局变量。 pest 是一个 PEG 文法解析器生成器。 pest_derive 是 pest 的派生宏。 设计语法规则 在 src 目录下创建一个名为 calc.pest 的文件,该文件定义了语法规则。我们将使用一个名为 pest 的 Rust 库来定义语法规则。Pest 可以帮助我们将语法规则表达为一个简单易读的代码。 Read more...

LLVM:从零开始实现 Function Pass

本文是我在学习 LLVM 的过程中,从零开始实现一个 Function Pass 的过程。具有如下特点: 基于 apt 安装 LLVM。不需要构建源码。 使用 C++14 标准。使用 LLVM 14 版本。 使用新的 PassInfoMixin 机制。不使用旧的 PassManager 机制。 使用最简化的 Makefile/CMake 更好地理解编译过程。 使用 Ubuntu 上的 VSCode 进行开发,完善的开发体验。 LLVM 的安装 首先你需要安装 LLVM,我直接用 apt 安装了。 1sudo apt install llvm-14 对于我现在版本的 Ubuntu,头文件和库文件在 /usr/include/llvm-14 和 /usr/lib/llvm-14 下。 VSCode 的配置 mkdir mypass-project 用于存放项目文件。 如下配置可以让 VSCode 识别 LLVM 头文件。 Path .vscode/c_cpp_properties.json { "configurations": [ { "name": "Linux", "includePath": [ "${workspaceFolder}/**", "/usr/include/llvm-14/**", "/usr/include/llvm-c-14/**" ], "defines": [], "compilerPath": "/usr/bin/clang", "cStandard": "c17", "cppStandard": "c++14", "intelliSenseMode": "linux-clang-x64" } ], "version": 4 } 编写代码 接下来是 src 目录,用于存放源文件。 Read more...
1 of 1