コンパイルの決定性 (Determinism/Purity Belt)

コンパイラの codegen は「入力だけで出力が一意に決まる純関数」でなければならない、という原則と、それを守るための仕組み。Almide では非決定性の源を CI で機械的に締め出す Determinism/Purity Belt(scripts/check-forbidden-impurities.sh が grep で検出)として実装している。

何が「RNG」か(この文脈)

ここでの RNG = 乱数生成器 (Random Number Generator)。codegen パス(parse → check → lower → mono → codegen)で乱数を使うとコンパイル出力が非決定的になる — 同じソースから実行ごとに違う WASM が出る。Belt が grep で禁止する代表トークン:

締め出す非決定性の源(まとめて禁止)

RNG 単独でなく、「codegen に絶対入れてはいけない非決定の源」を一括で禁止する。

源例なぜダメか
RNGthread_rng / fastrand / rand::random乱数で出力がブレる
clockstd::time / Instant::now時刻でビルドが変わる
threadスレッド並行実行順で出力が変わりうる
never-reset な atomic counteregg の fresh-var カウンタ系グローバル状態に依存し、コンパイル間で番号がズレる

counter 系は「コンパイルごとにリセット(決定的に採番)」すれば使える — 禁止なのはリセットされないグローバルカウンタ。

なぜ決定性が要るか

  1. 再現性 — ビルドが入力だけで決まらないと、ビルドキャッシュや [almide-differential-gate|差分ゲート]が壊れる。「同じ入力→同じ出力」が崩れると、キャッシュも検証も信用できない。
  2. プレイグラウンドの安定 — Almide コンパイラは wasm32-unknown-unknown でブラウザ実行される。出力がブレると RuntimeError: unreachable のようなトラップを誘発しうる。

押さえどころ(カード化候補)

関連

Graph