DSL / Code Generation


Code Generation

要約

  • セマンティックモデルを実行するほうが簡単ではあるが、そうもできないことも多々ある。
    • いろいろな環境で実行する必要があるのに、セマンティックモデルやパーサを構築できない環境があることも。
  • ⇒そんなときこそコード生成。
  • DSLで指定される振る舞いを得られ、またほぼすべての環境でそれを実行できる。


  • コード生成を使うとき、「DSLプロセッサ」と「対象となる環境」の二つの異なる環境が存在する。
    • DSLプロセッサ」はパーサ、セマンティックモデル、コード生成プログラムのある環境。
      • これらを開発するのに最適な環境を要する。
    • 「対象となる環境」は生成したコードとその周りにあるもの。
  • コード生成使用時のポイントは、「DSLプロセッサ」から「対象となる環境」を分離することである。
    • 「対象となる環境」で「DSLプロセッサ」を適切に構築できないので。


  • 「対象となる環境」はいろいろな形で現れる。
    • DSLプロセッサ」を実行するリソースのない組み込みシステム。
    • DSLの処理に適さない言語を必要とする環境。
    • 対象となる環境がDSL自身であることも。(意味不明)
  • DSLの表現力が限定的であるため、より複雑なシステムに要する抽象的な機構を提供できない。
    • 実現したとしても複雑になってしまい、結局汎用言語になってしまうことも。
  • そこで、異なる環境で抽象化を行い、対象となるDSLでコードを生成する方がよいこともある。
    • よい例がDSLで問い合わせ条件を指定してSQLを生成すること。
    • クエリがデータベースで効率的に実行されるようにするだろうが、SQLはクエリを表すのに適切なものではない。(意味不明)


  • 「対象となる環境」の制約がコード生成の唯一の理由ではない。
  • 「対象となる環境」に精通していないことも理由となり得る。
    • なじみのある言語でふるまいを指定し、なじみのない言語を生成する方が簡単なことも。
  • 静的な検査を強制するのにコード生成を行う方がよりよい場合もある。
  • DSLでいくつかのシステムのインタフェースを特徴づけるだろうが、残りのシステムはC#を使用してインタフェースとやりとりしたいと言う場合もある。(意味不明)
    • コンパイル時のチェックとIDEのサポートを得られるように、C#のAPIを生成することに。
    • インタフェースの定義が変わると、C#のコードを再生成することで、修正すべき個所がコンパイラの警告として出てくる。

ファウラーへのフィードバック

担当者のつぶやき

みんなの突っ込み