概要
crustc はRustコンパイラ(rustc 1.98.0-nightly)を C言語 (約4600万行)に変換したデモプロジェクト。 GCC と make でRustコンパイラをビルド可能。 LLVM ライブラリへのパス指定が必要。 cilly はRust→C変換ツールチェーンで、古い/珍しいハードウェア対応が主目的。 現時点では 一般公開前、動作デモと特徴紹介のみ。
RustコンパイラをC言語でビルドするcrustcの概要
- crustc はRustコンパイラ(rustc 1.98.0-nightly)を C言語 に変換したもの
- 約 4600万行 のCコードを GCC と make でビルド可能
- 必要な 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の新たな移植性を示すデモであり、今後の展開に期待が寄せられる