このプロジェクトについて

ruccはRustで書かれた早期段階の最適化Cコンパイラである。READMEによると、プロジェクトの目標梯段はまずSQLite、次によく知られたCプロジェクトの中位層、そしてPostgreSQL、最終的にはLinuxカーネルへと至る。なお、この梯段上ではソースへのパッチ適用は一切認められない。 READMEでは現状、まだ何もCコードをコンパイルできないことが明確に記されている。 M0とM1は完了しており、それぞれv0.1.0、v0.2.0としてタグ付けされている。M0ではワークスペース、チェックされるレイヤー規則、ドライバの引数解析とフェーズ計画、ジョブスケジューラ、およびLinux/macOS/Windows上のCIがカバーされた。M1はプリプロセッサであり、翻訳フェーズ、隠しセットマクロ展開、_Pragmaや#undefを含むディレクティブ、#include_nextや#pragma onceによるインクルード解決、__has_*ファミリー、およびターゲット説明から生成される事前定義マクロなどが実装されている。 rucc -E a.cはglibcおよびmuslのヘッダセットに対するリファレンスコンパイラの出力とのdiff検証を行う実際のプリプロセッサとして動作する。rucc a.cを実行すると現在フェーズ計画を表示し、プリプロセッシング以降のフェーズはまだ未実装であることを報告する。 デザインセクションでは、いくつかの予定または進行中の変更が説明されている。変換規則と命令選択パターンは1つのDSLで記述され、同じ規則テキストはマッチャーへコンパイルされ、CIではSMTソルバーへ渡される。ソルバーが処理できない規則は規則セットに含まれない。IRはpoisonもundefもなく設計される見通しである。非巡回e-graphが変換、定数折り畳み、グローバルコード移動に計画されており、e-graphリライターと従来のパスパイプラインの両方が構築・測定され、どちらが優るか判断される。 レイヤー規則はcargo xtask layersによってチェックされ、クレートにランクが割り当てられ、クレートはより低いランクのクレートにのみ依存できるようになっている。コンパイル経路は外部アセンブラやリンカーを持たないことを目指し、命令はバイトエンコーディングされ、ELF、Mach-O、COFFはプロジェクト内で書き出され、DWARFもプロジェクト内で出力される。 READMEでは、1.0未満では依然として実際のリンカーにシェルアウトすることが述べられており、これが維持されるかどうかは未解決の問題である。 READMEは正しさ、コンパイルスループット、コード品質、移植性に関する計測可能な主張として目標を枠組み化し、手法とレポート規則はspec/16-performance.mdに配置される。 リポジトリレイアウトには、コンパイラ用クレート、ルールDSLコンパイラおよびSMT検証用ビルドツール、ターゲット用にコンパイルされるランタイムクレート、20の仕様文書、17のクロスコンパレーション文書、生成ドキュメント、xtaskビルド自動化、およびテストが含まれる。 インストール方法としては、SHA-256ファイルとビルドの出自証跡付きのLinux/macOS/Windows用プリビルドバイナリ、ならびにcargo install ruccが用意されている。 ビルドはgit clone、cargo build --releaseで行い、configureやCMake、Pythonを必要とせず、build.rsやxtask以外でのコード生成もない。 タスクにはcargo xtask layers、cargo xtask style、cargo xtask ciがある。 READMEはC++、MSVCダイアレクト拡張、JIT、MSan、CompCertスタイルの検証済みコンパイラを範囲外としてリストアップしている。 ライセンスはApache-2.0。