ドメイン固有言語は、特定のクラスの問題に対して最適化された、より高いレベルで抽象化されたプログラミング言語です。DSL は、フィールドまたはドメインの概念とルールを使用します。
ドメイン固有言語は通常、Java、C、Rubyなどの汎用言語ほど複雑ではありません。一般に DSL は、DSL の設計対象分野の専門家と密に協力しながら開発されます。多くの場合、DSL はソフトウェア開発者が使用することを想定するのではなく、DSL の対象となる分野(ドメイン)に精通したプログラマ以外の人々が使用することを想定しています。
DSL を使用することには、多くの利点があります。 DSL を使う最も明白な利点は、言語と変換エンジンがあれば、DSL が対象とする特定のソフトウェア開発の側面で面倒な手作業を行う必要がなくなり、作業がはるかに効率的になるということです。 (インタプリタを使用するのではなく)DSL プログラムからソースコードを生成している場合、ジェネレータはコンパイラと同じように抽象概念を除去して効率的なコードを生成できるため、実行時のオーバーヘッドが全くなく、ドメイン固有の優れた抽象概念を使用することができます。
ドメインと密接に連携した言語でドメインの課題を表現する方法があれば、作成するコードが実装の細部によって乱されることがないため、考えがより明確になります。つまり、DSL を使用すると、本質的な複雑さと偶発的な複雑さを分離することができます。
DSLは、そのドメイン、抽象概念、表記がドメインの専門家(すなわち非プログラマ)が自分自身で表現する方法に則しているため、技術者とドメイン専門家を結びつける非常に良い手段となります。
DSL と実行エンジンを使用すると、DSL コードで表現されるアプリケーションロジックをターゲットプラットフォームから独立させることができます。 DSL を使用すると、作成される製品の品質が向上し、バグの削減、アーキテクチャーの適合性の向上、保守性の向上などを実現できます。 これは、(不必要な)自由度を排除し、コードの重複を回避し、繰り返し作業を自動化した結果です。
通常のコードと DSL コードを統合する方法は、基本的に二つあります。 一つは DSL コードと通常のコードを別々のファイルに保存する方法です。 その後、DSL コードを自動コード生成機能によってプログラミング言語のコードに変換するか、もしくは、プログラムでドメイン固有言語のコードを読み込んで実行します。 この一つ目のアプローチは汎用言語(GPL)と DSL コードを分離するため、外部 DSL と呼ばれています。 SQLは外部DSLの一例とみなすことができます。
二つめのアプローチは、DSL コードと汎用コードを同じプログラムファイルに混在させることで、両者をより緊密に統合するというものです。DSL は GPL の文法とパーサーを再利用し、ホスト言語の利用可能な拡張オプションを利用します。このようなシナリオは、内部 DSL と呼ばれます。
GPLの中には、他の言語のものよりも拡張に適しているものがある、という点は言及に値するでしょう。
どちらのアプローチもそれぞれに意味があるため、MPSは両方をサポートしています。
DSL の構造と構文は、DSL コードを埋め込む先の言語でコードを書くことで定義されていました。 一般的に IDE は DSL を認識していなかったため、これまではサポート(コード補完、カスタムエラーチェックなど)を提供していませんでした。 しかし、MPS では MPS フレームワークと言語開発用の特殊な DSL を使用し、言語拡張を定義できます。 IDE はそれらを認識し、ドメイン固有言語の埋め込みを完全にサポートします。
「言語指向プログラミング」という言葉は、JetBrains の創設者であり初代 CEO を務め、MPS の「父」と呼ばれる Sergey Dmitriev によって、同氏が 2004 年に執筆した「Language-Oriented Programming: The Next Programming Paradigm」という記事の中で初めて使用されました。関連するアプローチは他の人によっても考えられていましたが、通常は他の呼び名が使用されていました。主な例としては、Charles Simonyi とそのインテンショナルプログラミングのアプローチが挙げられます。このアプローチは Martin Fowler によって、同氏が 2005 年に執筆した「Language Workbenches: The Killer-App for Domain Specific Languages?」という記事の中で説明されました。
基本的な考え方は、ソフトウェアを開発するときに1つの言語だけを使うのではなく、それぞれの作業に最も適した言語を使うというものです。 多言語プログラミングは表面的には同様のアプローチですが、言語指向プログラミングでは開発者が独自の DSL を構築したり、ドメイン固有の概念を使用して既存の言語を拡張したりするアプローチを推奨しています。 このアプローチを実現するため、MPS のような言語ワークベンチは言語指向アプローチの重要な要素となっています。
MPS を使用すると、新しい言語用のカスタムエディタを定義し、DSL を簡単に使用することができます。 従来のプログラミングに慣れていないドメイン専門家でも、独自のドメイン固有の用語を使用して設計されたドメイン固有言語を使用して、MPS で簡単に作業できます。
次のビデオでは、MPS を使って対話型音声応答(IVR)がどのように作成されたかを見ることができます。この DSL は、技術者以外のユーザーに合わせて操作性を調整しています。