notes mizzy.org

構成データ出力DSLとgraph出力DSLはレイヤが違う

確認済み 出典: explorations/2026-04-26-cross-dsl-design-position/README.md出力の構造軸, explorations/2026-04-26-cross-dsl-design-position/carina-position.md §2 作成/ 更新

構成記述系DSLを「何を出力するか」で分けると、3自由度では捉えきれない別レイヤの差が浮上する。

出力形態内容
構成データ出力値ツリー(JSON/YAML/設定値)Pkl, KCL, CUE, Dhall, Jsonnet, Nickel
graph出力ノード + エッジの宣言Terraform, CDK, Pulumi, Carina, Bicep, cdktf, cdk8s, Crossplane, Helm
構成データ出力 — 値ツリー 枝は入れ子であって依存ではない ノード間の関係という構造を持たない 効くのは「最終valueの集合サイズ」だけ graph出力 — ノード + エッジ (a)ノード集合 = type + 属性値 (b)エッジ = 参照 / depends_on / opts.parent 自由度がノード数・identity・依存関係に効く 経路は直接出力 / ツリー→synth / RPCストリーム / YAML pipelineと分かれるが、applyの段階ではどれもresource graphを扱う
値ツリーと依存グラフは同じ「出力」でもレイヤが違う。同じ「複数量の制御」という自由度を当てても、効く先が別物になる。

graph出力DSLのコードが出すのは、(a)ノード集合(リソース宣言 = type + 属性値)と(b)エッジ(リソース間の依存関係 — 参照、depends_onopts.parent)である。構成データ出力DSLは値ツリーを出すだけで、ノード間の関係という構造を持たない。

この区別は、3自由度の評価が「何に効くか」を決める。graph出力DSLでは自由度がノード数・identity・依存関係に効くが、構成データ出力DSLでは「最終valueの集合サイズ」にしか効かない。同じ「複数量の制御」という軸を当てても、意味するものが違う。

「graph出力」という括りはgraphに至る経路を粗く扱っている点に注意が要る。最終的にresource graphになるのは共通だが、経路はツールごとに異なる — 直接出力(Terraform, Carina, Bicep, Helm)、ツリー→synthでgraph変換(CDK, cdktf, cdk8s)、RPCストリーム(Pulumi)、YAML pipeline(Crossplane)。経路は違うが、applyされる段階ではどのツールもresource graphを扱うので、3自由度の比較には経路差は直接効かない。

なおgraphを出力した後のstate管理 / 差分計算 / CRUD実行は、DSLのレイヤではなくツール(engine / CLI)のレイヤの話である。DSL同士を比べるときはこの線を越えない。

#dsl #分類 #設計空間