在编程语言的浩瀚星空中,Racket 犹如一颗璀璨的明珠,以其强大的宏系统和优雅的设计哲学吸引着无数开发者。然而,Racket 现有的编译器架构却像一位年迈的工匠,难以跟上时代发展的步伐。为了让 Racket 在未来更加耀眼夺目,一个名为 NORA 的全新编译器项目应运而生。NORA 仿佛为 Racket 穿上了一件崭新的衣裳,将赋予其更快的运行速度和更强大的功能。
🧱 编译器的基石:链接单元
在 Racket 的世界里,一切代码都被编译成一个个独立的链接单元(linklet)。这些链接单元使用一种名为“完全展开程序”(FEP)的语言进行描述。FEP 就如同构建软件大厦的一块块砖石,而链接单元则是将这些砖石组合在一起的框架。
NORA 的目标是将 Racket 代码编译成高效的机器码,而 LLVM 则是实现这一目标的利器。LLVM 就像一座现代化的工厂,能够将代码编译成高效的机器指令。为了将 Racket 代码送入 LLVM 工厂,NORA 需要将 FEP 代码转换成 LLVM 能够理解的中间表示形式(IR)。
⚙️ Racket 编译的独特挑战
与其他编程语言相比,Racket 的编译过程更加复杂,这是因为它依赖于一个名为“扩展器”的特殊程序。扩展器就像一位经验丰富的翻译官,能够将 Racket 代码转换成 FEP 代码。
NORA 的编译过程可以概括为以下几个步骤:
- 提取扩展器链接单元: NORA 首先需要获取 Racket 扩展器的链接单元,就像一位建筑师需要先准备好图纸一样。
- 扩展用户代码: NORA 使用扩展器将用户编写的 Racket 代码转换成 FEP 代码,就像建筑师根据图纸绘制出详细的施工图一样。
- 编译运行时: NORA 使用 LLVM 将 Racket 运行时编译成 LLVM IR,就像建筑工人准备好了建筑所需的各种材料。
- 编译扩展器链接单元: NORA 使用 LLVM 将扩展器链接单元编译成 LLVM IR,就像建筑工人将图纸转换成实际可操作的施工方案。
- 转换为中间表示: NORA 将 FEP 代码转换成一种名为 NIR 的中间表示形式,就像建筑工人将施工方案细化成每个步骤的操作指令。
- 生成可执行文件: LLVM 将 LLVM IR 编译成可执行文件或使用 JIT 技术直接执行,就像建筑工人根据操作指令一步步建造出完整的建筑。
- 降低到 LLVM IR: NORA 将 NIR 降低到 LLVM IR,就像建筑工人将每个操作指令转换成具体的机器操作。
graph LR
A[Racket 源代码] -->|1. 提取扩展器链接单元| B(expander.rktl)
B -->|4. 编译扩展器链接单元| F(LLVM IR)
A -->|2. 扩展用户代码| C(扩展后的用户代码)
C -->|5. 转换为中间表示| D(NIR)
D -->|7. 降低到 LLVM IR| F
E[运行时] -->|3. 编译运行时| F
F -->|6. 生成可执行文件| G(JIT/二进制文件)
🚀 NORA 的未来
NORA 项目还处于早期阶段,但它已经展现出巨大的潜力。NORA 的目标是成为 Racket 的默认编译器,为 Racket 带来更快的运行速度、更强大的功能和更广泛的应用领域。
🤝 其他相关项目
以下是一些与 NORA 相关的项目,它们都使用了 MLIR-C:
- Brutus
- PyTorch importer
- Rise Lang
- Clasp
📚 参考文献
- NORA GitHub 仓库: https://github.com/pmatos/nora
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于