SDKが型を提供することは言語が制約を課すことではない
PulumiのOutput<T>やCDKのToken / BucketPropsのように、SDK側が型を提供して依存追跡や未知値伝播を表現するパターンがある。これを「言語が決める」象限の実例と数えるのは過大評価である。
理由は、これらがホスト言語の型システムの機能をSDKが活用しているだけで、ツール側が言語を拡張しているわけではないから。効くのは次の二条件が揃ったときだけである。
- (a) 静的型言語であること — Python / JavaScriptで型ヒントを書かなければruntimeまで分からない
- (b) ユーザーが型を書く慣習を採用していること
条件付きでしか効かない仕組みは、文法エラーとして必ず落ちる制約とは強制力が違う。外部DSLが「文法レベルで望ましくない書き方を禁止できる(ユーザーの記述意思に依存しない)」のに対し、SDKの型はユーザーの記述意思に依存する。
Pulumiの内部構造についても正確に押さえておく必要がある。Pulumiはランタイム実行経路には静的中間テンプレートを持たない — コード実行中にengineへgRPCストリーミングでRegisterResourceを逐次送信し、engineが随時差分判断・実行する。ただしエコシステム全体には中間表現的なものが存在する。pulumi convertでTF/CFN/BicepをPulumiコードに変換する際のPCL (Pulumi Configuration Language) は公式に「intermediate representation」と呼ばれ、pulumi preview --save-planは静的planファイル(Update Plans)を生成して後でpulumi up --planで適用できる(Terraformのplan -out相当)。