「ドメイン固有言語」の版間の差分

出典: フリー百科事典『ウィキペディア(Wikipedia)』
削除された内容 追加された内容
m ボット: 言語間リンク 11 件をウィキデータ上の (d:Q691358 に転記)
Melan (会話 | 投稿記録)
en:Domain-specific language(2013年4月9日 22:15:33(UTC))の翻訳をマージ
タグ: サイズの大幅な増減
1行目: 1行目:
'''ドメイン固有言語'''(ドメインこゆうげんご、{{lang-en-short|domain-specific language}}、DSL)とは、特定のタスク向けに設計された[[コンピュータ言語]]を意味する。'''ドメイン特化言語'''あるいは単に'''ドメイン言語'''とも呼ばれるが、学術的にはドメイン特化言語と呼ばれることが多い。[[C言語]]や[[Java]]のような'''[[汎用プログラミング言語]]'''や[[統一モデリング言語|UML]]のような'''汎用モデリング言語'''と対照的な用語である。
'''ドメイン固有言語'''(ドメインこゆうげんご、{{lang-en-short|domain-specific language}}、DSL)とは、特定のタスク向けに設計された[[コンピュータ言語]]を意味する。'''ドメイン特化言語'''あるいは単に'''ドメイン言語'''とも呼ばれるが、学術的にはドメイン特化言語と呼ばれることが多い。[[C言語]]や[[Java]]のような'''[[汎用プログラミング言語]]'''や[[統一モデリング言語|UML]]のような'''汎用モデリング言語'''と対照的な用語である。


DSL は一種類のタスクをうまく実行することに集中したものである。
DSL は一種類のタスクをうまく実行することに集中したものであり、古くから存在したが、[[ドメイン固有モデリング]]の発達と共にDSLという用語も広く知られようになってきた


例えば、[[HyperText Markup Language|HTML]]、ペン的な描画に特化した[[LOGO]]、ハードウェア記述言語である[[Verilog]]や[[VHDL]]、[[Mathematica]]や[[Maxima]]などの[[数式処理システム]]、[[表計算ソフト]]の式やマクロ、[[関係データベース]]への問い合わせ用の[[SQL]]、[[構文解析]]器構築用の[[yacc]]、[[字句解析]]器記述用の[[正規表現]]、図を作成する言語を構築する {{仮リンク|Generic Eclipse Modeling System|en|Generic Eclipse Modeling System}}、音響や音楽の合成用の[[Csound]]、グラフ描画用の[[Graphviz]]などがある。
== 利用パターン ==
DSL を利用するパターンには以下のような場合がある:
# 単独でDSLを利用する場合。また、(コマンドラインや[[Make|Makefile]]から)ユーザー操作の直接的結果として呼び出される場合。
# プログラミング言語を利用して実装されたDSLは、コンパイル時か読み込み時に汎用プログラミング言語に展開/変換される。[[メタプログラミング]]により、汎用プログラム言語としてそのまま実行可能なDSLを構築することもできる。
# [[C言語]]や[[Perl]]などの汎用プログラミング言語で書かれたプログラムから(実行時に)呼び出され、特定の機能を実行して、その結果を主プログラミング言語に返して処理を続けるという形態で使われる DSL もある。
# ユーザーアプリケーションにDSLが組み込まれている場合、そのアプリケーションのユーザーが書いたDSLコードを実行するか、アプリケーション自体がDSLコードを動的に生成して実行する。


対義語として
== ドメイン固有言語の定義 ==
* 「汎用[[プログラミング言語]]」 - [[C言語|C]]、[[Java]]、[[Python]] など
* 「汎用[[モデリング言語]]」 - [[統一モデリング言語|UML]] など
がある。

ドメイン固有言語が有効となるのは、既存の言語よりも特定領域の問題や解法をより明確に記述可能となる場合であり、かつその種の問題が比較的よく出現する場合である。{{仮リンク|言語指向プログラミング|en|Language-oriented programming}}は、問題を解く標準的過程の一部として問題を表現する特殊用途の言語を生成することを考慮する。

== 概要 ==
DSL は、ある特定の領域(ドメイン)の問題を解決するために作られ、それ以外の領域の問題を解くことは想定していない。一方、汎用プログラミング言語は様々な領域の問題を解くように作られている。
DSL は、ある特定の領域(ドメイン)の問題を解決するために作られ、それ以外の領域の問題を解くことは想定していない。一方、汎用プログラミング言語は様々な領域の問題を解くように作られている。


19行目: 21行目:
* 伝票DSL{{要出典|date=2011年6月}}
* 伝票DSL{{要出典|date=2011年6月}}


DSLは簡易なプログラミング言語と[[スクリプト言語]]の中間に位置し、[[アプリケーションプログラミングインタフェース|API]]を公開しているDSLは、他のプログラミング言語から呼び出して[[ライブラリ]]のように使うことができる。それらの概念の境界はあいまいであり、機能を完備したプログラミングツールとなるべく拡張されるDSLもあり、そのために境界が更にあいまいとなっている。
DSL は言語として(あるいは文法や構文として)非常に限定された目的で設計/実装される。DSL は視覚化された言語(ドメイン特化ダイアグラムとも言われる)の場合もあるし([[Generic Eclipse Modeling System|GEMS]]や[[Generic Modeling Environment|GME]])、プログラム的な抽象化の場合もあるし([[Eclipse Modeling Framework|EMF]])、テキスト的な言語の場合もある。例えば、[[grep]]というコマンド行で使われるユーティリティはテキストとのパターンマッチを行うための[[正規表現]]が可能である。[[sed (コンピュータ)|sed]]ユーティリティは同様に正規表現を使ってテキストとパターンマッチングさせて、文字列の置換も行う。これらの簡易言語は[[シェルスクリプト]]で利用され、より複雑なタスクを実行する一部を構成する。


=== 設計と実装 ===
DSL にはファイルシステムへのアクセス機能やプロセス間制御といった機能を完備したプログラミング言語なら当然持っているべき機能が欠けていることが多い。多くのDSLは[[バイトコード]]や実行コードと言ったものにコンパイルされることはなく、他の様々な媒体向けに変換されることが多い。
DSL は言語として(あるいは文法や構文として)非常に限定された目的で設計/実装される。DSL は視覚化された言語(ドメイン特化ダイアグラムとも言われる)の場合もあるし({{仮リンク|Generic Eclipse Modeling System|en|Generic Eclipse Modeling System|label=GEMS}})、プログラム的な抽象化の場合もあるし([[Eclipse Modeling Framework|EMF]])、テキスト的な言語の場合もある。例えば、[[grep]]というコマンドラインで使われるユーティリティはテキストとのパターンマッチを行うための[[正規表現]]が可能である。[[sed (コンピュータ)|sed]]ユーティリティは同様に正規表現を使ってテキストとパターンマッチングさせて、文字列の置換も行う。これらの簡易言語は[[シェルスクリプト]]で利用され、より複雑なタスクを実行する一部を構成する。


DSL にはファイルシステムへのアクセス機能やプロセス間制御といった機能を完備したプログラミング言語なら当然持っているべき機能が欠けていることが多い。多くのDSLは[[バイトコード]]や実行コードと言ったものにコンパイルされることはなく、他の様々な媒体向けに変換されることが多い。例えば[[Graphviz]]は[[PostScript]]、[[Graphics Interchange Format|GIF]]、[[JPEG]]などを出力し、[[Csound]]は音声ファイルを出力し、[[POV-Ray|POV]]のようなレイトレーシング用言語はグラフィックスのファイルを出力する。興味深い例として[[SQL]]がある。SQLは関係データベースへのアクセスという特定領域向けのDSLであり、他のアプリケーションから呼び出されることが多いが、その機能は多くのスクリプト言語よりも豊富であり、データベースが広く使われていることもあいまって、SQLは独立した言語としての地位を確立している。
[[アプリケーションプログラミングインタフェース|API]]を公開しているDSLは、他のプログラミング言語から呼び出して[[ライブラリ]]のように使うことができる。


=== プログラミングツール ===
機能を完備したプログラミングツールとなるべく拡張されるDSLもあり、そのために境界が更にあいまいとなっている。
一部のDSLは徐々に機能が追加されて完全なプログラミングツールとなってきているため、ある言語がDSLかそうでないかという判断はさらに複雑化している。好例として[[関数型言語]][[XSL Transformations|XSLT]]がある。当初XSLTはXMLで表現されたグラフを変換するために設計されたが、その後ファイルシステム操作、文字列操作、データ操作、データ型などが追加されていった。


[[モデル駆動工学]]では、[[Object Constraint Language|OCL]]、[[ATLAS Transformation Language|ATL]] などの各種DSLが使われる。ただし、[[統一モデリング言語|UML]]は DSL ではなく汎用[[モデリング言語]]に分類されるのが一般的である。
[[モデル駆動工学]]では、[[Object Constraint Language|OCL]]、[[QVT]] などの各種DSLが使われる。ただし、[[統一モデリング言語|UML]]は DSL ではなく汎用[[モデリング言語]]に分類されるのが一般的である。

簡易言語はナイフのようなもので、様々な用途がある。DSLは電動ドリルのようなもので、穴を空けることにかけては強力なツールである。汎用言語は工具箱のようなもので、様々なタスク向けのツール群が含まれている。プログラマがDSLを使うのは、自分の工具箱を見てもっとよいドリルが必要だと思ったときであり、その用途に最適なDSLが見つかったときである。

== DSLに関する話題 ==
=== 利用パターン ===
DSL を利用するパターンには以下のような場合がある:<ref name='Mernik05'>Marjan Mernik, Jan Heering, and Anthony M. Sloane. When and how to develop domain-specific languages. ''ACM Computing Surveys'', 37(4):316–344, 2005.{{Doi|10.1145/1118890.1118892}}</ref><ref name='Spinellis01'>Diomidis Spinellis. [http://www.spinellis.gr/pubs/jrnl/2000-JSS-DSLPatterns/html/dslpat.html Notable design patterns for domain specific languages]. ''Journal of Systems and Software'', 56(1):91–99, February 2001. {{Doi|10.1016/S0164-1212(00)00089-3}}</ref>
* 単独でDSLを利用する場合。また、(コマンドラインや[[Make|Makefile]]から)ユーザー操作の直接的結果として呼び出される場合([[Graphviz]]など)。
* プログラミング言語のマクロシステムを利用して実装されたDSLは、コンパイル時か読み込み時に汎用プログラミング言語に展開/変換される。[[メタプログラミング]]により、汎用プログラム言語としてそのまま実行可能なDSLを構築することもできる。
* [[C言語]]や[[Perl]]などの汎用プログラミング言語で書かれたプログラムから(実行時に)呼び出され、特定の機能を実行して、その結果を主プログラミング言語に返して処理を続けるという形態で使われる DSL もある。
* ユーザーアプリケーションにDSLが組み込まれている場合、そのアプリケーションのユーザーが書いたDSLコードを実行するか、アプリケーション自体がDSLコードを動的に生成して実行する。


== 要求仕様 ==
=== 設計目標 ===
=== 設計目標 ===
DSLを採用する
DSL には汎用プログラミング言語にはない次のような重要な設計目標がある:
DSL には汎用プログラミング言語にはない次のような重要な設計目標がある:
* DSL は包括的である必要はない。
* DSL は包括的である必要はない。
* DSL はその領域(ドメイン)をより表現しやすくなければならない。
* DSL はその領域(ドメイン)をより表現しやすくなければならない。
* DSL は冗長性を最小限にすべきである。ここでいう冗長性とは、仕様変更を1つ行うのに記述をどれだけ修正しなければならないかを指す。修正が少なければ、仕様変更の実装時にバグを作りこむ危険性が減る。


== 例 ==
== 例 ==
=== Unix シェルスクリプト ===
;[[yacc]]:コンパイラ用構文解析
[[UNIX|Unix]] [[シェルスクリプト]]はデータ編成用DSLのよい例である。ファイルやユーザー入力のデータを様々な形で操作できる。そのドメイン固有の抽象化と記法として、[[標準ストリーム|ストリーム]]の考え方とその操作([[リダイレクト (CLI)|リダイレクト]]や[[パイプ (コンピュータ)|パイプ]])がある。それら抽象化により、データのフローと編成に関する強力な言語を構成している。
;[[SQL]]:データベース言語
;[[Csound]]:音声ファイル作成
;[[GraphViz]]:有向グラフ描画
;[[ウィキ]]のマークアップ:ウェブページの作成


その言語は、小さなタスクを行うプロセス群の実行と制御のための単純なインタフェース(スクリプト)で構成される。それらのタスクは、テーブル、グラフ、チャートなど必要な形にデータを編成するイディオムを表している。各タスクは単純な制御フローと文字列操作機構から成り、ファイル内の文字列の検索や置換、文字列の出現回数のカウントといった多数の一般的作業をカバーしている。
== ソフトウェア工学での応用 ==

Unixのスクリプト言語は[[チューリング完全]]だったとしても、汎用言語とは異なる。実際には[[スクリプト言語]]は、[[AWK]]、[[Ls (UNIX)|ls]]、[[Sort (UNIX)|sort]]、[[Wc (UNIX)|wc]]といった小さなUnixツール群と共に使われる。

=== ColdFusion Markup Language ===
データ駆動型ウェブサイトのためのDSLの例として、[[ColdFusion]]のスクリプト言語がある。ウェブサイト構築のために、Java、.NET、C++、SMS、電子メール、メールサーバ、HTTP、FTP、ディレクトリサービス、ファイルシステムなどと共に使われている。

[[ColdFusion Markup Language]] (CFML) には、ColdFusionのページでデータソースとのやりとりやデータ操作や表示出力に使用するタグ群が含まれている。CFMLのタグの構文はHTMLのそれによく似ている。

=== Erlang OTP ===
[[Erlang]] Open Telecom Platform は当初、[[エリクソン]]がDSLとして社内で使用するために設計した。[[有限オートマトン]]、汎用サーバ、イベントマネージャなどを素早く構築でき、特定分野ではCやC++といった汎用プログラミング言語を凌駕する生産性を示す。現在では公式にオープンソースとなっている。

=== FilterMeister ===
FilterMeister<ref>{{Cite web|url= http://www.filtermeister.com/ |title=FilterMeister |accessdate=2013-04-25}}</ref>はCをベースとするプログラミング言語のプログラミング環境で、[[Adobe Photoshop|Photoshop]]用画像処理フィルタ・プラグインの作成に特化している。FileMeister自体がPhotoshopのプラグインとして動作してスクリプトをロード・実行することもでき、コンパイルして独立したプラグインを生成することもできる。FilterMeisterの言語はC言語とそのライブラリの大部分を再現しているが、それはPhotoshopのプラグインで必要な部分に限られており、その領域でのみ有用な機能も追加している。

=== MediaWiki のテンプレート ===
[[MediaWiki]]のテンプレート機能は組み込み型DSLの一種であり、[[Wikipedia:Template メッセージの一覧|ページ内テンプレート]]の作成サポートとMediaWikiのページ間の[[トランスクルージョン]]を基本的目的としている。詳しくは、[[Help:テンプレート]]を参照。

=== ソフトウェア工学での応用 ===
ドメイン固有言語は、生産性と品質を向上させるものとして、[[ソフトウェア工学]]の分野で注目されてきた。DSL が効率的ソフトウェア工学のためのツールの土台となる可能性を秘めている。そのようなツールは一部のシステムの開発で使われ始めている。
ドメイン固有言語は、生産性と品質を向上させるものとして、[[ソフトウェア工学]]の分野で注目されてきた。DSL が効率的ソフトウェア工学のためのツールの土台となる可能性を秘めている。そのようなツールは一部のシステムの開発で使われ始めている。


SCR(Software Cost Reduction)ツールキットはその一例である[http://chacs.nrl.navy.mil/publications/CHACS/1998/1998heitmeyer-WIFT.pdf]。このツールキットには、[[要求仕様]]を作成するためのエディタ、変数の依存関係を表示するブラウザ、仕様内の[[整論理式]]での不備をチェックする機構、仕様とアプリケーションを比較検証する[[モデル検査]]や[[自動定理証明]]機構、仕様から自動的に不変式(invariants)を構築する機構などが含まれる。
SCR(Software Cost Reduction)ツールキットはその一例である<ref>http://www.nrl.navy.mil/chacs/pubs/02-1221.1-1419.pdf</ref>。このツールキットには、[[要求仕様]]を作成するためのエディタ、変数の依存関係を表示するブラウザ、仕様内の[[整論理式]]での不備をチェックする機構、仕様とアプリケーションを比較検証する[[モデル検査]]や[[自動定理証明]]機構、仕様から自動的に不変式(invariants)を構築する機構などが含まれる。


比較的新しい分野として{{仮リンク|言語指向プログラミング|en|Language-oriented programming}}がある。これは、DSLの作成・最適化・利用を中心にすえた方法論である。
== 利点 ==

* DSL は問題領域に適した抽象レベルと慣用句でソリューションを表現する。そのため、その領域の専門家が DSL で書かれたプログラムを理解でき、検証でき、修正でき、さらには開発できる。
=== メタコンパイラ ===
言語指向プログラミングを含めあらゆる形態のDSLを補完するものとして、{{仮リンク|メタコンパイラ|en|metacompiler}}と呼ばれる[[コンパイラジェネレータ|コンパイラ記述ツール]]がある。メタコンパイラはDSLの[[構文解析器]]と[[コード生成]]器を生成するのに便利というだけでなく、それ自体がコンパイラ記述に特化したDSLでもある。一般的な[[パーサジェネレータ]]にはないメタコンパイラ特有の特徴として、メタコンパイラは独自の言語で書かれており、メタコンパイラ自体を実行形式に変換することができる。自分自身を定義し変換できるという点で「メタ」なステップを構成しており、メタコンパイラと呼ばれる。

DSLの構文解析だけでなく、メタコンパイラは様々なソフトウェア工学と分析のツールを生成するのにも有効である。メタコンパイラの方式は、汎用ツール群構築の際の[[ブートストラップ問題|ブートストラップ]]のために{{仮リンク|プログラム変換|en|Program transformation|label=プログラム変換システム}}でよく使われている。

計算機科学史上重要なメタコンパイラとして、[[:en:META II|Meta-II]]<ref>Shorre, D.V., META II a syntax-oriented compiler writing language, Proceedings of the 1964 19th ACM National Conference, pp. 41.301-41.3011, 1964</ref> とその後継である [[:en:TREE-META|TREE-META]]<ref>C. Stephen Carr, David A. Luther, Sherian Erdmann, 'The TREE-META Compiler-Compiler System: A Meta Compiler System for the Univac 1108 and General Electric 645', University of Utah Technical Report RADC-TR-69-83.</ref> がある。

=== Unreal Engine などのゲーム向け言語 ===
[[Unreal]] と [[Unreal Tournament]] は [[UnrealScript]] という言語を公開している。それによって競合する[[Quake]]に比べて素早い修正が可能となっている。Quakeでは[[C言語]]を使った Id Tech engine を採用しており、修正にはC言語の習得が必要だが、UnrealScriptは簡便さと効率を重視して設計されている。同様に最近のゲームでは独自の言語を導入することが多く、例えばスクリプト用には[[Lua]]がよく使われている。

=== ポリシー自動化のためのルールエンジン ===
ポリシーや業務規約を自動化するための様々な{{仮リンク|ビジネス・ルール・エンジン|en|Business rules engine}}が開発されてきた。[[アイログ|ILOG]]、[[:en:Oracle Policy Automation|Oracle Policy Automation]]、[[:en:DTRules|DTRules]]、[[:en:Drools|Drools]]といった製品では、様々な分野をサポートするDSLを提供している。DTRulesでは、ルールセット内で複数のDSLを使用するためのインタフェースも定義している。

ビジネス・ルール・エンジンは、人間が読める形で[[ビジネスロジック]]を定義することを目的としている。それにより、その業務の専門家と開発者がビジネスロジックについての理解を共有できるようにしている。多くのルール・エンジンは、ビジネスロジックの制御構造を単純化する技法とDSLを使ったプログラミングを組み合わせて提供している。

=== 統計的モデリング言語 ===
統計的モデリング、特に[[ベイズ確率]]を使った技法では、[[:en:Bayesian inference using Gibbs sampling|Bugs]]や[[:en:Just another Gibbs sampler|Jags]]といったDSLが作られてきた。これらのDSLはベイズ確率モデルを記述するためのもので、シミュレーションによってそのモデルを解く手段を生成する。

== 利点と欠点 ==
DSLには次のような利点がある<ref name='Mernik05'/><ref name='Spinellis01'/>。
* DSL は問題領域に適した抽象レベルと慣用句でソリューションを表現する。そのため、その領域の専門家が DSL で書かれたプログラムを理解でき、検証でき、修正でき、さらには開発できる。ただし、実際にそうなっている実例は少ない。<ref name="Freudenthal">{{Cite journal|last=Freudenthal|first=Margus|title=Domain Specific Languages in a Customs Information System|journal=IEEE Software|date=1 January 2009|doi=10.1109/MS.2009.152}}</ref>
* コード自体がドキュメントの役割を果たす。
* コード自体がドキュメントの役割を果たす。
* DSL は、[[品質]]/[[生産性]]/信頼性/保守性/[[移植性]]/[[再利用]]性を高める。
* DSL は、[[品質]]/[[生産性]]/信頼性/保守性/[[移植性]]/[[再利用]]性を高める。
* DSL はその領域のレベルで検証可能である。言語構成要素が安全である限り、それを使って書かれたプログラムは安全とみなせる。
* DSL はその領域のレベルで検証可能である。言語構成要素が安全である限り、それを使って書かれたプログラムは安全とみなせる。


一方で、以下のような欠点もある。
== 問題点 ==
* DSLを習得するのにコストがかかるのに対して、その応用範囲が相対的に狭い。
* DSL自体を設計/実装/保守するコスト
* DSL自体を設計/実装/保守するのにもコストがかかり、そのための開発環境が必要である。
* 正しい適用範囲を探すこと
* 正しい適用範囲を探し、設定し、維持することが難しい。
* ドメイン固有な部分と汎用プログラミング言語の構文とのバランス調整の難しさ
* ドメイン固有な部分と汎用プログラミング言語の構文とのバランス調整が難しい。
* ハードコードされたソフトウェアに比較して性能的に不利な可能性がある
* ハンドコーディングされたソフトウェアに比較して性能的に不利な可能性がある(実装している[[アルゴリズム]]の効率の問題)。
* 似たようなDSLが増殖する(同業各社がそれぞれDSLを開発する場合など)<ref>{{Citation |title=On the integration of domain-specific and scientific bodies of knowledge in Model Driven Engineering |first=Eric |last=Miotto}}</ref>。
* 技術系でない(DSLの対象領域の)専門家は、DSLで書かれたプログラムであっても自らコードを書いたり修正したりできないことがある<ref name="Freudenthal"/>。
* ITシステムにDSLを組み込むことは、汎用言語に比べて困難である。
* 1つのDSLに熟達した人材は相対的に少ないため、人件費が高くつく可能性がある。
* 汎用プログラミング言語に比べてコード例を見つけにくい。

== 脚注 ==
{{Reflist}}


== 参考文献 ==
== 参考文献 ==
* Dunlavey, "Building Better Applications: a Theory of Efficient Software Development" [[トムソン (情報サービス業)|International Thomson Publishing]] ISBN 0-442-01740-5, 1994.
* Constance Heitmeyer. Using the SCR Toolset to Specify Software Requirements. ''Proceedings, Second IEEE Workshop on Industrial Strength Formal Specification Techniques'', Boca Raton, FL, Oct. 19, 1998.
* Constance Heitmeyer. Using the SCR Toolset to Specify Software Requirements. ''Proceedings, Second IEEE Workshop on Industrial Strength Formal Specification Techniques'', Boca Raton, FL, Oct. 19, 1998.
* Diomidis Spinellis. [http://www.spinellis.gr/pubs/jrnl/2000-JSS-DSLPatterns/html/dslpat.html Notable design patterns for domain specific languages]. ''Journal of Systems and Software'', 56(1):91–99, February 2001. [http://dx.doi.org/10.1016/S0164-1212(00)00089-3 doi:10.1016/S0164-1212(00)00089-3]
* Marjan Mernik, Jan Heering, and Anthony M. Sloane. When and how to develop domain-specific languages. ''ACM Computing Surveys'', 37(4):316–344, 2005. [http://doi.acm.org/10.1145/1118890.1118892 doi:10.1145/1118890.1118892]
* Marjan Mernik, Jan Heering, and Anthony M. Sloane. When and how to develop domain-specific languages. ''ACM Computing Surveys'', 37(4):316–344, 2005. {{Doi|10.1145/1118890.1118892}}
* Diomidis Spinellis. [http://www.spinellis.gr/pubs/jrnl/2000-JSS-DSLPatterns/html/dslpat.html Notable design patterns for domain specific languages]. ''Journal of Systems and Software'', 56(1):91–99, February 2001. {{Doi|10.1016/S0164-1212(00)00089-3}}
* Terence Parr. ''The Definitive ANTLR Reference: Building Domain-Specific Languages''. ISBN 978-0-9787392-5-6
* James Larus. Spending Moore's Dividend. ISSN:0001-0782. Communications of the ACM. Volume 52, Issue 5 (May 2009).
* {{Cite web |url=http://www.infoq.com/news/2007/06/dsl-or-not |title=What's a Ruby DSL and what isn't? |author=Werner Schuster |publisher=C4Media |date=June 15, 2007 |accessdate=2009-09-08}}
* Martin Fowler. ''Domain Specific Languages''. ISBN 978-0-321-71294-3
* Marco Brambilla, Jordi Cabot, Manuel Wimmer, ''[http://www.mdse-book.com Model Driven Software Engineering in Practice]'', foreword by [[:en:Richard Soley|Richard Soley]] ([[Object Management Group|OMG]] Chairman), Morgan & Claypool, USA, 2012, Synthesis Lectures on Software Engineering #1. 182 pages. ISBN paperback: 9781608458820, ISBN ebook: 9781608458837.


== 関連項目 ==
== 関連項目 ==
* [[アーキテクチャ記述言語]]
* [[ドメイン固有モデリング]]
* [[ドメイン固有モデリング]]
* [[モデル駆動工学]]
* [[モデル駆動工学]]
* [[メタモデル]]
* [[メタモデル]]
* [[プログラミングパラダイム]]
* [[コンビネータライブラリ]] - 関数型言語で DSL を実装する際の方法
* [[REBOL]]
* [[Sinatra]]
* [[シェーディング言語]]
* [[シェーディング言語]]


== 外部リンク ==
== 外部リンク ==
* [http://msdn.microsoft.com/vstudio/DSLTools/ Microsoft Visual Studio 2005: Domain-Specific Language Tools]
* [http://www.tangiblearchitect.com tangible architect - .NET Software Factory with DSL Modeller]
* [http://en.wikipedia.org/wiki/Generic_Modeling_Environment The Generic Modeling Environment (GME)]
* [http://www.eclipse.org/gmt/gems/ The Generic Eclipse Modeling System (GEMS) Homepage] or [http://www.sf.net/project/gems Development/Download Site]
* [http://lambda-the-ultimate.org/taxonomy/term/24 DSL links from Lambda the Ultimate]
* [http://lambda-the-ultimate.org/taxonomy/term/24 DSL links from Lambda the Ultimate]
* [http://www.faqs.org/docs/artu/minilanguageschapter.html Eric S. Raymond on minilanguages] (from The Art of Unix Programming)
* [http://www.faqs.org/docs/artu/minilanguageschapter.html Eric S. Raymond on minilanguages] (from The Art of Unix Programming)
* [http://martinfowler.com/dsl.html Martin Fowler on domain-specific languages]([http://capsctrl.que.jp/kdmsnr/wiki/bliki/?DomainSpecificLanguage 日本語訳]) and [http://www.martinfowler.com/articles/languageWorkbench.html Language Workbenches]([http://capsctrl.que.jp/kdmsnr/wiki/bliki/?LanguageWorkbench 日本語訳]). Also in [http://www.infoq.com/presentations/domain-specific-languages Introduction to Domain Specific Languages] a video presentation
* [http://capsctrl.que.jp/kdmsnr/wiki/bliki/?DomainSpecificLanguage ドメイン特化言語 - Martin Fowler]
* [https://www.cis.uab.edu/courses/cs693/spring2010/DSLAnnotatedBib.pdf Domain-Specific Languages: An Annotated Bibliography]
* [http://capsctrl.que.jp/kdmsnr/wiki/bliki/?LanguageWorkbench 言語ワークベンチ - Martin Fowler]
* [http://www.cs.pdx.edu/~timm/dm/dsl.html Tim Menzies on DSLs]
* [http://www.venge.net/graydon/talks/mkc/html/index.html One Day Compilers: Building a small domain-specific language using OCaml]
* [http://www.usenix.org/publications/library/proceedings/dsl97 Usenix Association: Conference on Domain-Specific Languages (DSL '97)] and [http://www.usenix.org/publications/library/proceedings/dsl99 2nd Conference on Domain-Specific Languages (DSL '99)]
* [http://compose.labri.fr/people/consel/ Charles Consel on DSLs]
* [http://homepages.cwi.nl/~arie/papers/dslbib/ Domain-Specific Languages: An Annotated Bibliography]
* [http://philcalcado.com/research-on-dsls/domain-specific-languages-dsls/internal-dsls/ Internal Domain-Specific Languages]
; 記事
* [http://www.venge.net/graydon/talks/mkc/html/index.html One Day Compilers: Building a small DSL using OCaml]
* [http://www.theserverside.com/tt/articles/article.tss?l=PragmaticGen The Pragmatic Code Generator Programmer] External DSLs with Eclipse technology
* [http://www.dsmforum.org DSMForum.org: Industry cases and examples of Domain-Specific Modeling Languages]
* {{Cite journal | id = {{Citeseerx|10.1.1.50.4685}} | title = Building Domain-Specific Languages over a Language Framework }}
* [http://www.usenix.org/publications/library/proceedings/dsl97 Usenix Association: Conference on Domain-Specific Languages (DSL '97)]
* [http://www.usenix.org/publications/library/proceedings/dsl99 Usenix Association: 2nd Conference on Domain-Specific Languages (DSL '99)]
* [http://www.acceleo.org/pages/using-acceleo-with-gmf/ Using Acceleo with GMF : Generating presentations from a MindMap DSL modeler]
* [http://www.methodsandtools.com/archive/archive.php?id=71 UML vs. Domain-Specific Languages]
* [http://www.nolics.net Nolics.net 2005] -- ドメイン固有言語と組み合わせた[[オブジェクト関連マッピング]]
* {{Cite journal | id = {{Citeseerx|10.1.1.156.6008}} | title = Meta-model Pruning | author = Sagar Sen | coauthors = et al. }}
* [http://www.softwaresecretweapons.com/jspwiki/Wiki.jsp?page=BuildVarietyOfConsumerProductsAtLowCostUsingGenerativeProgramming Feature Models for Generative Programming and DSL]
* [http://www.jetbrains.com/mps/ JetBrains Meta Programming System (MPS)]
* Article [http://www.acceleo.org/pages/using-acceleo-with-gmf/ Using Acceleo with GMF : Generating presentations from a MindMap DSL modeler]


{{DEFAULTSORT:とめいんこゆうけんこ}}
{{DEFAULTSORT:とめいんこゆうけんこ}}

2013年4月25日 (木) 21:20時点における版

ドメイン固有言語(ドメインこゆうげんご、: domain-specific language、DSL)とは、特定のタスク向けに設計されたコンピュータ言語を意味する。ドメイン特化言語あるいは単にドメイン言語とも呼ばれるが、学術的にはドメイン特化言語と呼ばれることが多い。C言語Javaのような汎用プログラミング言語UMLのような汎用モデリング言語と対照的な用語である。

DSL は一種類のタスクをうまく実行することに集中したものであり、古くから存在したが、ドメイン固有モデリングの発達と共にDSLという用語も広く知られるようになってきた。

例えば、HTML、ペン的な描画に特化したLOGO、ハードウェア記述言語であるVerilogVHDLMathematicaMaximaなどの数式処理システム表計算ソフトの式やマクロ、関係データベースへの問い合わせ用のSQL構文解析器構築用のyacc字句解析器記述用の正規表現、図を作成する言語を構築する Generic Eclipse Modeling System英語版、音響や音楽の合成用のCsound、グラフ描画用のGraphvizなどがある。

対義語として

がある。

ドメイン固有言語が有効となるのは、既存の言語よりも特定領域の問題や解法をより明確に記述可能となる場合であり、かつその種の問題が比較的よく出現する場合である。言語指向プログラミング英語版は、問題を解く標準的過程の一部として問題を表現する特殊用途の言語を生成することを考慮する。

概要

DSL は、ある特定の領域(ドメイン)の問題を解決するために作られ、それ以外の領域の問題を解くことは想定していない。一方、汎用プログラミング言語は様々な領域の問題を解くように作られている。

ドメインはビジネス領域にも対応することがある。例えば、次のようなDSLがある。

  • 大手生命保険会社は、社内で利用する生命保険ポリシーDSLを開発している[要出典]
  • 戦闘シミュレーションDSL[要出典]
  • 給与計算DSL[要出典]
  • 伝票DSL[要出典]

DSLは簡易なプログラミング言語とスクリプト言語の中間に位置し、APIを公開しているDSLは、他のプログラミング言語から呼び出してライブラリのように使うことができる。それらの概念の境界はあいまいであり、機能を完備したプログラミングツールとなるべく拡張されるDSLもあり、そのために境界が更にあいまいとなっている。

設計と実装

DSL は言語として(あるいは文法や構文として)非常に限定された目的で設計/実装される。DSL は視覚化された言語(ドメイン特化ダイアグラムとも言われる)の場合もあるし(GEMS英語版)、プログラム的な抽象化の場合もあるし(EMF)、テキスト的な言語の場合もある。例えば、grepというコマンドラインで使われるユーティリティはテキストとのパターンマッチを行うための正規表現が可能である。sedユーティリティは同様に正規表現を使ってテキストとパターンマッチングさせて、文字列の置換も行う。これらの簡易言語はシェルスクリプトで利用され、より複雑なタスクを実行する一部を構成する。

DSL にはファイルシステムへのアクセス機能やプロセス間制御といった機能を完備したプログラミング言語なら当然持っているべき機能が欠けていることが多い。多くのDSLはバイトコードや実行コードと言ったものにコンパイルされることはなく、他の様々な媒体向けに変換されることが多い。例えばGraphvizPostScriptGIFJPEGなどを出力し、Csoundは音声ファイルを出力し、POVのようなレイトレーシング用言語はグラフィックスのファイルを出力する。興味深い例としてSQLがある。SQLは関係データベースへのアクセスという特定領域向けのDSLであり、他のアプリケーションから呼び出されることが多いが、その機能は多くのスクリプト言語よりも豊富であり、データベースが広く使われていることもあいまって、SQLは独立した言語としての地位を確立している。

プログラミングツール

一部のDSLは徐々に機能が追加されて完全なプログラミングツールとなってきているため、ある言語がDSLかそうでないかという判断はさらに複雑化している。好例として関数型言語XSLTがある。当初XSLTはXMLで表現されたグラフを変換するために設計されたが、その後ファイルシステム操作、文字列操作、データ操作、データ型などが追加されていった。

モデル駆動工学では、OCLQVT などの各種DSLが使われる。ただし、UMLは DSL ではなく汎用モデリング言語に分類されるのが一般的である。

簡易言語はナイフのようなもので、様々な用途がある。DSLは電動ドリルのようなもので、穴を空けることにかけては強力なツールである。汎用言語は工具箱のようなもので、様々なタスク向けのツール群が含まれている。プログラマがDSLを使うのは、自分の工具箱を見てもっとよいドリルが必要だと思ったときであり、その用途に最適なDSLが見つかったときである。

DSLに関する話題

利用パターン

DSL を利用するパターンには以下のような場合がある:[1][2]

  • 単独でDSLを利用する場合。また、(コマンドラインやMakefileから)ユーザー操作の直接的結果として呼び出される場合(Graphvizなど)。
  • プログラミング言語のマクロシステムを利用して実装されたDSLは、コンパイル時か読み込み時に汎用プログラミング言語に展開/変換される。メタプログラミングにより、汎用プログラム言語としてそのまま実行可能なDSLを構築することもできる。
  • C言語Perlなどの汎用プログラミング言語で書かれたプログラムから(実行時に)呼び出され、特定の機能を実行して、その結果を主プログラミング言語に返して処理を続けるという形態で使われる DSL もある。
  • ユーザーアプリケーションにDSLが組み込まれている場合、そのアプリケーションのユーザーが書いたDSLコードを実行するか、アプリケーション自体がDSLコードを動的に生成して実行する。

設計目標

DSLを採用する DSL には汎用プログラミング言語にはない次のような重要な設計目標がある:

  • DSL は包括的である必要はない。
  • DSL はその領域(ドメイン)をより表現しやすくなければならない。
  • DSL は冗長性を最小限にすべきである。ここでいう冗長性とは、仕様変更を1つ行うのに記述をどれだけ修正しなければならないかを指す。修正が少なければ、仕様変更の実装時にバグを作りこむ危険性が減る。

Unix シェルスクリプト

Unix シェルスクリプトはデータ編成用DSLのよい例である。ファイルやユーザー入力のデータを様々な形で操作できる。そのドメイン固有の抽象化と記法として、ストリームの考え方とその操作(リダイレクトパイプ)がある。それら抽象化により、データのフローと編成に関する強力な言語を構成している。

その言語は、小さなタスクを行うプロセス群の実行と制御のための単純なインタフェース(スクリプト)で構成される。それらのタスクは、テーブル、グラフ、チャートなど必要な形にデータを編成するイディオムを表している。各タスクは単純な制御フローと文字列操作機構から成り、ファイル内の文字列の検索や置換、文字列の出現回数のカウントといった多数の一般的作業をカバーしている。

Unixのスクリプト言語はチューリング完全だったとしても、汎用言語とは異なる。実際にはスクリプト言語は、AWKlssortwcといった小さなUnixツール群と共に使われる。

ColdFusion Markup Language

データ駆動型ウェブサイトのためのDSLの例として、ColdFusionのスクリプト言語がある。ウェブサイト構築のために、Java、.NET、C++、SMS、電子メール、メールサーバ、HTTP、FTP、ディレクトリサービス、ファイルシステムなどと共に使われている。

ColdFusion Markup Language (CFML) には、ColdFusionのページでデータソースとのやりとりやデータ操作や表示出力に使用するタグ群が含まれている。CFMLのタグの構文はHTMLのそれによく似ている。

Erlang OTP

Erlang Open Telecom Platform は当初、エリクソンがDSLとして社内で使用するために設計した。有限オートマトン、汎用サーバ、イベントマネージャなどを素早く構築でき、特定分野ではCやC++といった汎用プログラミング言語を凌駕する生産性を示す。現在では公式にオープンソースとなっている。

FilterMeister

FilterMeister[3]はCをベースとするプログラミング言語のプログラミング環境で、Photoshop用画像処理フィルタ・プラグインの作成に特化している。FileMeister自体がPhotoshopのプラグインとして動作してスクリプトをロード・実行することもでき、コンパイルして独立したプラグインを生成することもできる。FilterMeisterの言語はC言語とそのライブラリの大部分を再現しているが、それはPhotoshopのプラグインで必要な部分に限られており、その領域でのみ有用な機能も追加している。

MediaWiki のテンプレート

MediaWikiのテンプレート機能は組み込み型DSLの一種であり、ページ内テンプレートの作成サポートとMediaWikiのページ間のトランスクルージョンを基本的目的としている。詳しくは、Help:テンプレートを参照。

ソフトウェア工学での応用

ドメイン固有言語は、生産性と品質を向上させるものとして、ソフトウェア工学の分野で注目されてきた。DSL が効率的ソフトウェア工学のためのツールの土台となる可能性を秘めている。そのようなツールは一部のシステムの開発で使われ始めている。

SCR(Software Cost Reduction)ツールキットはその一例である[4]。このツールキットには、要求仕様を作成するためのエディタ、変数の依存関係を表示するブラウザ、仕様内の整論理式での不備をチェックする機構、仕様とアプリケーションを比較検証するモデル検査自動定理証明機構、仕様から自動的に不変式(invariants)を構築する機構などが含まれる。

比較的新しい分野として言語指向プログラミング英語版がある。これは、DSLの作成・最適化・利用を中心にすえた方法論である。

メタコンパイラ

言語指向プログラミングを含めあらゆる形態のDSLを補完するものとして、メタコンパイラ英語版と呼ばれるコンパイラ記述ツールがある。メタコンパイラはDSLの構文解析器コード生成器を生成するのに便利というだけでなく、それ自体がコンパイラ記述に特化したDSLでもある。一般的なパーサジェネレータにはないメタコンパイラ特有の特徴として、メタコンパイラは独自の言語で書かれており、メタコンパイラ自体を実行形式に変換することができる。自分自身を定義し変換できるという点で「メタ」なステップを構成しており、メタコンパイラと呼ばれる。

DSLの構文解析だけでなく、メタコンパイラは様々なソフトウェア工学と分析のツールを生成するのにも有効である。メタコンパイラの方式は、汎用ツール群構築の際のブートストラップのためにプログラム変換システム英語版でよく使われている。

計算機科学史上重要なメタコンパイラとして、Meta-II[5] とその後継である TREE-META[6] がある。

Unreal Engine などのゲーム向け言語

UnrealUnreal TournamentUnrealScript という言語を公開している。それによって競合するQuakeに比べて素早い修正が可能となっている。QuakeではC言語を使った Id Tech engine を採用しており、修正にはC言語の習得が必要だが、UnrealScriptは簡便さと効率を重視して設計されている。同様に最近のゲームでは独自の言語を導入することが多く、例えばスクリプト用にはLuaがよく使われている。

ポリシー自動化のためのルールエンジン

ポリシーや業務規約を自動化するための様々なビジネス・ルール・エンジン英語版が開発されてきた。ILOGOracle Policy AutomationDTRulesDroolsといった製品では、様々な分野をサポートするDSLを提供している。DTRulesでは、ルールセット内で複数のDSLを使用するためのインタフェースも定義している。

ビジネス・ルール・エンジンは、人間が読める形でビジネスロジックを定義することを目的としている。それにより、その業務の専門家と開発者がビジネスロジックについての理解を共有できるようにしている。多くのルール・エンジンは、ビジネスロジックの制御構造を単純化する技法とDSLを使ったプログラミングを組み合わせて提供している。

統計的モデリング言語

統計的モデリング、特にベイズ確率を使った技法では、BugsJagsといったDSLが作られてきた。これらのDSLはベイズ確率モデルを記述するためのもので、シミュレーションによってそのモデルを解く手段を生成する。

利点と欠点

DSLには次のような利点がある[1][2]

  • DSL は問題領域に適した抽象レベルと慣用句でソリューションを表現する。そのため、その領域の専門家が DSL で書かれたプログラムを理解でき、検証でき、修正でき、さらには開発できる。ただし、実際にそうなっている実例は少ない。[7]
  • コード自体がドキュメントの役割を果たす。
  • DSL は、品質/生産性/信頼性/保守性/移植性/再利用性を高める。
  • DSL はその領域のレベルで検証可能である。言語構成要素が安全である限り、それを使って書かれたプログラムは安全とみなせる。

一方で、以下のような欠点もある。

  • DSLを習得するのにコストがかかるのに対して、その応用範囲が相対的に狭い。
  • DSL自体を設計/実装/保守するのにもコストがかかり、そのための開発環境が必要である。
  • 正しい適用範囲を探し、設定し、維持することが難しい。
  • ドメイン固有な部分と汎用プログラミング言語の構文とのバランス調整が難しい。
  • ハンドコーディングされたソフトウェアに比較して性能的に不利な可能性がある(実装しているアルゴリズムの効率の問題)。
  • 似たようなDSLが増殖する(同業各社がそれぞれDSLを開発する場合など)[8]
  • 技術系でない(DSLの対象領域の)専門家は、DSLで書かれたプログラムであっても自らコードを書いたり修正したりできないことがある[7]
  • ITシステムにDSLを組み込むことは、汎用言語に比べて困難である。
  • 1つのDSLに熟達した人材は相対的に少ないため、人件費が高くつく可能性がある。
  • 汎用プログラミング言語に比べてコード例を見つけにくい。

脚注

  1. ^ a b Marjan Mernik, Jan Heering, and Anthony M. Sloane. When and how to develop domain-specific languages. ACM Computing Surveys, 37(4):316–344, 2005.doi:10.1145/1118890.1118892
  2. ^ a b Diomidis Spinellis. Notable design patterns for domain specific languages. Journal of Systems and Software, 56(1):91–99, February 2001. doi:10.1016/S0164-1212(00)00089-3
  3. ^ FilterMeister”. 2013年4月25日閲覧。
  4. ^ http://www.nrl.navy.mil/chacs/pubs/02-1221.1-1419.pdf
  5. ^ Shorre, D.V., META II a syntax-oriented compiler writing language, Proceedings of the 1964 19th ACM National Conference, pp. 41.301-41.3011, 1964
  6. ^ C. Stephen Carr, David A. Luther, Sherian Erdmann, 'The TREE-META Compiler-Compiler System: A Meta Compiler System for the Univac 1108 and General Electric 645', University of Utah Technical Report RADC-TR-69-83.
  7. ^ a b Freudenthal, Margus (1 January 2009). “Domain Specific Languages in a Customs Information System”. IEEE Software. doi:10.1109/MS.2009.152. 
  8. ^ Miotto, Eric, On the integration of domain-specific and scientific bodies of knowledge in Model Driven Engineering 

参考文献

関連項目

外部リンク

記事
  • The Pragmatic Code Generator Programmer External DSLs with Eclipse technology
  • Building Domain-Specific Languages over a Language Framework. CiteSeerx10.1.1.50.4685. 
  • Using Acceleo with GMF : Generating presentations from a MindMap DSL modeler
  • UML vs. Domain-Specific Languages
  • Sagar Sen; et al.. Meta-model Pruning. CiteSeerx10.1.1.156.6008.