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 はポータブルな ANSI‑C コードを出力する Rust ライブラリで、翻訳を駆動するコンパイラバックエンドプラグインです。主なアイデアは次のとおりです。

  • コンパイラ非依存の出力cilly は対象 C コンパイラのサポートする言語機能(例: _Thread_local、型サイズ)を検出し、生成する C をそれに合わせて調整します。
  • ネットワーク透過性 – ツールは TCP(あるいは UART)経由でリモート C コンパイラと通信でき、C ツールチェーンを持たないデバイス向けに強力なホストがコンパイルを駆動できます。
  • Makefile 生成 – 生成されたオブジェクトにオプションのマーカーを入れることで、cilly はディレクトリ構造の Makefile を再構築でき、C コンパイラ経由で従来の make ベースの Rust ビルドが可能になります。

現在のリポジトリはコンパイラ自身をコンパイルする例だけを示しており、作者はこれを “最も華やかなデモ” と呼んでいます。


なぜ rustc を C に変換するのか

主な動機は ハードウェアサポート です。多くのレガシーまたはマイナーなプラットフォームは LLVM や最新の GCC を持っていませんが、C コンパイラは存在します。Rust を C に変換することで、フル LLVM スタックを必要とせずにこれらのシステム上で Rust プログラムを実行できます。

"この主な目的は、LLVM/GCC のサポートがない古い/マイナーなハードウェア向けのサポートです。Rust をサポートしないが 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 を有効にすると大規模ソースでクラッシュすることがあります。


現在の制限とバグ

  • 生成された C は ターゲット固有 であり、ARM64 用に生成されたコードは再生成なしに RISC‑V では動作しません。
  • 特に ARM64 で、Rust が小さな構造体に使用する sret 呼び出し規約を表現できない ABI の不一致が残っています。
  • リポジトリのルートから実行するとパス正規化の問題で Crustc がクラッシュします(作者もこのバグに混乱していると認めています)。
  • cilly ツールチェーンは まだ公開されていません。作者は個人的な制約(新しい仕事、論文、文字通りブレンダー事故)を理由に遅延していると述べています。

コミュニティの反応

  • 献身 – コメント投稿者 @lioeterscilly の 14 年にわたる取り組みを称賛し、ブートストラップへの関連性を強調しました。
  • 既存プロジェクトとの比較@ahartmetz は LLVM の歴史的な C バックエンドを思い出させ、最近の復活議論へのリンクを提供しました。
  • 実用性への懸念@nxtfari はベータ版トランスパイラをセキュリティクリティカルやレガシーシステムで信頼することに懐疑的でしたが、概念自体は面白いと述べました。
  • 性能への関心@Tiberium は C 生成コードがネイティブ LLVM 生成バイナリと比べてどの程度の性能か質問し、移植以外の利用ケースを示唆しました。
  • ブートストラップ可能 OS への関心@Imustaskforhelp は crustc が OCaml など重いツールチェーンへの依存を減らし、ブートストラップ可能な Rust ビルドを簡素化できると提案しました。

全体として、コミュニティは crustc を 新規性のある概念実証 と見なし、移植性、ブートストラップ、クロスコンパイルへの興味深い示唆があると評価しつつ、ツールはまだ実験的段階であることを認識しています。


今後の展望

crustc は、フル Rust コンパイラが ANSI‑C で表現でき、従来の C ツールチェーンでビルドできることを示しています。作者が最終的に完全な cilly スイートをリリースすれば、開発者は 任意の C 互換プラットフォーム(Plan 9 VM からマイナーな組み込み CPU まで)を対象にでき、カスタム LLVM バックエンドを書く必要がなくなります。それまでの間、crustc は Rust をソース‑ツー‑ソース変換問題として扱ったときに技術的に何が可能かを示す魅力的なデモに留まります。

Sources