ドメイン特化言語
http://martinfowler.com/bliki/DomainSpecificLanguage.html
ドメイン特化言語(DSL:Domain Specific Language)とは、 ある特定の種類の問題に特化したコンピュータ言語のことです。 様々な問題に対応できる汎用的な言語のことではありません。 ドメイン特化言語についてはこれまでも議論されてきましたし、 コンピュータが使われてきたのと同じくらい長い間使われてきました。
DSLを頻繁に使用しているコミュニティにUnixコミュニティがあります。 そこでは、DSLは「リトル言語」や「ミニ言語」などと呼ばれています (この伝統について、Eric Raymondが素晴らしい議論を提供してくれています)。 最も一般的なUnixスタイルのやり方は、 言語の文法を定義し、コード生成機能を使ってDSLから汎用的な言語を生成する、 あるいは、そのDSL用のインタプリタを書くことです。 こういったことを簡単にするツールがUnixにはたくさん揃っています。 こうしたDSLのことを私は「外部DSL」と呼んでいます。 XML設定ファイルも外部DSLのよく知られた形式の1つです。
LispやSmalltalkのコミュニティにも脈々と流れるDSLの伝統があります。 しかしこれは、Unixコミュニティのそれとは違ったやり方で行われています。 新しい言語を作るというよりも、汎用的な言語をDSLに変化させるのです (Paul GrahamがProgramming Bottom-Upの中でこのことについてうまく説明しています)。 この「内部DSL」では、プログラミング言語それ自体を元にしてDSLを定義します。 これはどの言語でもできる一般的なやり方です。 私も問題を解決するためのDSLを作るように 関数を定義するよう常に心がけてきました。 しかしながら、LisperやSmalltalkerたちは私よりもずっと深くこの方法に取り組んでいます。 このやり方で書かれたAPIは FluentInterface と呼ばれることもあります。
先ごろ書いた論文では、この2種類のDSLについて例を交えて紹介しています。 両者のメリット/デメリットや最近の言語ワークベンチツールの開発については、かなりページを割いています。 これによってDSLがより一般的なものになればと願っています。
DSLの扱いが難しい理由の1つに、何がDSLで、何がDSLでないのかが判断しにくいという点が挙げられます。 DSLの境界線はとても曖昧で、 内部DSLとAPIの違い、 あるいは、 外部DSLと汎用言語の違いは、 とても分かりにくいものとなっています。
私が興味を持ったDSL関連の話題については、 DslReadings にまとめていくことにします。
内部DSLと外部DSLのいずれかを選択する
内部DSLと外部DSLの流れは、PragDaveの言葉でうまく合流しました。 達人プログラマーたちはずっとDSLのファンだったのです。 DSLは元々、Unixの伝統から来たものでした(The Pragmatic Programmer(日本語『達人プログラマー』)のセクション12に素晴らしい議論が載っています——これは「達人の極意12」と呼んでもいいかもしれません)。 インタビューのなかでDaveはこう言っています。「コード生成はいつも使うけど、Rubyでプログラミングしているときはほとんど使わない」と。
私はいつもDSLを作成するのと似たようなことを、設計を肉付けする際に行っています——クラスやメソッドがDSLとなるように開発するのです。 できることなら、そのとき使っている言語でこれをやりたいのですが、 もしできないならできないで、コード生成を使うことになるでしょう。 ThoughtWorksでは、コード生成などの技術を大規模システムで広く使ってきました。 DSL用の言語を別の言語にするかどうかの決め手は、言語によってまったく違います。 Smalltalkでは分ける必要性を感じませんでしたが、 C++/Java/C#では分けるのが一般的です。
つまり、言語によって内部DSLに向いたものとそうじゃないものがあるようです。 LispやSmalltalkを見ていると、内部DSLに一番適した言語は伝統的な言語よりも深く、シンプルな基本的な考え(Lispなら関数適用、Smalltalkならオブジェクトやメッセージ)のあるミニマルな言語だったのではないでしょうか。 ただし、Rubyはこの2つの言語よりも決まりごとが多く、より大きな言語でありますが、内部DSLにも向いている(素晴らしい)言語です。
だから、たぶん、言語には選び抜かれた簡潔さが必要なのではないでしょうか。 一般的なものを書くのに簡単であり、複雑な絡み合いが入り込まないようなナイスなシンタックス。 まあ、どんなものであれ、この点が重要なのだと思います。 JavaやC#よりもSmalltalkやRubyのほうがなぜ楽しいかなんて、口では絶対表せないよなーといつも思います。 よく言われるのは、静的型言語と動的型言語の違いですけども、これはあるポイントを見逃しています。 「言語内DSLに合うか合わないか」ほうが、本質的な違いだと思います。
comment
*2004-02-16 (月) 22:04:57 ‘’[[kdmsnr]]’’ : Unixには新しい言語をいちから作る文化があり、LispやSmalltalkではたとえば「Lispで新しい言語」を作り出す文化がある。 *2004-02-17 (火) 13:42:40 ‘’[[kdmsnr]]’’ : specific を 「特化」とするか「依存」とするか。どっちがよいのでしょう。 *2004-02-17 (火) 16:20:18 ‘’[[kdmsnr]]’’ : http://d.hatena.ne.jp/tomokuroo/20040216#p3 *2004-02-18 (水) 02:18:20 ‘’[[mizu]]’’ : はじめまして。「関数アプリケーション」は、「関数適用」の方が良いのではないでしょうか。 *2004-02-18 (水) 02:37:07 ‘’[[小人]]’’ : 直してみました > mizu *2004-02-18 (水) 12:04:26 ‘’[[kdmsnr]]’’ : ありがとうございます>小人さん *2004-02-18 (水) 16:17:49 ‘’[[かくたに]]’’ : 「特化」派です。http://www.kakutani.com/compass/20040218.html#p01 *2004-02-18 (水) 19:31:15 ‘’[[kdmsnr]]’’ : 特化にしてみました。 *2004-03-26 (金) 18:04:04 ‘’[[takai]]’’ : http://www.csg.is.titech.ac.jp/~chiba/notes/oosympo02.pdf にドメイン専用言語(domain specific language)って訳あり。 *2004-03-26 (金) 18:21:45 ‘’[[kdmsnr]]’’ : お、いい勝負だ(Google)。 *2008-03-23 (日) 16:18:08 名無しさん : eena ruby