language、DSL)とは、特定のタスク向けに設計されたコンピュータ言語[1]である。一種類のタスクをうまく実行することに集中したものであり、古くから存在した。大別されるが、そのいずれにしても近年の、自由度と機能が高いプログラミング言語により手軽に扱えるようになったことから広まっている。ドメイン固有モデリングの支持者によれば、ドメイン固有モデリングの発達と共にDSLという用語も広く知られるようになってきた、とされる。実際にはドメイン固有言語はモデリングとは特別な関係が何もあるわけでもなく(ドメイン固有モデリングのためのドメイン固有言語、といったものはあるが)、モデリング以外にもあらゆる分野のための言語がある。System(英語版)、音響や音楽の合成用のCsound、グラフ(ネットワーク)描画システムGraphvizのDOT言語、ファイルの最終変更時刻と依存関係記述にもとづいたタスクランナーであるmakeなどがある。ある特定の領域(ドメイン)の問題を解決するために作られ、それ以外の領域の問題を解くことは想定していない。そもそも、言語とは何かを記述するためのものであって、何かを記述することで問題が解決する場合もあれば、余計に解決しなくなる場合もある。汎用のプログラミング言語は一般に計算可能なものを計算するプログラムを、難しくなく書けることを意図して設計されている。ドメインはビジネス領域にも対応することがある。社内で利用する生命保険ポリシーDSLを開発している[要出典]。戦闘シミュレーションDSL[要出典]給与計算DSL[要出典]伝票DSL[要出典]APIを公開しているDSLは、他のプログラミング言語から呼び出してライブラリのように使うことができる。機能を拡張され続けた結果チューリング完全になってしまうDSLもある。計算理論的には汎用のプログラミング言語と同等になってしまったということであり基本的にはDSLとしての設計の失敗とみなされることもあるが、珍しいことではない[2]。そのようなDSLでもたいていは、設計目的外の用途のための記述は可読性が無く実用的ではない。視覚化された言語(ドメイン特化ダイアグラムとも言われる)の場合もあるし(GEMS(英語版))、プログラム的な抽象化の場合もあるし(EMF)、テキスト的な言語の場合もある。grepというコマンドラインで使われるユーティリティはテキストとのパターンマッチを行うための正規表現が可能である。sedユーティリティは同様に正規表現を使ってテキストとパターンマッチングさせて、文字列の置換も行う。Toolsと呼ばれる「道具」的なプログラム類において、ドメイン固有言語的なものがよく使われている、という話であって、DSLに重点がある話では本来はない)。成熟したプログラミング言語なら当然持っているべきファイルシステムへのアクセス機能やプロセス間制御といった機能が欠けていることが多い。多くのDSLはバイトコードや実行コードと言ったものにコンパイルされることはなく、他の様々な媒体向けのデータが生成されたり、システムに作用したりする(例えば、データベースにクエリを行う)。GraphvizはPostScript、GIF、JPEGなどを出力し、Csoundは音声ファイルを出力し、POVのようなレイトレーシング用言語はグラフィックスのファイルを出力する。SQLは関係モデルに基づいて設計されている関係データベースのへのクエリ(アクセス)言語である。別の多くのDSLは処理性能などのために、(場合によっては何らかのプログラミング言語への変換を経由して)バイトコードや実行コードと言ったものにコンパイルされ、そのコンパイルされたコードが他の様々な媒体向けのデータを生成したり、システムに作用したりする。各種DSLが使われる。なく汎用モデリング言語に分類されるのが一般的である。「汎用」というのは、モデリングの対象を選ばない、という意味であり、プログラミング言語のことを汎用というのは全く文脈が違うわけで、モデリング言語というDSLであるはずだが「DSLではなく『汎用モデリング言語』に分類されるのが一般的」なのだそうである。簡易言語はナイフのようなもので、様々な用途がある。DSLは電動ドリルのようなもので、穴を空けることにかけては強力なツールである。このメタファでは、それら工具に対し、汎用のプログラミング言語は工具の材料である工具鋼に相当する。道具というのは「一つの目的に特化する」のが基本であり、たとえばモンキーレンチや、さらには十徳ナイフのようなものは便利だが代用品である(プログラミング言語が十徳ナイフに相当するものではないのは言うまでもない)。利用するパターンには以下のような場合がある:[3][4]単独でDSLを利用する場合。(コマンドラインやMakefileから)ユーザー操作の直接的結果として呼び出される場合(Graphvizなど)。プログラミング言語のマクロシステムを利用して実装されたDSLは、コンパイル時か読み込み時に汎用プログラミング言語に展開/変換される。メタプログラミングにより、汎用プログラム言語としてそのまま実行可能なDSLを構築することもできる。ユーザーアプリケーションにDSLが組み込まれている場合、そのアプリケーションのユーザーが書いたDSLコードを実行するか、アプリケーション自体がDSLコードを動的に生成して実行する。包括的である必要はない。その領域(ドメイン)をより表現しやすくなければならない。冗長性を最小限にすべきである。具体的に言うなら、1つの事柄について変更したいだけなのに、記述の中の複数の箇所を一緒に必ず変更しなければならない、というような言語設計をしてはならない、ということである。当然ながらこれを怠った設計の場合、「一緒に変更するのを忘れた」というバグを作りこむ危険性のある言語、ということになる。Language(JCL)も一種のDSLである。シェルスクリプト[編集]Unix系システムのUnixシェルのコマンドやシェルスクリプトは、コマンドに与えるファイルや入出力のデータを様々な形で操作できる。プロセスの標準ストリームに対して、リダイレクトとパイプにより、順番に接続したり、ファイルを入出力先に指定したりすることができる。小さなタスクを行うプロセス群の実行と制御のための単純なインタフェースで構成される。それらのタスクは、テーブル、グラフ、チャートなど必要な形にデータを編成するイディオムを表している。各タスクは単純な制御フローと文字列操作機構から成り、ファイル内の文字列の検索や置換、文字列の出現回数のカウントといった多数の一般的作業をカバーしている。Language[編集]データ駆動型ウェブサイトのためのDSLの例として、ColdFusionのスクリプト言語がある。ウェブサイト構築のために、Java、.NET、C++、SMS、電子メール、メールサーバ、HTTP、FTP、ディレクトリサービス、ファイルシステムなどと共に使われている。ColdFusionのページでデータソースとのやりとりやデータ操作や表示出力に使用するタグ群が含まれている。CFMLのタグの構文はHTMLのそれによく似ている。当初、エリクソンがDSLとして社内で使用するために設計した。有限オートマトン、汎用サーバ、イベントマネージャなどを素早く構築でき、特定分野ではCやC++といった汎用プログラミング言語を凌駕する生産性を示す。現在では公式にオープンソースとなっている。FilterMeister[編集]FilterMeister[5]はCをベースとするプログラミング言語のプログラミング環境で、Photoshop用画像処理フィルタ・プラグインの作成に特化している。FileMeister自体がPhotoshopのプラグインとして動作してスクリプトをロード・実行することもでき、コンパイルして独立したプラグインを生成することもできる。FilterMeisterの言語はC言語とそのライブラリの大部分を再現しているが、それはPhotoshopのプラグインで必要な部分に限られており、その領域でのみ有用な機能も追加している。テンプレート[編集]MediaWikiのテンプレート機能は組み込み型DSLの一種であり、ページ内テンプレートの作成サポートとMediaWikiのページ間のトランスクルージョンを基本的目的としている。詳しくは、Help:テンプレートを参照。ソフトウェア工学での応用[編集]ドメイン固有言語は、生産性と品質を向上させるものとして、ソフトウェア工学の分野で注目されてきた。効率的ソフトウェア工学のためのツールの土台となる可能性を秘めている。そのようなツールは一部のシステムの開発で使われ始めている。Reduction)ツールキットはその一例である[6]。自動的に不変式(invariants)を構築する機構などが含まれる。比較的新しい分野として言語指向プログラミング(英語版)がある。中心にすえた方法論である。メタコンパイラ[編集]言語指向プログラミングを含めあらゆる形態のDSLを補完するものとして、メタコンパイラ(英語版)と呼ばれるコンパイラ記述ツールがある。メタコンパイラはDSLの構文解析器とコード生成器を生成するのに便利というだけでなく、それ自体がコンパイラ記述に特化したDSLでもある。一般的なパーサジェネレータにはないメタコンパイラ特有の特徴として、メタコンパイラは独自の言語で書かれており、メタコンパイラ自体を実行形式に変換することができる。自分自身を定義し変換できるという点で「メタ」なステップを構成しており、メタコンパイラと呼ばれる。DSLの構文解析だけでなく、メタコンパイラは様々なソフトウェア工学と分析のツールを生成するのにも有効である。ゲーム向け言語[編集]ゲームアプリケーション開発では一般的にPC向けやゲーム専用機向けを問わず独自の専用スクリプト言語を導入もしくは内製することが多い。ノベルゲームタイプの専用ゲームエンジンであるNScripterや吉里吉里2ではゲームシナリオ進行記述やフラグ管理に特化した言語を実装している。いう言語を公開している。それによって競合するQuakeに比べて素早い修正が可能となっている[要出典]。採用しており、修正にはC言語の習得が必要だが、UnrealScriptは簡便さと効率を重視して設計されている。ファイナルファンタジー・クリスタルクロニクル』などに代表されるように、汎用スクリプト言語であるLuaやSquirrelを採用する作品も増えてきている。(ゲームエンジン)では、スクリプトの記述にC#あるいはJavaScriptのサブセットを使用することができる。汎用スクリプト言語(動的言語)は多数存在するが、ゲームのスクリプト記述には、性能上の要件から軽量・省メモリかつ比較的高速に動作する言語が選ばれることが多い。ポリシー自動化のためのルールエンジン[編集]ポリシーや業務規約を自動化するための様々なビジネス・ルール・エンジン(英語版)が開発されてきた。Automation、DTRules、Droolsといった製品では、様々な分野をサポートするDSLを提供している。DTRulesでは、ルールセット内で複数のDSLを使用するためのインタフェースも定義している。ビジネス・ルール・エンジンは、人間が読める形でビジネスロジックを定義することを目的としている。それにより、その業務の専門家と開発者がビジネスロジックについての理解を共有できるようにしている。多くのルール・エンジンは、ビジネスロジックの制御構造を単純化する技法とDSLを使ったプログラミングを組み合わせて提供している。統計的モデリング言語[編集]統計的モデリング、特にベイズ確率を使った技法では、BugsやJagsといったDSLが作られてきた。これらのDSLはベイズ確率モデルを記述するためのもので、シミュレーションによってそのモデルを解く手段を生成する。利点と欠点[編集]DSLには次のような利点がある[3][4]。問題領域に適した抽象レベルと慣用句でソリューションを表現する。書かれたプログラムを理解でき、検証でき、修正でき、さらには開発できる。実際にそうなっている実例は少ない。[9]コード自体がドキュメントの役割を果たす。品質/生産性/信頼性/保守性/移植性/再利用性を高める。その領域のレベルで検証可能である。言語構成要素が安全である限り、それを使って書かれたプログラムは安全とみなせる。一方で、以下のような欠点もある。DSLを習得するのにコストがかかるのに対して、その応用範囲が相対的に狭い。DSL自体を設計/実装/保守するのにもコストがかかり、そのための開発環境が必要である。正しい適用範囲を探し、設定し、維持することが難しい。ドメイン固有な部分と汎用プログラミング言語の構文とのバランス調整が難しい。ハンドコーディングされたソフトウェアに比較して性能的に不利な可能性がある(実装しているアルゴリズムの効率の問題や、マルチコアCPU対応などのハードウェア活用度などに起因する)。似たようなDSLが増殖する(同業各社がそれぞれDSLを開発する場合など)[10]。技術系でない(DSLの対象領域の)専門家は、DSLで書かれたプログラムであっても自らコードを書いたり修正したりできないことがある[9]。ITシステムにDSLを組み込むことは、汎用言語に比べて困難である。1つのDSLに熟達した人材は相対的に少ないため、人件費が高くつく可能性がある。汎用プログラミング言語に比べてコード例を見つけにくい。「コンピュータ言語」という語は、プログラミング言語以外の言語も含む総称である。machine」がチューリング完全であることが証明されているように、チューリング完全に「なってしまう」のは、実は意外に簡単である。2013年4月25日閲覧。2009年9月8日閲覧。(日時は個人設定で未設定ならばUTC)。表示-継承ライセンスの下で利用可能です。追加の条件が適用される場合があります。詳細は利用規約を参照してください。Cookieに関する声明モバイルビュ。