DSLによる抽象レイヤーの構築

4.5K Views

January 31, 25

スライド概要

吉祥寺.pm37 の登壇資料です。
https://kichijojipm.connpass.com/event/339040/

profile-image

著書『アーキテクトの教科書 価値を生むソフトウェアのアーキテクチャ構築』(翔泳社)

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

DSLによる 抽象レイヤーの構築 吉祥寺.pm 37 Jan 31, 2025 Takeshi Yonekubo

2.

About Me • 米久保 剛 (よねくぼ たけし) • アーキテクト / 設計好き • X: @tyonekubo

3.

告知 • デブサミ2025で登壇します!(13-B-1) サイン会もあるよ! 12:30〜 3F休憩室 書籍販売コーナー https://event.shoeisha.jp/devsumi/20250213/session/5516

4.

DSL (ドメイン特化言語)

5.

DSLとは • Domain-Specific Language • ドメイン特化言語 / ドメイン固有言語 • 特定のドメインの問題に特化したミニ言語 • オススメ本は残念ながら、いずれも絶版

6.

DSLの分類 内部DSL ホスト言語の仕組みで 実装 外部DSL 独自の構文を持つ独立 した言語を実装 動的型付け言語を利用 Ruby、Groovyなど 静的型付け言語を利用 Scala、Kotlinなど 汎用フォーマット XML、YAMLなど 独自フォーマット ※専用のパーサーの 実装が必要

7.

例)Spock (Groovy) 内部DSL・動的型付け言語 thenブロックは アサーション whereブロックは パラメータ化テスト

8.

例)Gradle (Kotlin) 内部DSL・静的型付け言語 ビルドの依存関係などを DSLで記述 https://docs.gradle.org/current/userguide/kotlin_dsl.html

9.

例)GitHub Actions (YAML) 外部DSL・汎用フォーマット CI/CDのワークフローを 記述 https://docs.github.com/ja/actions/writing-workflows/about-workflows

10.

例)HDL (『コンピュータシステムの理論と実装』より) 外部DSL・独自フォーマット ハードウェアシミュレータ上で 動作する論理ゲートを記述

11.

DSLの長所 DSLは表現力豊かである DSLは簡潔である DSLは高い抽象化レベルで 設計されている 『実践プログラミングDSL』第1章より

12.

Why DSL? “抽象とは、余計な詳細がユーザーの目に映らない ようにすることで、対象となるものの本質的な属 性に焦点を当てるものです” 『実践プログラミングDSL』第1章より 偶有的複雑性を排除し、ドメインの 本質的な問題に集中することができる

13.

For Whom? • 開発者 • インフラエンジニア • QAエンジニア • ドメインエキスパート • 生成AI ??? • エンドユーザー …メインの利用者 …IaCなど …E2Eなど …仕様のレビュー

14.

生成AI • 2024年後半より、自律型AIエージェントが台頭 • キモは「推論」「計画」「ツール利用」 • システム界面の抽象レイヤーとしてDSLを与えれば? “AutoGPT+P Feedback Loop” https://arxiv.org/html/2402.10778v1

15.

エンドユーザー • 2022年に必修履修科目「情報Ⅰ」が新設 • プログラミング思考+AIによる支援 • DSLの利用者となり得る 時事通信ニュース https://sp.m.jiji.com/article/show/3427095

16.

AI Readability AIが読んで理解しやすい形式

17.

例)Dify DSL • Dify:ノーコードのLLMアプリ開発プラットフォーム • ワークフローやエージェントの定義は Dify DSL (YAML)で表現される • 生成AIにDSLを出力させて取り込むことも、やればで きる

18.

例)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/

19.

汎用フォーマットの優位性 • DSLを汎用フォーマットにしておくとメリットがある • タグ付けマークアップ言語は有利 Syntax + Semantics (XMLなどのフォーマットに関する知識) (ドメイン固有知識) 大規模言語モデル RAG、コンテキスト

20.

DSLの使い分け • 外部DSLは実装コストが高い • 独自パーサー、パーサージェネレータ、パーサーコンビネー タ • 費用対効果が得られるユースケース限定 • 内部DSLが基本路線 • 比較的実装が容易(ただしテクニックは必要) • 動的型付け言語は、メタプログラミングにより高い表現力を 実現できる • エンドユーザーや生成AIを利用者に想定する場合、静的型付 け言語であれば型チェックやコード補完のメリットがある

21.

JSX:DSLの実装手段として • Reactにおいて、レンダリングロジックとコンテンツを 同じ場所にまとめて書くための記法 • JSXはReactから生まれた技術だが、他の用途でも利用 可能な仕様である https://ja.react.dev/learn/javascript-in-jsx-with-curly-braces

22.

例) VS Code Extension Samples • Copilot Extensionsのサンプルでは、CopilotのLLMへ 送信するプロンプトを、JSXで組み立てている https://github.com/microsoft/vscode-extension-samples/tree/main/chat-sample

23.

サンプルDSL:アプリケーション通知 業務アプリケーションでは、業務イベントを契機にユー ザーへ通知を送るという要件がよくある。 また、以下のような要求に対応する柔軟性が求められ る。 • 業務イベントに応じて通知文面をカスタマイズしたい • ある条件を満たした場合のみ通知を送りたい

24.

JSX (on .tsx) でDSLを記述

25.

TypeScriptであることの恩恵 • 型っていいね! コード補完 typoのエラー

26.

AI Readableであることの恩恵 • プロンプトにより生成可能

27.

Behind the scenes • 独自のJSXランタイム(jsx-runtime.ts)でSemantic Modelの構築を行い、それを解釈・実行している サンプルコード https://github.com/yonetty/dsl-with-jsx/tree/main/dsl-sample

28.

DSLの実現手段としてのJSX 実装容易性 ○ 理解容易性 ○ 表現力 △ 型安全性 ○ パーサーの実装としてかなり容易な部 類 タグ付けマークアップ言語なのでユー ザーにも生成AIにも理解しやすい タグと属性、{}によるコード埋め込み で表現可能な範囲に限定される TypeScript (.tsx) で記述することで型 のメリットを享受可能

29.

まとめ

30.

✓DSLはドメインにおける本質的な問題 と向き合うための抽象レイヤー ✓DSLは生成AIが活用できるアセットと なり得る ✓JSXは、DSLの実装手段の一つとして 可能性を秘めている

31.

✓DSLはドメインにおける本質的な問題 と向き合うための抽象レイヤー ✓DSLは生成AIが活用できるアセットと なり得る ✓JSXは、DSLの実装手段の一つとして 可能性を秘めている

32.

Fin