crustc 将整个 rustc 编译器翻译成 C
crustc 将整个 rustc 编译器翻译成 C
crustc 将整个 rustc 编译器翻译成 C
crustc 是一个演示项目,它把 rustc 1.98.0‑nightly (c712ea946 2026‑06‑16) 的完整源码转换为大约 4600 万行 C 代码。生成的 C 代码可以使用标准的 GCC 工具链编译,并产出一个可工作的 Rust 编译器,能够构建标准库。
crustc 实际做了什么
crustc 是一个基于作者私有的 cilly 工具链构建的 转译器。cilly 是一个 Rust 库,用于生成可移植的 ANSI‑C 代码,并提供一个驱动翻译过程的编译器后端插件。关键思路包括:
- 与编译器无关的输出 –
cilly会探测目标 C 编译器支持的语言特性(例如_Thread_local、类型大小),并相应地定制生成的 C 代码。 - 网络透明性 – 该工具可以通过 TCP(甚至 UART)与远程 C 编译器通信,使得强大的主机能够为缺少本地 C 工具链的设备驱动编译。
- Makefile 生成 – 在生成的目标文件中加入可选标记,
cilly能够重建一套 makefile 目录,从而通过 C 编译器实现传统的基于make的 Rust 代码构建。
当前仓库仅展示了编译器 自编译 的过程,作者称之为 “最炫的展示”。
为什么要把 rustc 翻译成 C?
主要动机是 硬件支持。许多老旧或小众平台没有 LLVM 或最新的 GCC,但仍拥有 C 编译器。通过把 Rust 转成 C,这些系统就能运行 Rust 程序,而无需完整的 LLVM 堆栈。
"The primary goal of this is support for old/obscure hardware with no LLVM/GCC support. There are still some systems out there that don't support Rust but support C." – crustc README
这也规避了经典的 Rust 引导悖论:可以在仅提供 C 编译器的机器上构建 Rust 编译器,然后再用它为目标平台编译 Rust。
构建方式
- 前置条件 – 需要一个现代的 GCC(作者使用的是 GCC 13.3.0)以及上游
rustc所需的对应 LLVM 库(libLLVM.so.22.1‑rust‑1.98.0‑nightly)。 - 编译 – 运行
make -j20 LLVM_LIB_DIR=~/.rustup/toolchains/nightly-2026-06-16-aarch64-unknown-linux-gnu/lib。构建会生成一个用 C 编写的rustc可执行文件。 - 运行 – 将
LD_LIBRARY_PATH指向 LLVM 库所在目录,然后执行./rustc/rustc --version查看原始版本字符串。
作者指出 应关闭优化;使用 CFLAGS=-g 时,完整构建在 20 核机器上大约需要 1 分钟 18 秒。开启 -O2 往往会导致大文件编译时崩溃。
当前限制与 bug
- 生成的 C 代码是 目标特定 的;为 ARM64 生成的代码在不重新生成的情况下无法在 RISC‑V 上运行。
- 仍存在一些 ABI 不匹配,尤其是在 ARM64 上,编译器无法表示 Rust 用于小结构体的
sret调用约定。 - 由于路径规范化问题,crustc 在仓库根目录执行时会崩溃(作者坦言自己也对这个 bug 感到困惑)。
cilly工具链 尚未公开;作者将个人因素(新工作、论文以及一次真实的搅拌机事故)列为延迟发布的原因。
社区反响
- 奉献精神 – 评论者
@lioeters称赞了cilly背后长达 14 年的努力,并强调了其在引导过程中的意义。 - 与已有项目的比较 –
@ahartmetz提醒大家 LLVM 曾经有 C 后端,并链接了近期关于其复兴的讨论。 - 实用性担忧 –
@nxtfari对在安全关键或老旧系统中使用 beta 版转译器持怀疑态度,但仍觉得概念令人兴奋。 - 性能好奇 –
@Tiberium询问生成的 C 代码相较于原生 LLVM 生成的二进制性能如何,暗示可能存在非移植的使用场景。 - 可引导 OS 的兴趣 –
@Imustaskforhelp认为 crustc 可以简化可引导的 Rust 构建,减少对 OCaml 或其他沉重工具链的依赖。
总体来看,社区认为 crustc 是一个 新颖的概念验证,在可移植性、引导和交叉编译方面具有有趣的意义,同时也认识到该工具仍处于实验阶段。
展望
crustc 证明了完整的 Rust 编译器可以用 ANSI‑C 表达,并使用传统的 C 工具链构建。如果作者最终发布完整的 cilly 套件,开发者就能面向 任何兼容 C 的平台,从 Plan 9 虚拟机到小众嵌入式 CPU,都无需编写自定义的 LLVM 后端。 在此之前,crustc 仍是一个引人注目的展示,说明当 Rust 被视作源到源的转换问题时,技术上是完全可行的。