Blaise – 一款面向 QBE 的现代、自举、无历史包袱的 Object Pascal 编译器
摘要
Blaise 是一款现代且自举的 Object Pascal 编译器,旨在通过提供单一语言模式、统一的内存模型以及基于 QBE 的原生代码生成,来消除遗留系统的负担。
查看缓存全文
缓存时间: 2026/05/08 08:25
graemeg/blaise
Source: https://github.com/graemeg/blaise
= Blaise Pascal 编译器 :icons: font :source-highlighter: rouge
你所热爱的 Pascal,为现代时代重新构想。
Blaise 是一款下一代 Object Pascal 编译器,旨在从根源上消除数十年的遗留负担。它优先关注开发者生产力、内存安全和高性能执行。
== ✨ 愿景
Object Pascal 生态系统目前有两个选择:Embarcadero Delphi(专有、以 Windows 为先)和 Free Pascal(开源但背负着 30 年积累的复杂性——五种语言模式、五种字符串类型以及数千个 include 文件)。
这款编译器采取了不同的方法:
- 单一语言模式。 没有
{$mode}开关;不支持遗留方言。 - 单一字符串类型。 使用 UTF-8 引用计数字符串。二进制数据使用
RawBytes。 - 单一内存模型。 自动引用计数(ARC)统一适用于字符串、类和接口。不再区分
TObject和TInterfacedObject;使用[Weak]打破循环。保留Free作为立即释放的同义词。 - 简洁的接口。 无需 COM GUID;接口分派通过编译时虚表映射实现。
- 具象泛型(Reified generics)。 编译时单态化——无类型擦除。
- 现代构建系统。 使用
project.xml的 PasBuild;无需 makefile。 - 一流调试器支持。 OPDF 是默认调试格式;无需 DWARF。
详见 link:docs/design.adoc[docs/design.adoc] 获取完整的架构和实现计划。
成果——一款现代、跨平台的 Object Pascal 编译器,通过 https://c9x.me/compile/[QBE](最终也将支持 LLVM)针对原生代码。单一语言模式,单一字符串类型,无 GUID 接口,具象泛型,以及一流的 https://github.com/graemeg/opdebugger[OPDF] 调试格式支持。
== 🚀 项目状态
- 自托管(Self-Hosting): 是。Blaise 目前能够引导并重新编译自身,且实现逐字节精确匹配。
- 测试: 1200+ 测试用例且持续增长(从一开始就采用测试驱动开发)。
- 后端: 目前使用 QBE 后端,LLVM 后端正在积极开发中。
[cols=“1,3,1”, options=“header”] |=== | 阶段 | 目标 | 状态
| 1 | 引导管道 —— 通过 PasBuild 在 Linux x86_64 上实现 Hello World | 完成 ✅
| 2 | 类型系统 —— 类、记录、ARC、异常 | 完成 ✅
| 3 | 泛型 + 无 GUID 接口 | 完成 ✅
| 4 | OPDF 调试信息生成 | 完成 ✅
| 5 | 自托管 + LLVM + Windows + macOS ARM64 | 进行中
| 6 | LSP + VS Code 扩展 | 计划中
| 7 | FPC/Delphi 代码库迁移分析器 | 计划中 |===
== 经典 Pascal 中被移除的特性
[cols=“1,3”, options=“header”] |=== | 特性 | 移除原因
| ShortString, AnsiString, WideString, UnicodeString
| 被单一的 UTF-8 引用计数 string 类型取代
| with 语句
| 难以诊断的符号解析错误之源;破坏静态分析
| 旧式 object 类型
| 改用 record(栈/值类型)或 class(堆/引用类型)
| COM 风格接口 GUID | 接口分派通过编译时虚表实现;GUID 是不必要的复杂性
| 多种语言模式 | 一种维护良好的方言胜过五种维护糟糕的方言
| assign, reset, rewrite, blockread
| 被基于流的 I/O RTL 取代
| TObject 与 TInterfacedObject 的分割
| 在自动引用计数下统一类模型;[Weak]
用于打破循环
|===
== 📢 社区
核心架构仍在最终确定中,因此该项目目前暂不接受代码贡献。我们非常欢迎关于语言设计、语法选择以及 Blaise 未来方向的反馈 —— 请使用 GitHub 上的 https://github.com/graemeg/blaise/discussions[Discussions] 标签页。
== 仓库布局
本项目使用 PasBuild 的多模块布局。每个包含 project.xml 的子目录都是一个独立模块;根目录的 project.xml 是聚合器。
…. project.xml 根聚合器 (packaging=pom) │ ├── compiler/ 编译器二进制文件 (packaging=application) │ ├── project.xml │ └── src/ │ ├── main/pascal/ uLexer, uParser, uAST, uCodeGenQBE, … │ └── test/pascal/ 编译器单元的 FPTest 测试套件 │ ├── rtl/ 运行时库 (packaging=library) │ ├── project.xml │ └── src/ │ ├── main/pascal/ System.pas, SysUtils.pas, Classes.pas, … │ └── test/pascal/ RTL 单元的 FPTest 测试套件 │ ├── tools/ │ └── migration-analyser/ FPC/Delphi 迁移报告工具 (packaging=application) │ ├── project.xml 依赖于编译器模块 │ └── src/ │ ├── main/pascal/ │ └── test/pascal/ │ ├── vendor/qbe/ 托管的 QBE 后端源码(固定版本,从源码构建) └── docs/ 设计文档和规范 ….
PasBuild 将每个模块编译到其自己的 target/ 子目录中。构建输出从不提交到仓库。
== 构建
=== 先决条件
- Free Pascal Compiler 3.2.2 或更高版本(稳定版;不需要 3.3.x 开发快照)
- https://github.com/graemeg/pasbuild[PasBuild]
- C 编译器(
gcc或clang)用于构建托管的 QBE 后端 - GNU
ld或lld(Linux);ld(macOS)
=== 构建所有模块
[source,shell]
pasbuild compile
PasBuild 自动解析模块依赖顺序,并按 rtl → compiler → tools/migration-analyser 的顺序进行编译。
=== 使用配置文件构建
[source,shell]
pasbuild compile -p debug # 包含 -g -gl -Criot -gh pasbuild compile -p release # 包含 -O2 -CX -XX -Xs
=== 运行测试
[source,shell]
pasbuild test
=== 构建单个模块
[source,shell]
pasbuild compile -m blaise-compiler
=== 运行编译器
构建完成后,编译器二进制文件位于 compiler/target/blaise。
[source,shell]
编译单个文件
compiler/target/blaise –source Hello.pas –output Hello
通过 project.xml 编译
compiler/target/blaise –project project.xml –config debug –output myapp
输出 QBE IR(对调试编译器本身很有用)
compiler/target/blaise –source Hello.pas –emit-ir
== 许可证
Apache License v2.0 带运行时库例外。见 link:LICENSE[LICENSE]。
由 Graeme 为 Pascal 社区用心构建 ❤️
相似文章
QBE – 编译器后端
QBE 是一个紧凑的、爱好级别的编译器后端,仅用 10% 的代码即可实现工业级优化编译器 70% 的性能,支持 amd64、arm64 和 riscv64,并采用简单的基于 SSA 的中间语言。
实测 OpenCode 与自托管 LLM 的协作:Qwen 3.5、3.6、Gemma 4、Nemotron 3、GLM-4.7 Flash - v2
一位开发者在 RTX 4080 上用 OpenCode 对多款自托管 LLM(Qwen 3.5/3.6、Gemma 4、Nemotron 3、GLM-4.7)进行两项编码任务基准测试,揭示了速度与质量的权衡。
用 Zig 写一个 C 编译器
一位开发者记录了用 Zig 语言、按照 Nora Sandler 的教程系列构建名为 paella 的 C 编译器的全过程。
“Browser OS”由Qwen 3.6 35B实现:这是我从本地模型获得的最佳结果
一位用户报告称,通过Qwen 3.6 35B在本地运行'Browser OS'实现,取得了令人印象深刻的结果,凸显了该模型在不依赖云端的情况下执行复杂任务的能力。
Theseus,一个静态的Windows模拟器
Theseus是一个新型的静态Windows/x86模拟器,它在编译时翻译程序,而不是在运行时解释或即时编译,代表了一种不同于传统模拟架构的方法。