Interpreterパターン

今回以下の技術書を読みました.

f:id:k12si:20200114202047p:plain

上記の【23章】Interpreterパターンについて解説します.

インタプリタパターンとは

ミニ言語の文法規則で記述された「ミニ・プログラム」をプログラミング言語で解析し,言語の文法をオブジェクトとして表現するパターン

ミニ言語とは

ドメイン固有言語のこと

ミニ言語プログラムとは

ミニ言語の文法定義で記述された「命令」

Interpreterパターンの例を具体的に1つ挙げると,

SQLの文法規則で記述されたクエリJavaで解析し,SELECT文などをオブジェクトとして表現するパターン」

となる.

疑問

なぜ,「特定の処理」をするために,わざわざ「ドメイン固有言語」で命令を発行する必要があるのでしょうか.
「1クッション新たな定義言語を挟まず,実行環境のプログラミング言語で直接命令を解釈すればいいのでは?」と思いました.
本書のSampleプログラムの実行結果は以下のようになっています. f:id:k12si:20200115001836p:plain

text = <ミニ・プログラム(命令)>
node = <解釈後の出力結果>

特に一番下の結果は,解釈後の出力結果にどんなメリットがあるのかわかりませんでした.

メリット

そもそもドメイン固有言語で記述すること自体に以下のメリットがあります.

  • ドメインに特化した言語実装により,高効率で問題解決が可能

さらに,1つのトークン(SQLでいうSELECT文といった単一の命令のこと)の処理を1つのクラスで定義するため

また,各種トークンの処理定義をクラスに落とし込み,命令(クエリ)を別ファイルに切り出すことで

  • 命令を設定ファイルや外部入力から得ることで動的な振る舞いを実現することが可能

また,トークンとは単なる字句です.(SELECTとは単なる文字)
しかし,このトークンがクラスで表現されることでオブジェクトとなります.
命令とは,トークンの羅列であり,すなわちオブジェクトの羅列へと落とし込むことができます.さらに,オブジェクトとはメンバ関数を保持し,メンバ関数は「振る舞い」を意味します.
つまり,「単なる字句の羅列(命令)」がInterpreterパターンを利用することで,オブジェクト指向をうまく利用した,「振る舞いの連鎖」へと解釈,実行することができます.

上記解釈は,以下のサイトを参考にさせていただきました. http://marupeke296.com/DP_Interpreter.html

活用事例

時間あるときに考える!!

まとめ

  • interpreterパターンとは何らかの文法規則で記述された命令を解析し,言語の文法をオブジェクトで表現するパターン

  • ドメインに特化した言語定義は高効率

  • トークンをクラスで表現することで柔軟性や再利用性が高まる