DSL / Output Production Strategy


DSL

Output Production Strategy

一言要約

  • セマンティックモデルを作るには、Embedded TranslationかTree Constructionを使うと良い。
  • 一長一短なので、少し試してみてから選ぶのが良い。

要約

  • ファウラーは、セマンティックモデルを構築することが必要だと主張している。
  • 一方、既存の言語コミュニティーでは、セマンティックモデルなしで、直接、出力コードを生成することを、内在的な仮説としている。
  • これは、汎用言語のための合理的アプローチだが、DSL向けに提案しているものではない。
  • セマンティックモデルを作るには、次の方法がある。
    • Embedded Translation
      • 1ステップで構築する方法
      • パーズ処理中に、同時に、セマンティックモデルを作る。
      • これは、通常、シンボルテーブルなど、中間解析データが必要になる。
    • Tree Construction
      • 2ステップで構築する方法
      • まず、入力テキストをそのままあらわした構文木を作る。
      • 次に、その構文木を歩き回って、セマンティックモデルを作る。
    • Embedded Interpretation
      • 解析プロセス中に実行もしてしまう方法。
      • たとえば、電卓などかそれにあたる。
      • つまり、セマンティックモデルは存在しない。
      • セマンティックモデルなしで、Embedded TranslationとTree Constructionを使える。
      • コード生成などではよく見かける。
      • 単純な場合は、使えるが、セマンティックモデルのほうが圧倒的に役に立つ。

Tree Construction について

  • 入力テキストをトークンに分解して、それをそのまま構文木として構築する。
  • 最も単純なものは、入力テキストをすべて含んだ構文木(パース木)。
  • テキスト構造をマークするもの(カッコとか、セミコロンとか)を排除して、抽象構文木(AST Abstract Syntax Tree)をつくる。
  • その利点は、ふたつの単純なステップに分解する。(複雑な1ステップより簡単)
  • 多くのパーサジェネレータは、ツリー構築を簡素化するのためのDSLを提供する。
  • SAX を用いた Embedded Translation、DOM を用いた Tree Construction

まとめ

  • お勧めは、Embedded TranslationかTree Construction。
  • どちらが良いかは、中間木のコストによる。
  • 複雑なものは Tree Construction のほうが良いことが多い。
  • 中間木のメモリコストはいまやとても安いにもかかわらず、必ずしも Tree Construction が良いとは限らない。
  • なぜなら、木構造を歩き回るコードを書くのは、問題になりやすいから。
  • 両方を少し試してみて、どちらが良いか考えてみて欲しい。

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

  • Typo : general putpose → general purpose
  • Typo : reccomend → recommend

担当者のつぶやき

  • 原文での produce, product, create は、たぶんニュアンスが違うのだけれども、訳すときは全部「生成する」にしてしまった。

みんなの突っ込み