4.5K Views
January 31, 25
スライド概要
吉祥寺.pm37 の登壇資料です。
https://kichijojipm.connpass.com/event/339040/
著書『アーキテクトの教科書 価値を生むソフトウェアのアーキテクチャ構築』(翔泳社)
DSLによる 抽象レイヤーの構築 吉祥寺.pm 37 Jan 31, 2025 Takeshi Yonekubo
About Me • 米久保 剛 (よねくぼ たけし) • アーキテクト / 設計好き • X: @tyonekubo
告知 • デブサミ2025で登壇します!(13-B-1) サイン会もあるよ! 12:30〜 3F休憩室 書籍販売コーナー https://event.shoeisha.jp/devsumi/20250213/session/5516
DSL (ドメイン特化言語)
DSLとは • Domain-Specific Language • ドメイン特化言語 / ドメイン固有言語 • 特定のドメインの問題に特化したミニ言語 • オススメ本は残念ながら、いずれも絶版
DSLの分類 内部DSL ホスト言語の仕組みで 実装 外部DSL 独自の構文を持つ独立 した言語を実装 動的型付け言語を利用 Ruby、Groovyなど 静的型付け言語を利用 Scala、Kotlinなど 汎用フォーマット XML、YAMLなど 独自フォーマット ※専用のパーサーの 実装が必要
例)Spock (Groovy) 内部DSL・動的型付け言語 thenブロックは アサーション whereブロックは パラメータ化テスト
例)Gradle (Kotlin) 内部DSL・静的型付け言語 ビルドの依存関係などを DSLで記述 https://docs.gradle.org/current/userguide/kotlin_dsl.html
例)GitHub Actions (YAML) 外部DSL・汎用フォーマット CI/CDのワークフローを 記述 https://docs.github.com/ja/actions/writing-workflows/about-workflows
例)HDL (『コンピュータシステムの理論と実装』より) 外部DSL・独自フォーマット ハードウェアシミュレータ上で 動作する論理ゲートを記述
DSLの長所 DSLは表現力豊かである DSLは簡潔である DSLは高い抽象化レベルで 設計されている 『実践プログラミングDSL』第1章より
Why DSL? “抽象とは、余計な詳細がユーザーの目に映らない ようにすることで、対象となるものの本質的な属 性に焦点を当てるものです” 『実践プログラミングDSL』第1章より 偶有的複雑性を排除し、ドメインの 本質的な問題に集中することができる
For Whom? • 開発者 • インフラエンジニア • QAエンジニア • ドメインエキスパート • 生成AI ??? • エンドユーザー …メインの利用者 …IaCなど …E2Eなど …仕様のレビュー
生成AI • 2024年後半より、自律型AIエージェントが台頭 • キモは「推論」「計画」「ツール利用」 • システム界面の抽象レイヤーとしてDSLを与えれば? “AutoGPT+P Feedback Loop” https://arxiv.org/html/2402.10778v1
エンドユーザー • 2022年に必修履修科目「情報Ⅰ」が新設 • プログラミング思考+AIによる支援 • DSLの利用者となり得る 時事通信ニュース https://sp.m.jiji.com/article/show/3427095
AI Readability AIが読んで理解しやすい形式
例)Dify DSL • Dify:ノーコードのLLMアプリ開発プラットフォーム • ワークフローやエージェントの定義は Dify DSL (YAML)で表現される • 生成AIにDSLを出力させて取り込むことも、やればで きる
例)JQL (Jira Query Language) • 課題管理システムJIRAの検索窓で使えるクエリ言語 • ”Story Points” >= 5 のように条件を記述可能 • Atlassian Intelligence を使うと自然言語で検索可能 (裏でJQLに変換) https://support.atlassian.com/ja/jira-software-cloud/docs/use-atlassian-intelligence-to-search-for-issues/
汎用フォーマットの優位性 • DSLを汎用フォーマットにしておくとメリットがある • タグ付けマークアップ言語は有利 Syntax + Semantics (XMLなどのフォーマットに関する知識) (ドメイン固有知識) 大規模言語モデル RAG、コンテキスト
DSLの使い分け • 外部DSLは実装コストが高い • 独自パーサー、パーサージェネレータ、パーサーコンビネー タ • 費用対効果が得られるユースケース限定 • 内部DSLが基本路線 • 比較的実装が容易(ただしテクニックは必要) • 動的型付け言語は、メタプログラミングにより高い表現力を 実現できる • エンドユーザーや生成AIを利用者に想定する場合、静的型付 け言語であれば型チェックやコード補完のメリットがある
JSX:DSLの実装手段として • Reactにおいて、レンダリングロジックとコンテンツを 同じ場所にまとめて書くための記法 • JSXはReactから生まれた技術だが、他の用途でも利用 可能な仕様である https://ja.react.dev/learn/javascript-in-jsx-with-curly-braces
例) VS Code Extension Samples • Copilot Extensionsのサンプルでは、CopilotのLLMへ 送信するプロンプトを、JSXで組み立てている https://github.com/microsoft/vscode-extension-samples/tree/main/chat-sample
サンプルDSL:アプリケーション通知 業務アプリケーションでは、業務イベントを契機にユー ザーへ通知を送るという要件がよくある。 また、以下のような要求に対応する柔軟性が求められ る。 • 業務イベントに応じて通知文面をカスタマイズしたい • ある条件を満たした場合のみ通知を送りたい
JSX (on .tsx) でDSLを記述
TypeScriptであることの恩恵 • 型っていいね! コード補完 typoのエラー
AI Readableであることの恩恵 • プロンプトにより生成可能
Behind the scenes • 独自のJSXランタイム(jsx-runtime.ts)でSemantic Modelの構築を行い、それを解釈・実行している サンプルコード https://github.com/yonetty/dsl-with-jsx/tree/main/dsl-sample
DSLの実現手段としてのJSX 実装容易性 ○ 理解容易性 ○ 表現力 △ 型安全性 ○ パーサーの実装としてかなり容易な部 類 タグ付けマークアップ言語なのでユー ザーにも生成AIにも理解しやすい タグと属性、{}によるコード埋め込み で表現可能な範囲に限定される TypeScript (.tsx) で記述することで型 のメリットを享受可能
まとめ
✓DSLはドメインにおける本質的な問題 と向き合うための抽象レイヤー ✓DSLは生成AIが活用できるアセットと なり得る ✓JSXは、DSLの実装手段の一つとして 可能性を秘めている
✓DSLはドメインにおける本質的な問題 と向き合うための抽象レイヤー ✓DSLは生成AIが活用できるアセットと なり得る ✓JSXは、DSLの実装手段の一つとして 可能性を秘めている
Fin