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 程式。
建置流程
- 前置條件 – 需要一個現代的 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 常會在大型原始檔上導致崩潰。
目前的限制與錯誤
- 產生的 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 被視為源對源轉換問題時,技術上可以達成的可能性。