言語機能はグラフへ消える糖衣である限りで許される
IaC言語に機能を足してよいかどうかには、はっきりした判定条件がある。言語機能は、静的段階の終わりまでにグラフへ正規化されて消える糖衣である限りで許容される。以後これを蒸発条件と呼ぶ。
let、for、補間、モジュール、exportsはこの条件を満たす。planの時点ではすべて展開・置換され、残るのは型付きノード(リソース定義)とエッジ(依存)だけである。「あれば便利」の限界がここで定められる — 便利さそれ自体は許可の根拠にならず、蒸発するかどうかだけが根拠になる。
この条件は判定基準として働き、設計空間の各点に評価を下せる。
- 全域性(評価の停止保証)とは、糖衣が必ず蒸発しきることの保証である。評価が止まらない・循環するとは、グラフに正規化しきれない記述が残るということにほかならない。
- planがモノイド(平らな宣言の集まり)であるのは、蒸発後にグラフ以外の何も残らないからである。
- Pulumiの
Output.applyコールバックが問題なのは、蒸発しない糖衣 — デプロイ段階まで生き残るプログラム片 — だからである。「言語に必要なのはグラフの記述だけ」という立場からは、あれはグラフの外にはみ出た異物である。 - 型検査が項ベースの体系をほぼ必要としないことも同じ理由で説明がつく。型を付けるべき「プログラム」が実質存在しない。
コンパイラの言葉に翻訳すると、蒸発条件は「すべての言語機能はフロントエンドでlowering可能でなければならない」というIR中心の言語設計原則そのものである。字句解析・脱糖・意味解析までで人間向けの構文が消え、中間表現が知らなくてよい形に落ちる。