ADR-0007: 実装言語は Rust とし、コアは標準ライブラリのみで書く
状態: Accepted
文脈
99-open-questions.md Q3。候補は Rust / Zig / C++ / Go。 制約は以下である。
- 常駐しない(ADR-0002)ため起動時間が毎回課金される。目標 10ms 以下
- mmap、
flock、並列評価、キャンセルを扱う - 単一バイナリで配布したい
決定
実装言語を Rust とする。ワークスペースのコアクレートは Rust 標準ライブラリのみに依存し、 外部 crate の追加は都度の合意を要する。
根拠
Rust を採る理由
- GC を持たないため、キャンセル応答性が実行環境の都合で劣化しない。 Go の懸念(Q3 に記載)はここに掛かる
- mmap /
flockはlibc相当の FFI を要するが、単一 crate(あるいは薄い自前 FFI)で足りる - 参照する先行例が Rust 実装である。Salsa と rust-analyzer は、 20-architecture.md 1〜3節が丸ごと写している構造の実物である
- 単一バイナリの静的配布が既定の挙動である
採らなかった案
- Zig — 単一バイナリとツールチェーン同梱の点で適合するが、 言語自体が非安定であり、本システムの寿命(長期保守)と噛み合わない
- C++ — 自己ホスティング的な説得力はあるが、増分エンジンとキャンセルの 実装コストが最も高い。差別化点の実装に割ける労力が減る
- Go — 起動と実装容易性で優るが、GC がキャンセル応答性に与える影響の検証が 前提となり、その検証コストが Rust を選ぶコストを上回らない
標準ライブラリのみとする理由
外部 crate を素朴に採ると、次の3つが同時に損なわれる。
- 起動時間 — 動的リンクと初期化コードが増える。10ms 予算は
clap+serde+tracing程度の構成でも実測で圧迫される - 依存の統制 — サプライチェーン施策(cooldown、ライセンス許可リスト)を 設計に含める以上、自身の依存木を統制できない状態は一貫しない
- 設計の外注 — CST 表現(
rowan)とクエリエンジン(salsa)は 本システムの中心的な設計事項である。既製品に合わせると 20-architecture.md 2節の4制約を他者の都合で決めることになる
したがって CST、増分エンジン、診断、ログ、JSON 出力は自前とする。
帰結
- CST・パーサ・診断・ログ・JSON 直列化を自前で持つ。初期コストを受け入れる
- mmap /
flockを要する段階(永続化ストア)で、libcへの依存または 自前のextern "C"宣言のどちらを採るかを別途決める cargoをビルドに用いる。これは本システムが自己ホスティングするまでの暫定である- 整形は
cargo fmt、静的解析はcargo clippy。 50-development.md 5節に追記する - 外部 crate の追加はこの ADR を参照して個別に合意する。 合意した場合は本 ADR に追記するのではなく、追加分を記録する ADR を起こす