Fowler DSLのエッセンス

とあることからFowler DSLのエッセンスを考える機会があり、昔内輪向けに作った資料を引っ張りだして眺めてみたが、わりと良い線いってると思う。

FowlerのDSL本が提示する価値は、おおまかに以下の3点にある。上記のスライドでは1と2にフォーカスしている。
  1. モデルを中心に据えた思想の提示
  2. 実装スタイルの分類
  3. 実装テクニック集
これは、紙幅の大半が3に割かれており、書いた時点では実装テクニックを全て把握していなかったことや、そもそも3はまとめがほぼ不可能、ということもあった。

モデルを中心に据えた思想の提示
従来のDSLでは、スクリプトによるモデルの組み立て、という考えが必ずしも明示的に意識されておらず、DSLがもたらす価値の源泉はDSL自身にある、と考える傾向が強かった。
FowlerのDSL本では、DSLによってモデルを組み立てるという点が非常に重視されている。DSLでモデルを構築する場合、今まではDSLによってもたらされている、と思われていた価値の多くは、実際はDSLによってではなくモデルによってもたらされている、ということがわかってくる。
DSLの価値は、モデルによってもたらされる価値を高めることにある。

実装スタイルの分類
これは、最近DSLについて書かれた文章ではほぼ常に述べられている内容で、実装スタイルを以下の2つに分類する、というもの。
  • 内部DSL
  • 外部DSL
スライドだと言語ワークベンチを第3の実装スタイルにしていたが、言語ワークベンチは外部DSLの実装をサポートするためのツールという位置づけかと思う。

実装テクニック集
内部DSL向け、外部DSL向け、共通トピック数多くのパターンが記述されており、DSL実装のためのパタンランゲージが構成されている。少なくとも、普段の仕事でこれらの語彙が使えるようになると非常に助かる。



本の大半を読み終えてみて、1, 2について付け足したいことがあるとすれば、以下の概念同士の関係の補足だろうか。
  • 意味論モデル
  • (ドメインモデルを含む従来の)モデル
  • アクティブモデル
  • 代替計算モデル

意味論モデル
意味論モデルは、一般のモデルをDSLの観点から構築対象として見た時の名称/概念。
  • 意味論モデルは、従来のモデルである。
  • 意味論モデルは、アクティブモデルである場合がある。
  • 意味論モデルは、代替計算モデルを表す場合がある。この場合、意味論モデルはアクティブモデルである。

従来のモデル
最も一般的/汎用的なモデル概念。
  • 従来のモデルは、意味論モデルである場合がある。
  • 従来のモデルは、アクティブモデルである場合がある。
  • 従来のモデルは、代替計算モデルを表す場合がある。

アクティブモデル
アクティブモデルは、従来のモデルであるが、インスタンス間の関係が変わるとモデル全体の振る舞いがきわめて大きく変更されるモデルのこと。この性質によって、個々のモデル要素の変更なしに、モデル構成を変更するだけで様々な計算を行うことができる。
語源はOOの「アクティブオブジェクトモデル」だが、オブジェクトパラダイムである必要はないため、アクティブモデルとした。
  • アクティブモデルは、従来のモデルである。
  • アクティブモデルは、意味論モデルである場合がある。
  • アクティブモデルは、代替計算モデルを表す場合がある。

代替計算モデル
命令型計算モデル以外の計算モデル。計算モデルとは、ざっくり言えば計算を表す方法を指す。
命令型計算モデルは、個々の計算ステップを逐次/選択/繰り返しといった制御フローを使って並べることで計算を表すモデル。これ以外の計算モデルとして、「デシジョンテーブル」「ステートマシン」「プロダクションルールシステム」などがあげられている。
  • 代替計算モデルは、アクティブモデルで表現される場合がある。
20110414追記:ドラフト版では「アクティブモデル」と「アダプティブモデル」の間で揺れていた用語は、出版版では「アダプティブモデル」に統一されています。

コメント