Blaise – 一款面向 QBE 的现代、自举、无历史包袱的 Object Pascal 编译器

Hacker News Top 工具

摘要

Blaise 是一款现代且自举的 Object Pascal 编译器,旨在通过提供单一语言模式、统一的内存模型以及基于 QBE 的原生代码生成,来消除遗留系统的负担。

暂无内容
查看原文 导出为 Word 导出为 PDF
查看缓存全文

缓存时间: 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)统一适用于字符串、类和接口。不再区分 TObjectTInterfacedObject;使用 [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 取代

| TObjectTInterfacedObject 的分割 | 在自动引用计数下统一类模型;[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 编译器(gccclang)用于构建托管的 QBE 后端
  • GNU ldlld(Linux);ld(macOS)

=== 构建所有模块

[source,shell]

pasbuild compile

PasBuild 自动解析模块依赖顺序,并按 rtlcompilertools/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 – 编译器后端

Hacker News Top

QBE 是一个紧凑的、爱好级别的编译器后端,仅用 10% 的代码即可实现工业级优化编译器 70% 的性能,支持 amd64、arm64 和 riscv64,并采用简单的基于 SSA 的中间语言。

用 Zig 写一个 C 编译器

Hacker News Top

一位开发者记录了用 Zig 语言、按照 Nora Sandler 的教程系列构建名为 paella 的 C 编译器的全过程。

Theseus,一个静态的Windows模拟器

Lobsters Hottest

Theseus是一个新型的静态Windows/x86模拟器,它在编译时翻译程序,而不是在运行时解释或即时编译,代表了一种不同于传统模拟架构的方法。