Semantic Model †
How it works †
- セマンティックモデルとはDSLによって記述されるオブジェクトモデルの表象である。
- これは実は、DSLによって具現化されるドメインモデルであるということができる。
- シンタックスツリーはDSLの構造に対応するものだが、セマンティックモデルはDSLによって実現されるものである。
- 汎用プログラミング言語においてはセマンティックモデルは用いられないが、これはDSLとGPLの違いであると言える。
- セマンティックモデルはDSLに先行することもあれば、同時に構築されることもある。
- セマンティックモデルには2つのインターフェイスがある。
- 操作インターフェイス―モデルを操作するもの
- 具現化インターフェイス―モデル内のインスタンスを生成するもの
- 操作インターフェイスはセマンティックモデルが常にあると想定した上で、モデルを操作するのに利用するもの。
- 具現化インターフェイスはパーサとテストコードだけが使うべきもの。
When to use it †
- セマンティックモデルは常に使え。
- これにより、セマンティクスのテストとDSLのパースを分けて考えることができる。さらに、パーサが複数ある場合も有効。
- セマンティックモデルによって、パース時においても、実行時においても柔軟性が増す。
- セマンティックモデルを直接実行する。
- セマンティックモデルからコードを生成する。
- コードジェネレータが複数あっても大丈夫。
- セマンティックモデルで最も重要なのは、セマンティクスとパースを分けて考えられること。
- 例外の1つは抽象シンタックスツリー自体が有効なモデルとなっている場合。
- さらに、抽象シンタックスツリーから直接コードが生成される場合。
- とにかく俺はセマンティックモデルを使うんだ!
- でもセマンティックモデルとDSLは直接関係ないんだけどね。だいたい、関数プログラミングのことは良く知らないし。
Example: The Introductory Example (Java) †
- 一番最初にとりあげたステートマシーンが実はセマンティックモデルだった、というお話。
担当者のつぶやき †
- DDDの後にはなかなかに楽しく読める箇所だったと思いますが、"using a Semantic Model isn't part of the DSL culture in the functional programming world"って、こら!
- DDDでは「モデル」ということが強調されますが、実はシーケンシャルに記述する上での具体的な方策は語られなかったように思います。DSLは「モデル vs スクリプト」みたいな構図をイメージしつつ、読み進めていけたらいいのかな、と。
みんなの突っ込み †