crustc:将整个 rustc 编译器翻译为 4600 万行 C 代码
crustc 是一个将 Rust 编译器(rustc 1.98.0-nightly)完整翻译为 4600 万行 C 代码的开源项目。项目作者 FractalFir 历时三年,历经 14 次失败尝试,最终通过自研工具链成功实现了这一壮举。编译后只需 GCC 加 make,即可得到一个功能完整的、可直接运行的 Rust 编译器。
三年磨一剑:14 次尝试终成正果
将整个 Rust 编译器翻译为 C 语言并非易事。Rust 编译器本身极为复杂,包含类型检查、借用检查、泛型特化、宏展开、LLVM IR 生成等大量基础架构。作者坦言,这已经是他在三年时间里的 第 14 次尝试。前 13 次尝试均因各种技术瓶颈而告终,但每一次失败都为最终的成功积累了宝贵的经验。
核心突破来自作者开发的 cilly 工具链——一个 Rust 到 C 的编译器后端插件。与传统的源到源翻译不同,cilly 采用了全新的设计理念:它不去猜测目标平台的行为,而是主动检测并自适应。
核心创新:cilly 会"适应"C 编译器
cilly 最关键的创新在于其 自适应生成机制。它能生成所谓的"见证程序"(witness programs),这些小程序会在编译前运行,检测目标 C 编译器和目标平台支持哪些特性。例如:
_Thread_local关键字是否被支持?float和double的字节大小与对齐方式?- 平台是否支持特定的内联汇编语法?
- 原子操作指令集是否可用?
根据这些检测结果,cilly 会 自动适配 所生成的 C 代码,选择最合适的实现路径。这意味着 cilly 不是为某个特定的 C 编译器或平台优化的——它为所有可能的平台而设计。
// 示例:cilly 生成的 C 代码片段(示意)
// 根据目标平台自动选择线程局部存储实现
#if defined(HAS_THREAD_LOCAL)
_Thread_local int tls_data;
#elif defined(HAS___THREAD)
__thread int tls_data;
#else
// 回退到 pthread 模拟实现
pthread_key_t tls_data_key;
#endif
真正可运行的 Rust 编译器
crustc 不是一个概念验证或玩具项目。实测演示显示:用 make 完成编译后,设置 LD_LIBRARY_PATH=...,运行 ./rustc/rustc --version,输出结果为 "rustc 1.98.0-nightly"——与官方 nightly 版本号完全一致。
更重要的是,crustc 能够成功编译 Rust 标准库中的核心组件,包括:
core—— Rust 的核心库,包含基础类型、迭代器、trait 等alloc—— 堆分配相关库,如Box、Vec、String等std—— 标准库,涵盖文件系统、网络、线程等操作系统抽象
这意味着 crustc 不是一个阉割版本,而是保留了 Rust 编译器绝大部分功能的完整实现。
项目意义:为 Rust 打开全平台大门
crustc 和 cilly 的出现,对 Rust 生态系统的意义深远。Rust 官方编译器基于 LLVM 后端,虽然 LLVM 支持大量架构(x86、ARM、RISC-V、WebAssembly 等),但仍有大量平台不受支持——包括某些嵌入式系统、专有操作系统、老旧硬件、以及新型实验性平台。
而 C 语言编译器存在于几乎所有平台——从大型机到微控制器,从实时操作系统到裸机环境。通过 crustc,任何能用 C 编译器编译代码的平台,都能运行 Rust 代码。这为 Rust 打开了全新的移植可能性:
- 嵌入式系统中那些没有 LLVM 后端的罕见 MCU
- 专有操作系统内核模块开发
- 遗留老旧平台的现代化改造
- 实验性新架构的原型开发
技术意义与局限性
从技术角度看,crustc 将 Rust 编译器翻译为 C,本质上是将 Rust 的编译时安全保证 转化为 C 语言的运行时逻辑。Rust 的所有权系统、生命周期检查和借用规则,在 C 代码中通过额外的运行时检查来模拟。这不可避免地会带来一定的性能开销。
然而,对于"能否运行"比"运行多快"更重要的场景——尤其是那些原本完全无法运行 Rust 的平台——这种权衡是完全值得的。crustc 的目标从来不是替代官方的 rustc,而是作为 最后的兼容性方案,填补官方编译器覆盖不到的空白。
如何参与
crustc 目前已在 GitHub 上开源。如果你对 Rust 编译器内部实现、源到源翻译、或者跨平台移植感兴趣,可以查看项目源码并参与贡献。需要注意的是,项目仍处于早期阶段,编译速度较慢,生成的 C 代码体积巨大(4600 万行),但在目标平台上的实际运行表现令人期待。
# 获取源码并尝试编译
git clone https://github.com/FractalFir/crustc.git
cd crustc
# 按照项目说明进行构建(需要 GCC 和 make)
make
# 验证编译结果
LD_LIBRARY_PATH=path/to/libs ./rustc/rustc --version
原文出处:原文链接