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。


构建方式

  1. 前置条件 – 需要一个现代的 GCC(作者使用的是 GCC 13.3.0)以及上游 rustc 所需的对应 LLVM 库(libLLVM.so.22.1‑rust‑1.98.0‑nightly)。
  2. 编译 – 运行 make -j20 LLVM_LIB_DIR=~/.rustup/toolchains/nightly-2026-06-16-aarch64-unknown-linux-gnu/lib。构建会生成一个用 C 编写的 rustc 可执行文件。
  3. 运行 – 将 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 被视作源到源的转换问题时,技术上是完全可行的。

Sources