ドメイン固有言語( DSL ) は、特定のアプリケーションドメインに特化したコンピュータ言語です。これは、ドメインをまたいで広く適用できる汎用言語(GPL)とは対照的です。DSL には、Web ページ用のHTMLのように一般的なドメインで広く使用されている言語から、MUSHソフト コードのように 1 つまたは少数のソフトウェアのみで使用される言語まで、さまざまな種類があります。DSL は、言語の種類によってさらに細分化でき、ドメイン固有マークアップ言語、ドメイン固有モデリング言語(より一般的には仕様言語)、ドメイン固有プログラミング言語が含まれます。特殊目的のコンピュータ言語はコンピュータ時代に常に存在していましたが、「ドメイン固有言語」という用語は、ドメイン固有モデリングの台頭によりより一般的になりました。より単純な DSL、特に単一のアプリケーションで使用される DSL は、非公式にミニ言語と呼ばれることがあります。
汎用言語とドメイン固有言語の境界線は必ずしも明確ではありません。ある言語が特定のドメインに特化した機能を備えていても、より広い範囲に適用できる場合もあれば、逆に、原理的には幅広い用途に対応できるものの、実際には特定のドメインで主に使用されている場合もあります。例えば、Perlは元々、 AWKやシェルスクリプトと同じドメインのテキスト処理および連結言語として開発されましたが、後に汎用プログラミング言語として広く使われるようになりました。一方、PostScriptはチューリング完全な言語であり、原理的にはあらゆるタスクに使用できますが、実際にはページ記述言語として限定的に使用されています。
適切な DSL の設計と使用は、ドメイン エンジニアリングの重要な部分であり、対象となるドメインに適した言語を使用することで実現されます。これには、既存の DSL や GPL を使用することも、新しい DSL を開発することもできます。言語指向プログラミングでは、問題を表現するための専用言語の作成を、問題解決プロセスの標準的な一部とみなしています。既存の言語を再利用するのではなく、ドメイン固有言語 (およびそれをサポートするソフトウェア) を作成することは、その言語によって特定の種類の問題や解決策を既存の言語よりも明確に表現でき、かつ問題の種類が十分に頻繁に発生する場合に、有益となる可能性があります。実際には、DSL は、特定の問題領域、特定の問題表現手法、特定の解決策手法、またはドメインのその他の側面に特化することができます。
ドメイン固有言語は、特定のドメインにおける問題を解決するために特別に作成されたものであり、そのドメイン外の問題を解決することを目的としたものではありません(技術的には可能かもしれませんが)。一方、汎用言語は、多くのドメインにおける問題を解決するために作成されます。ドメインはビジネス分野である場合もあります。ビジネス分野の例としては、以下のようなものがあります。
ドメイン固有言語は、小型のプログラミング言語とスクリプト言語の中間に位置し、プログラミングライブラリと同様の方法で使用されることが多い。これらの概念の境界は、スクリプト言語と汎用言語の境界と同様に、非常に曖昧である。
ドメイン固有言語とは、設計と実装において非常に具体的な目標を持つ言語(あるいは多くの場合、宣言された構文や文法)のことです。ドメイン固有言語には、Generic Eclipse Modeling Systemで作成されたような視覚的な図式言語、 Eclipse Modeling Frameworkのようなプログラム的な抽象化、あるいはテキスト言語などがあります。例えば、コマンドラインユーティリティのgrepには、テキスト行内のパターンに一致する正規表現構文があります。sedユーティリティは、正規表現のマッチングと置換のための構文を定義しています。多くの場合、これらの小さな言語はシェル内で組み合わせて使用することで、より複雑なプログラミングタスクを実行できます。
ドメイン固有言語とスクリプト言語の境界線はやや曖昧ですが、ドメイン固有言語には、ファイルシステムへのアクセス、プロセス間制御、およびフル機能のプログラミング言語(スクリプト言語を含む)の特徴であるその他の機能のための低レベル関数が欠けていることがよくあります。多くのドメイン固有言語は、バイトコードや実行可能コードではなく、さまざまな種類のメディアオブジェクトにコンパイルされます。GraphViz はPostScript、Graphics Interchange Format ( GIF )、Joint Photographic Experts Group ( JPEG ) などにエクスポートし、Csound はオーディオファイルにコンパイルされ、 Persistence of Vision Ray Tracer ( POV-Ray ) のようなレイトレーシングのドメイン固有言語はグラフィックファイルにコンパイルされます。
SQLのようなデータ定義言語は興味深い事例です。特定のドメイン(SQLの場合はリレーショナルデータベースへのアクセスと管理)に特化しているため、ドメイン固有言語とみなすことができ、他のアプリケーションから呼び出されることも多いですが、SQLは多くのスクリプト言語よりも多くのキーワードと関数を持ち、プログラミングにおけるデータベース操作の普及と、この言語を熟知するために必要な高度な知識量のため、しばしば完全な言語として捉えられています。
さらにこの境界線を曖昧にしているのは、多くのドメイン固有言語がAPIを公開しており、実行の流れを中断したり別のプロセスを呼び出したりすることなく、他のプログラミング言語からアクセスできるため、プログラミングライブラリとして機能することができる点である。
ドメイン固有言語の中には、時間の経過とともに機能拡張され、フル機能のプログラミングツールを含むようになるものがあり、その結果、ある言語がドメイン固有であるか否かという問題がさらに複雑化します。良い例として、関数型言語である拡張スタイルシート言語変換(XSLT)が挙げられます。これは、あるXMLグラフを別のXMLグラフに変換するために特別に設計された言語ですが、開発当初から拡張され、(特にバージョン2.0では)さまざまな形式のファイルシステム操作、文字列や日付の操作、データ型付けが可能になりました。
モデル駆動型エンジニアリングでは、オブジェクト制約言語(OCL)(モデルにアサーションを付加するための言語)やクエリ/ビュー/変換(QVT )(ドメイン固有の変換言語)など、ドメイン固有言語の例が数多く見られます。しかし、統一モデリング言語(UML)のような言語は、一般的に汎用モデリング言語です。
要約すると、たとえ話が役立ちます。非常に小さな言語はナイフのようなもので、食べ物を切ることから護身まで、何千通りもの用途があります。ドメイン固有言語は電動ドリルのようなものです。幅広い用途を持つ強力なツールですが、特定の状況、つまり物に穴を開けるという用途に限定されます。汎用言語は、さまざまなタスクを実行するためのさまざまなツールを備えた完全な作業台のようなものです。ドメイン固有言語は、現在の作業台を見て、より優れたドリルが必要だと気づき、特定のドメイン固有言語がまさにそれを提供してくれると気づいたプログラマーが使用すべきです。
独立したインタプリタまたはコンパイラを介して実装される DSL は、外部ドメイン固有言語と呼ばれます。よく知られた例としては、TeX や AWK があります。組み込み (または内部) ドメイン固有言語と呼ばれる別のカテゴリは、通常、ホスト言語内にライブラリとして実装され、ホスト言語の構文に限定される傾向がありますが、これはホスト言語の機能に依存します。[ 1 ]
ドメイン固有言語にはいくつかの使用パターンがあります: [ 2 ] [ 3 ]
ソフトウェアエンジニアリングにおいてドメイン固有言語(DSL)を採用することには、リスクと機会の両方が伴います。適切に設計されたDSLは、これらのバランスをうまく取ることができます。
ドメイン固有言語には、汎用言語とは対照的な重要な設計目標がある。
プログラミングにおいて、イディオムとは、プログラマーが一般的な開発タスクを処理するために採用する手法のことです。例:
汎用プログラミング言語ではこのような慣用表現をサポートすることは稀ですが、ドメイン固有言語ではそれらを記述できます。例:
ドメイン固有のプログラミング言語の例としては、 HTML、鉛筆のような描画のためのLogo 、ハードウェア記述言語のVerilogとVHDL 、行列プログラミングのためのMATLABとGNU Octave 、記号数学のためのMathematica、MapleとMaxima、リアクティブシステムと分散システムのための仕様記述言語、スプレッドシートの数式とマクロ、リレーショナルデータベースクエリのためのSQL、パーサーを作成するためのYacc文法、レクサーを指定するための正規表現、ダイアグラム言語を作成するためのGeneric Eclipse Modeling System 、サウンドと音楽合成のためのCsound 、グラフレイアウトとグラフ書き換えに使用されるソフトウェアパッケージGraphVizとGrGenの入力言語、Terraformやその他のHashiCorpツールに使用されるHashiCorp構成言語、Puppetも独自の構成言語を持っています。
GMLは、 GameMaker Studioで使用されるドメイン固有言語で、プログラミング初心者がコーディングの基礎をより簡単に習得できるように設計されています。Delphi 、C++、BASICなど、複数の言語を組み合わせたような機能を持っています。ほとんどのGML関数は、コンパイル後、対象プラットフォーム固有の言語で記述されたランタイム関数を呼び出すため、最終的な実装はユーザーには見えません。この言語の主な目的は、ゲーム開発への参入障壁を下げることです。メインゲームループを管理し、関数の実装を処理するGameMakerランタイムにより、シンプルなゲームでも数千行のコードではなく、わずか数行のコードで済みます。
ColdFusionに関連するスクリプト言語も、データ駆動型Webサイト向けのドメイン固有言語の一例です。この言語は、Java、.NET、C++、SMS、電子メール、電子メールサーバー、HTTP、FTP、Exchange、ディレクトリサービス、ファイルシステムといった言語やサービスをWebサイトで連携させるために使用されます。
ColdFusion Markup Language(CFML)には、ColdFusionページでデータソースとのやり取り、データの操作、出力の表示に使用できる一連のタグが含まれています。CFMLタグの構文は、HTML要素の構文と似ています。
FilterMeisterは、 Photoshop互換の画像処理フィルタープラグインを作成することを目的とした、C言語をベースとしたプログラミング環境です。FilterMeister自体がPhotoshopプラグインとして動作し、スクリプトの読み込みと実行、または独立したプラグインとしてのコンパイルとエクスポートが可能です。FilterMeister言語はC言語と関数ライブラリの大部分を再現していますが、Photoshopプラグインのコンテキスト内で使用できる機能のみを含み、この特定の領域でのみ有用な独自の機能も多数追加されています。
MediaWikiのテンプレート機能は、ドメイン固有の埋め込み言語であり、その基本的な目的は、ページ テンプレートの作成とMediaWiki ページの他の MediaWiki ページへのトランスクルージョン(参照による組み込み) をサポートすることです。
ソフトウェアエンジニアリングの生産性と品質を向上させるため、ドメイン固有言語への関心が高まっている。ドメイン固有言語は、効率的なソフトウェアエンジニアリングのための強力なツールセットを提供する可能性を秘めている。こうしたツールは、重要なソフトウェアシステムの開発に徐々に導入され始めている。
ソフトウェアコスト削減ツールキット[ 7 ]はその一例です。このツールキットは、要件仕様を作成するための仕様エディタ、変数間の依存関係を表示する依存関係グラフブラウザー、仕様内の整形式式の欠落ケースを検出する整合性チェッカー、仕様に対してプログラムの特性をチェックするモデルチェッカーと定理証明器、要件に基づいて不変条件を自動的に構築する不変条件ジェネレータなどを含むユーティリティのスイートです。
より新しい発展としては、言語指向プログラミングがあり、これは主にドメイン固有言語の作成、最適化、および使用に基づいた統合的なソフトウェアエンジニアリング手法である。
言語指向プログラミングやその他のドメイン固有言語を補完するものとして、メタコンパイラと呼ばれるコンパイラ作成ツール群が存在する。このようなコンパイラは、ドメイン固有言語のパーサーやコードジェネレータを生成するのに役立ち、メタコンパイラはメタプログラミングの領域向けに特別に設計されたドメイン固有メタ言語をコンパイルする。
メタコンパイラは、ドメイン固有言語の解析に加えて、幅広いソフトウェアエンジニアリングツールや分析ツールを生成する上でも有用である。メタコンパイラの手法は、プログラム変換システムによく見られる。
コンピュータ科学とコンピュータ産業の両方で重要な役割を果たしたメタコンパイラには、META II [ 8 ]と、その子孫であるTreeMeta [ 9 ]があります。
UnrealとUnreal Tournamentは、 UnrealScriptという言語を発表しました。これにより、競合タイトルであるQuake(Id Tech 2エンジンを使用)に比べて、迅速な改良開発が可能になりました。Id Techエンジンは標準的なC言語を使用していたため、C言語を習得して適切に適用する必要がありましたが、UnrealScriptは使いやすさと効率性を重視して最適化されていました。同様に、より最近のゲームでも、独自の開発言語が導入されています。スクリプト言語としてよく使われるLuaもその一つです。
政府機関や民間企業で使用されるポリシーやビジネスルールを自動化するために、さまざまなビジネスルールエンジンが開発されてきました。ILOG 、Oracle Policy Automation、DTRules、Droolsなどは、さまざまな問題領域をサポートすることを目的としたDSLをサポートしています。DTRulesは、ルールセット内で複数のDSLを使用するためのインターフェースを定義するまでに至っています。
ビジネスルールエンジンの目的は、ビジネスロジックをできる限り人間が理解しやすい形で表現することです。これにより、専門家と開発者の両方が、同じビジネスロジック表現を用いて作業し、理解することができます。ほとんどのルールエンジンは、ビジネスロジックの制御構造を簡素化する手法(例えば、宣言型ルールや決定表の使用)と、DSL(ドメイン固有言語)に代わるプログラミング構文の選択肢の両方を提供します。
統計モデリングの研究者は、 R ( S言語の実装)、 Bugs、Jags、Stanといった分野固有の言語を開発してきた。これらの言語は、ベイズモデルを記述するための構文を提供し、シミュレーションを用いてモデルを解くための手法を生成する。
ウェブアプリケーション用のJavaScript、ドキュメント用のHTML、高性能コード用のC++など、ドメイン固有言語のインターフェース記述言語に基づいて、オブジェクト処理とサービスを生成します。これは、 Apache ThriftやGoogle Protocol Buffersなどのクロス言語フレームワークによって実現されます。
Gherkinは、ソフトウェアの動作を検証するためのテストケースを定義するために設計された言語であり、その動作の実装方法を指定する必要はありません。自然言語構文と行指向設計を採用しているため、技術的な知識のないユーザーでも読みやすく、使いやすいように設計されています。Gherkinで定義されたテストは、汎用プログラミング言語で実装する必要があります。そして、Gherkinプログラムの手順は、開発者以外のユーザーでもアクセスできるメソッド呼び出しの構文として機能します。
ドメイン固有言語のその他の代表的な例としては、以下のようなものがある。
デメリットとしては以下のようなものがある。
{{cite journal}}:ジャーナルを引用するには|journal=(ヘルプ){{cite journal}}:ジャーナルを引用するには|journal=(ヘルプ)