notes mizzy.org

IaCのコンパイルは二引数である

解釈 出典: explorations/2026-06-10-carina-type-system-type-theory/plan-as-compilation.md §3 作成

通常のコンパイラはソースだけの関数である: compile(source) = binary。IaCのコンパイルは二引数である: plan(source, state) = patch。ソースが記述するのは「あるべき状態」であり、出力されるのは「現状との差分を埋める命令列」だからだ。

通常のコンパイラ source compile binary IaCのコンパイル source state(世界) plan patch 世界が違えば同じソースでも 違うpatchが出る
第二引数が入ることが、コンパイラ類比の中でIaC固有の性質を最も多く生む。増分性も、結果が世界のスナップショットに依存することも、ここから出る。

この一点が、コンパイラ類比の中でIaC固有の性質を最も多く生む。

第一に、コンパイルは本質的に増分(incremental)である。同じソースでも世界が違えば違うpatchが出るし、世界がすでにソースの意味と一致していれば空のplanが出る — 不動点に達した増分ビルドがno-opになるのと同じである。

第二に、コンパイル結果の正しさが世界のスナップショットに依存する。planが読んだstateが古くなればpatchは陳腐化する。これがTOCTOUドリフト検出(planの前後でstateの指紋を比べ、動いていれば警告)の存在理由であり、通常のコンパイラには無い段である。

ビルドシステムの用語でいえば、Carinaは「ソース → 成果物」のビルドではなく「世界を宣言へ収束させる」自己調整計算(self-adjusting computation)を、毎回のplanで一段ずつ実行している。

二引数性は、類比が切れる場所としても現れる。refreshは世界の現状を観測してから差分を取る。ソースしか読まない通常のコンパイルと違い、コンパイラ自身がターゲットを読む。これは限界というより、IaCのコンパイルを定義づける本質的な差である。

#iac #コンパイラ #増分計算