DSLの境界線
http://www.martinfowler.com/bliki/DslBoundary.html
ドメイン特化言語が表れたときに疑問として挙がったのが、 「DSLは何なのか」そして「DSLは何でないか」だった。 混乱の元はDSLに厳密な定義が存在しないためであり、 DSLとその他とを区別するグレーゾーンが広大だったためである。
私にとっては、「スコープ」と「能力」が限定されている点がDSLの重要な要素である(特定のドメイン向けであり、汎用言語にとって基本的な機能が欠けている)。 つまり、良いDSLというのは、小さくてシンプルなものなのだ。 だからこそ「リトル言語」や「ミニ言語」と表現されるのである。
内部DSLではAPIとDSLの境界があいまいである。 基本的に両者に違いはない。 内部DSLとは、単なるイイ感じの名前のついたAPIなのだ(「ライブラリ設計は言語設計(library design is language design)」というベル研究所の古い諺があるように)。 だが、違いはないとはいったものの、DSLっぽく書かれたAPIを使うときはなんとなく「感覚」が異なるように感じられる。 流れるようなインターフェイスのようなものはAPIを使用することを質的に変えてしまうのだ。 DSLを使って考えると読みやすさを違った方法で考えるようになる。 ホスト言語のシンタックスを利用して、それ自身に依存した何かを作るようになる——rakeが良い例だ。
外部DSLでよく問題となるのが、DSLと汎用言語(GPL: General Purpose Language)の違いは何なのかという点である。明らかな違いは、DSLはチューリング完全ではない、あるいは、抽象化機構が欠けているところだろう。 正規表現は能力が限られているという意味で良い例だ。 SQLは興味深い。複雑かつ能力のある言語だが、やはりチューリング完全ではないし、新しく抽象化することができない。
では、チューリング完全かつDSLな言語というのはあり得るのだろうか? Ploticusのスクリプト言語はチューリング完全である。そして、Ploticusでグラフを作成するというところに焦点をしぼっていることから、DSLだともいえる——少なくとも私にとってはDSLだ。 XSLTはどうだろうか?XML文書を変換することに焦点をしぼっているが、汎用言語ではないかと思われるほど非常に多くの能力を備えている。
Ploticusの例では、組み込み言語はDSLなのかという疑問がわく。 Excelのマクロ言語がVisual Basicとほぼ同じものだとすると、DSLと呼べるだろうか? 汎用スクリプト言語をアプリケーションに組み込んだらそれはDSLだろうか?
内部DSLとAPIの問題と同様に、ここではその目的が鍵となる。 言語作成者と言語ユーザーの目的だ。 XSLTをXML文書の変換にのみ使用すると、XSLTをDSLとして使っているということになる——出力文書に値を入れるために、ちょっとアレな使い方をしてるとしてもだ。 しかし、エイト・クイーン問題を解くのにXSLTを使用すると、今度はXSLTを汎用言語として使っているということになる。 XSLTの設計者がXML文書を変換するものとして考えていれば、たとえユーザーが別の使い方をしていたとしても、XSLTはDSLだと考えられているのだ。
このようなDSLが何なのかという話は居酒屋で話す分には面白いが、 DSLを使用するという考えを悪く言うものであってはならない。 DSLは、単一の問題に密接にフォーカスした限定された言語として設計される。 DSLの設計をしたり使用したりすることがあれば、限定されたものだということを念頭に置いておくと、DSLは有用になるだろう。 結局、実用性こそが最重要なのだ。