Goアプリケーションにスクリプト言語を組み込む3つのアプローチを比較するサンプルプロジェクトです。
このリポジトリでは、同じタスク(Kubernetes ConfigMapのVPC別グループ化・マージ)を3つの異なるスクリプト言語で実装し、それぞれの特徴と使い分けを学べます:
| 言語 | 特徴 | 用途 |
|---|---|---|
| TypeScript | 型安全・汎用的 | 複雑なビジネスロジック |
| Starlark | 決定性・安全 | ビルド設定・設定管理 |
| CUE | 制約ベース・検証 | データバリデーション・生成 |
すべての実装で以下の処理を行います:
- VPC IDでグループ化: Kubernetes ConfigMapを
vpc-idラベルでグループ化 - データ抽出: 各ConfigMapから
subnet-idのみを抽出 - マージ: VPC単位でサブネット情報をマージ
- 新規作成: VPC IDを名前とする新しいConfigMapを生成
# VPC vpc-12345 のサブネット
- name: subnet-az1a
labels: { vpc-id: vpc-12345 }
data: { subnet-id: subnet-aaa111 }
- name: subnet-az1c
labels: { vpc-id: vpc-12345 }
data: { subnet-id: subnet-ccc333 }
# VPC vpc-67890 のサブネット
- name: subnet-vpc2-az1a
labels: { vpc-id: vpc-67890 }
data: { subnet-id: subnet-bbb222 }# VPC単位にマージ
- name: vpc-12345
labels: { vpc-id: vpc-12345, merged: "true" }
data:
subnet-az1a.subnet-id: subnet-aaa111
subnet-az1c.subnet-id: subnet-ccc333
- name: vpc-67890
labels: { vpc-id: vpc-67890, merged: "true" }
data:
subnet-vpc2-az1a.subnet-id: subnet-bbb222ディレクトリ: typescript/
- ランタイム: goja (Go実装のJavaScript VM)
- トランスパイラ: esbuild
- 特徴:
- ✅ 型安全な開発(TypeScript)
- ✅ 豊富なエコシステム
- ✅ sourcemap対応でエラー行番号を正確に表示
- ❌ トランスパイルが必要
cd typescript
go run main.goディレクトリ: starlark/
- ランタイム: starlark-go
- 特徴:
- ✅ 決定性(同じ入力→同じ出力)
- ✅ サンドボックス化(ファイルI/O・ネットワーク禁止)
- ✅ Pythonライクで学習コストが低い
- ✅ 並列実行可能
- ❌ 標準ライブラリ制限
cd starlark
go run main.goディレクトリ: cuelang/
- ランタイム: cuelang.org/go
- 特徴:
- ✅ コンパイル時の型チェック・バリデーション
- ✅ 制約ベースのデータ定義
- ✅ Kubernetesネイティブ対応
- ✅ JSONスーパーセットで学習が容易
- ❌ 手続き型処理には不向き
cd cuelang
go run main.go| 項目 | TypeScript | Starlark | CUE |
|---|---|---|---|
| 構文 | JavaScript/TypeScript | Python風 | JSON拡張 |
| 型システム | オプショナル静的型付け | 動的型付け | 静的型付け(制約) |
| 実行 | トランスパイル→VM | 直接実行 | 評価 |
| エラー検出 | 実行時 | 実行時 | コンパイル時 |
| 決定性 | ❌ | ✅ | ✅ |
| サンドボックス | ❌ | ✅ | ✅ |
| 用途 | 推奨 | 理由 |
|---|---|---|
| 複雑なビジネスロジック | TypeScript | 型安全・デバッグ容易・豊富なライブラリ |
| ビルド設定 | Starlark | 決定性・並列実行・安全性 |
| データバリデーション | CUE | コンパイル時チェック・スキーマ定義 |
| 設定ファイル生成 | CUE | 制約ベース・テンプレート機能 |
| プラグインシステム | TypeScript/Starlark | 柔軟性・拡張性 |
| 項目 | TypeScript | Starlark | CUE |
|---|---|---|---|
| 起動時間 | 遅い(トランスパイル) | 速い | 速い |
| 実行速度 | 速い(JIT) | 中程度 | 速い |
| メモリ使用量 | 多い | 少ない | 中程度 |
- Go 1.23以上
- (オプション)devbox
# リポジトリをクローン
git clone https://github.com/suinplayground/golang-embedded-scripting.git
cd golang-embedded-scripting
# 各ディレクトリで依存関係をインストール
cd typescript && go mod tidy
cd ../starlark && go mod tidy
cd ../cuelang && go mod tidy# 開発環境を起動
devbox shell
# 各実装を実行
cd typescript && go run main.go
cd ../starlark && go run main.go
cd ../cuelang && go run main.go- TypeScript版 README - Goja + esbuild + sourcemap
- Starlark版 README - 決定性・サンドボックス
- CUE版 README - 制約ベース・バリデーション
- 複雑なビジネスロジックを実装したい
- 型安全性が重要
- JavaScriptエコシステムを活用したい
- デバッグのしやすさを重視
- 決定性が必要(再現性のある処理)
- サンドボックス化が必須(セキュリティ)
- ビルド設定やCI/CD定義を書きたい
- 並列実行が必要
- データのバリデーションが主目的
- スキーマ定義から設定を生成したい
- Kubernetes/Helm/Terraformと統合したい
- コンパイル時のエラー検出を重視
- TypeScript: https://www.typescriptlang.org/
- Goja: https://github.com/dop251/goja
- esbuild: https://esbuild.github.io/
- Starlark: https://github.com/bazelbuild/starlark
- starlark-go: https://github.com/google/starlark-go
- CUE: https://cuelang.org/
- CUE Go API: https://pkg.go.dev/cuelang.org/go/cue
- Bazel: Starlarkを使ったビルドシステム
- Buck2: MetaのStarlarkベースビルドツール
- Isopod: StarlarkベースのKubernetes管理ツール
- kustomize: Kubernetesマニフェストのカスタマイズツール(CUE対応)
このプロジェクトはサンプルコードです。自由にご利用ください。
Issue・PRを歓迎します!
作成者: @suinplayground