QBE – 编译器后端
摘要
QBE 是一个紧凑的、爱好级别的编译器后端,仅用 10% 的代码即可实现工业级优化编译器 70% 的性能,支持 amd64、arm64 和 riscv64,并采用简单的基于 SSA 的中间语言。
暂无内容
查看缓存全文
缓存时间: 2026/05/08 15:28
# QBE - 编译器后端
来源:https://c9x.me/compile/
- 简介 (https://c9x.me/compile/)
- 文档 (https://c9x.me/compile/docs.html)
- 用户 (https://c9x.me/compile/users.html)
- 发布 (https://c9x.me/compile/releases.html)
- 代码 (https://c9x.me/compile/code.html)
QBE 是一个编译器后端,旨在用 10% 的代码提供工业级优化编译器 70% 的性能。QBE 通过提供一个紧凑、易用且高性能的后端来促进语言创新。尺寸限制迫使 QBE 专注于核心功能,避免陷入无止境的边际收益递减之路。
### 概览
QBE 的 C 代码库旨在保持业余规模和易于修改。尽管体积小巧,QBE 仍提供了许多具有良好性价比的优化功能。它还通过完整实现 C ABI 来简化与外部系统的集成。这意味着由 QBE 编译的程序可以轻松调用 C 代码,反之亦然。当前版本的 QBE 支持目标架构:*amd64*(Linux 和 macOS)、*arm64* 和 *riscv64*。
更多 QBE 特性:
- 完全支持 C ABI。
- IEEE 32 位和 64 位浮点数。
- 统一且简单的基于SSA(https://en.wikipedia.org/wiki/Static_single_assignment_form)的中间语言(IL)。
- 所有编译阶段使用相同的 IL。
- 副本消除。
- 稀疏条件常量传播。
- 死指令消除。
- 小型栈槽的寄存器化。
- 借助 SSA 形式实现分离的溢出器与寄存器分配器(比图着色更简单、更快)。
- 基于循环分析的智能溢出启发式算法。
- 带提示的线性寄存器分配器。
- 匹配并利用 amd64 寻址模式。
- 极快的编译时间(在 Core 2 Duo 上,`CFLAGS=-O2` 时仅需 2 秒)。
### 开始使用
下面的代码片段是一个用 QBE 中间语言编写的独立程序,展示了如何定义简单函数、对字进行算术运算以及调用变参 C 函数。
```
function w $add(w %a, w %b) { # 定义一个函数 add
@start
%c =w add %a, %b # 将两个参数相加
ret %c # 返回结果
}
export function w $main() { # 主函数
@start
%r =w call $add(w 1, w 1) # 调用 add(1, 1)
call $printf(l $fmt, ..., w %r) # 显示结果
ret 0
}
data $fmt = { b "One and one make %d!\n", b 0 }
```
将示例复制到文件中,然后用 `qbe -o out.s file.ssa && cc out.s` 编译。生成的二进制文件应能顺利运行,并依赖本地 libc 将输出打印到终端。
要了解更多关于 QBE 中间语言的信息,请阅读语言文档 (https://c9x.me/compile/doc/il.html)。
### 社区
- 关于补丁和讨论,请订阅 `~mpu/[email protected]` (https://lists.sr.ht/~mpu/qbe/)。
- 来我们在 `irc.eigenstate.org` 的 `#myrddin` 频道与我们交流。
相似文章
QBE - 编译器后端:版本 1.3
QBE 1.3 是一个重要的编译器后端版本,新增了 7000 行代码,引入了一种新的 IL 匹配算法,针对 coremark 基准测试进行了优化(性能从 gcc -O2 的 40% 提升到超过 63%),支持 Windows ABI 和位置无关代码生成。
过度设计的计算器:Zig + QBE
一篇博客文章介绍了如何使用Zig和QBE编译器后端构建一个过度设计的计算器,该计算器可以将算术表达式编译为原生机器代码,并展示了词法分析、解析和代码生成的过程。
Blaise – 一款面向 QBE 的现代、自举、无历史包袱的 Object Pascal 编译器
Blaise 是一款现代且自举的 Object Pascal 编译器,旨在通过提供单一语言模式、统一的内存模型以及基于 QBE 的原生代码生成,来消除遗留系统的负担。
Blaise v0.10.0:本地后端、线程与增量编译
Blaise v0.10.0 通过 QBE 增加了本地后端支持、线程功能和增量编译,推动这款现代 Object Pascal 编译器向自托管和更广泛的平台支持迈进。
Qwen 3.6/3.8 自主编码 C 编译器的探索之旅
作者描述了一个为期六个月的实验,使用 Qwen 3.6/3.8 模型自主构建 C99 编译器,克服了上下文管理和代码生成方面的重大挑战,最终产出了一个可工作的项目。