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 目錄,從而以傳統的 make 方式透過 C 編譯器建構 Rust 程式碼。

目前的倉庫僅展示編譯器 自我編譯,作者稱之為「最炫的展示」。


為什麼要把 rustc 翻譯成 C?

主要動機是 硬體支援。許多舊有或冷門平台缺乏 LLVM 或較新版本的 GCC,但仍有 C 編譯器。將 Rust 轉成 C 後,這些系統即可在不需要完整 LLVM 堆疊的情況下執行 Rust 程式。

"此舉的主要目標是支援沒有 LLVM/GCC 的舊式/冷門硬體。仍有一些系統不支援 Rust,但支援 C。" – crustc README

這同時也繞過了 Rust 的經典自舉悖論:Rust 編譯器可以在只提供 C 編譯器的機器上建構,之後再用它編譯目標平台的 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 常會在大型原始檔上導致崩潰。


目前的限制與錯誤

  • 產生的 C 程式碼是 目標特定 的;為 ARM64 產出的程式碼無法在 RISC‑V 上執行,除非重新產生。
  • 仍有一些 ABI 不匹配,特別是在 ARM64 上,編譯器無法表示 Rust 用於小結構的 sret 呼叫慣例。
  • 從倉庫根目錄執行 Crustc 會因路徑正規化問題而崩潰(作者也對此 bug 感到困惑)。
  • cilly 工具鏈 尚未公開;作者以個人因素(新工作、論文、以及一次真的「攪拌機」事件)作為延遲的原因。

社群回應

  • 奉獻精神 – 討論者 @lioeters 稱讚 cilly 背後長達 14 年的努力,並強調其對自舉的意義。
  • 與既有專案的比較@ahartmetz 提醒大家 LLVM 早期曾有 C 後端,並連結近期關於其復興的討論。
  • 實用性疑慮@nxtfari 對於在安全關鍵或遺留系統上信任 beta 轉譯器持保留態度,但仍覺概念令人興奮。
  • 效能好奇@Tiberium 詢問產生的 C 程式碼相較於原生 LLVM 產出的二進位檔表現如何,暗示可能有非移植的使用情境。
  • 可自舉作業系統的興趣@Imustaskforhelp 認為 crustc 可簡化可自舉的 Rust 建置,減少對 OCaml 或其他龐大工具鏈的依賴。

總體而言,社群將 crustc 視為 新穎的概念驗證,其可攜性、自舉與交叉編譯的潛在影響令人關注,同時也意識到此工具仍屬實驗階段。


前景展望

crustc 證明完整的 Rust 編譯器可以以 ANSI‑C 表示,並使用傳統的 C 工具鏈建置。若作者最終釋出完整的 cilly 套件,開發者將能針對 任何相容 C 的平台(從 Plan 9 虛擬機到冷門嵌入式 CPU)進行目標,無需自行撰寫 LLVM 後端。在此之前,crustc 仍是一個引人入勝的展示,說明當 Rust 被視為源對源轉換問題時,技術上可以達成的可能性。

Sources