世界を動かす技術を、日本語で。

crustc: `rustc`の全体をCに翻訳したもの

2026年7月3日原文(github.com)

概要

crustc はRustコンパイラ(rustc 1.98.0-nightly)を C言語 (約4600万行)に変換したデモプロジェクト。 GCCmake でRustコンパイラをビルド可能。 LLVM ライブラリへのパス指定が必要。 cilly はRust→C変換ツールチェーンで、古い/珍しいハードウェア対応が主目的。 現時点では 一般公開前、動作デモと特徴紹介のみ。

RustコンパイラをC言語でビルドするcrustcの概要

  • crustc はRustコンパイラ(rustc 1.98.0-nightly)を C言語 に変換したもの
  • 4600万行 のCコードを GCCmake でビルド可能
  • 必要な LLVMライブラリ (libLLVM.so.22.1-rust-1.98.0-nightly)へのパス指定が必須
  • プロジェクト内に LLVMバイナリは同梱しない方針
  • ビルド例:
    make -j20 LLVM_LIB_DIR=~/.rustup/toolchains/nightly-2026-06-16-aarch64-unknown-linux-gnu/lib
    
  • ビルド後、 LD_LIBRARY_PATH を設定してrustcのバージョン確認可能
  • 生成されたRustコンパイラで core, alloc, std などのRust標準ライブラリもビルド可能

cillyツールチェーンの特徴

  • cilly はRust→C変換のためのRustライブラリおよびコンパイラバックエンド
  • Cコンパイラの機能検出用「 witnessプログラム」を自動生成
    • 例:
      _Thread_local int KEYWORD_TLS_SUPPORTED;
      
  • ANSI Cに準拠しつつ、各種Cコンパイラ・プラットフォームごとに出力を最適化
  • 型レイアウト・サイズ・アラインメント・文字コード・整数フォーマットなどを 動的に検出
  • cilly出力のCコードは ターゲット依存 (例:Arm64用に生成したCはriscv32では動作不可)
  • 古い/珍しいハードウェア (LLVM/GCC未対応)でもRustを動かすのが主目的

ネットワーク透過性・ブートストラップ対応

  • cilly はネットワーク透過、TCP経由でCコンパイラと通信可能
    • 必要に応じてUART等にも拡張可能
  • クロスコンパイラの無い環境でも、リモートでRust→C→バイナリ生成が可能
  • 例: Linux上のrustcからPlan9 VM(x86)向けRustプログラムをビルド成功

Makefile生成・ビルド支援

  • cillyは オブジェクトファイル内にマーカー埋め込みIRキャッシュ保存 が可能
  • 関数・グローバル定義位置ごとに分割し、 Makefile自動生成 機能を持つ
  • Cコンパイラ+makeでRustプロジェクトのビルドを容易化

ABI互換性・制限事項

  • cilly生成コードは ほぼABI互換 (ただし一部プラットフォーム例外あり)
    • 例:Arm64では小さなstructの返却方法がCとRustで異なり完全互換でない
  • 最適化オプションは非推奨(バグ・ビルド時間増大の恐れあり)
  • ビルドは最適化なしで数分程度
  • ディレクトリ構造によってはcrustcがクラッシュする既知バグあり

利用方法・ビルド手順

  • 必要な環境
    • Linux(例: aarch64)
    • GCC(例: 13.3.0)
    • LLVM(例: 22.1-rust-1.98.0-nightly)
    • GNU make
  • ビルド手順
    • LLVMライブラリパスを指定してmake実行
    • LD_LIBRARY_PATHを設定し、rustc --versionで動作確認
    • 標準ライブラリ(std)ビルドには追加手順が必要(詳細はBUILDING_STD.md参照)
  • 現時点では cilly本体の一般公開は未定

備考・注意点

  • 一部C++(LLVMラッパー)も必要、LLVMバージョン依存のためプリコンパイル済みで提供
  • 例外的な仮定(例: ポインタ型変換)にはドキュメントとassertで対応
  • Plan 9など「Rust未対応」プラットフォームでもC経由でRust導入可能
  • Arm64のstruct返却方式など、完全なABI互換が難しいケースあり
  • 最適化関連バグのため、cillyツールチェーンの公開は準備中

このプロジェクトはRustの新たな移植性を示すデモであり、今後の展開に期待が寄せられる

Hackerたちの意見

左手をブレンダーに突っ込んじゃった。ブレンダーの勝ち。 (指は全部無事、ちょっと縫っただけ。)詳しくは言わないけど、残念だな。これについての記事、読みたかったな。

俺もBlender使うたびに混乱するけど、指を失うほどではないな…

もっと知りたい!

これの主な目的は、LLVM/GCCサポートがない古い/マイナーなハードウェアのサポートだよ。まだRustをサポートしてないけど、Cはサポートしてるシステムがいくつかある。ランディングページにはPlan 9がその一つとして挙げられてる。

過去3年間、RustをCにコンパイルする作業をしてきたんだ。これが14回目の挑戦だよ。ニッチな興味に対するその献身、リスペクトだね。 > これの主な目的は、LLVM/GCCサポートがない古い/マイナーなハードウェアのサポートだよ。ブートストラッピングの問題について読んだことがあるけど、通常はRustコンパイラをソースからビルドするのにRustコンパイラが必要なんだよね。 https://bootstrapping.miraheze.org/wiki/Bootstrapping_Specif... あ、でもRustコンパイラのC++実装があるみたいだ。 https://github.com/thepowersgang/mrustc とにかく、この部分も役立ちそうだね。crustcがネットワークやデバイスを跨いでコンパイルできるって。

で、著者はRustからCへのトランスパイラを作って、すぐにそれを使って... Rustコンパイラをトランスパイルしたんだね。好きだわ。

Guixはコンパイラパッケージ用にRustのブートストラップにmrustcを使ってるけど、これは本当に印象的なプロジェクトで、しばらくの間その役割をうまく果たしてきたんだ。だけど、この新しいプロジェクトは他の理由でも興味深いよ。mrustcは、rustcが使っているRustの事実上の「サブセット」をターゲットにしているからね。これ、LLVMがサポートしていないプラットフォーム向けにRustプログラムをコンパイルするような、もっと広い用途がありそうだね。本当にANSI C(C89くらい)をターゲットにするなら、普通のrustcではできないプラットフォームがたくさんあるかもしれない。Rustのブートストラッププロセスについての詳細(2018年): https://guix.gnu.org/blog/2018/bootstrapping-rust/

Diverse Double-Compiling (DDC)を試して、公式のRustコンパイラにバックドアがあるかテストしてみた? crustcを使ってRustのソースコードをコンパイルして、新しいコンパイラを作る。その新しいコンパイラと公式のrustcバイナリを、どちらも決定的なフラグで使って、再度Rustのソースコードをコンパイルするんだ。二つの出力はビット単位で一致するはずだよ。

すごいアイデアだね!

これ、https://www.cs.cmu.edu/~rdriley/487/papers/Thompson_1984_Ref...を思い出させるな。

これはmrustcで行われて、バイト単位で同一の出力を生成したんだ。

それよりも、GuixプロジェクトからブートストラップされたRustを手に入れることができるよ。ほんの小さな検証可能なバイナリから、システム全体をソースコードからブートストラップしてるんだ。

Hacker Newsで議論の続きを見る