notes mizzy.org

類比が切れるのはターゲットが生きている場所である

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

「planはコンパイルである」という類比が切れる場所は散らばっていない。すべて一つの原因に帰着する — ターゲットが受動的なメモリではなく、生きた外部世界であること。切れ目は三つある。

ターゲットが 生きた外部世界 第一に、書き込みが失敗する APIエラーで途中失敗 — 半分だけ書かれたバイナリが残る 第二に、ターゲットは共有可変である planとapplyの間に他の書き手が世界を変えうる 第三に、コンパイラ自身がターゲットを読む refreshは世界の現状を観測する — 二引数性の言い換え
三つの切れ目は散らばった例外ではなく、一つの原因の三つの現れである。この三点の外側では、コンパイラの蓄積がほぼそのまま使える。

第一に、書き込みが失敗する。 通常のローダでstore命令は失敗しないが、applyの1命令はAPIエラーで失敗しうる。途中失敗は「半分だけ書かれたバイナリ」を残す — トランザクションも自動ロールバックもなく、回復は次回の差分コンパイル(再plan)に委ねられる。コンパイラ・リンカの世界には対応物がない状況である。

第二に、ターゲットは共有可変である。 コンパイル(plan)と実行(apply)の間に他の書き手が世界を変えうる。planがロックを取らない設計(TOCTOU窓 + ドリフト警告 + apply側での再計算)は、「IRは予測にすぎず、真の整合性は実行直前に再確立する」という、共有可変ターゲットに対する妥当な妥協である。

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

この三点が、IaCをコンパイラ工学の単純な転写から分かつ固有の領域である。逆に言えば、この三点の外側ではコンパイラの蓄積がほぼそのまま使える。切れ目を先に押さえておくことが、類比を道具として安全に使う条件になる。

#iac #コンパイラ #限界