Interpreter パターン

Interpreter パターンは、コンピュータプログラミングにおけるデザインパターンの一つである。Interpreter パターンの基本的な考えは、定義された種類の問題を素早く解くために、Compositパターンを使って ドメイン固有言語を実装することである。特化言語は汎用の言語よりも数倍から数百倍高速に問題を解ける場合が多い。

## Interpreter パターンの使用例

[編集]

* データベースに特化した問い合わせ言語（SQLなど）
* 通信プロトコルを記述するために良く用いられる特化したコンピュータ言語
* 特化言語を導入した汎用のコンピュータ言語

## 例

[編集]

### Java

[編集]

以下の Java の例は、汎用のプログラミング言語がより特化した言語を解釈する例を、ここでは 逆ポーランド記法 を用いて示す。

入力:

'42 4 2 - +' equals 44

パーサー:

import java.util.*;

interface Expression {
public void interpret(Stack<Integer> s);

class TerminalExpression_Number implements Expression {
private int number;
public TerminalExpression_Number(int number)       { this.number = number; }
public void interpret(Stack<Integer> s)  { s.push(number); }

class TerminalExpression_Plus implements Expression {
public void interpret(Stack<Integer> s)  { s.push( s.pop() + s.pop() ); }

class TerminalExpression_Minus implements Expression {
public void interpret(Stack<Integer> s)  { s.push( - s.pop() + s.pop() ); }

class Parser {
private ArrayList<Expression> parseTree = new ArrayList<Expression>(); // only one NonTerminal Expression here

public Parser(String s) {
for (String token : s.split(" ")) {
if      (token.equals("+")) parseTree.add( new TerminalExpression_Plus() );
else if (token.equals("-")) parseTree.add( new TerminalExpression_Minus() );
// ...
else                        parseTree.add( new TerminalExpression_Number(Integer.valueOf(token)) );

public int evaluate() {
Stack<Integer> context = new Stack<Integer>();
for (Expression e : parseTree) e.interpret(context);
return context.pop();

class InterpreterExample {
public static void main(String[] args) {
// ここで上述の式を評価している
String expression = "42 4 2 - +";
Parser p = new Parser(expression);
System.out.println("'" + expression +"' equals " + p.evaluate());

## 関連項目

[編集]

* バッカス・ナウア記法
* ドメイン固有言語
* Design Patterns p. 243

* 表
* 話
* 編
* 歴

デザインパターン

GoFによる23種のパターン|

| 生成に関するパターン|

* Abstract factory
* Builder
* Factory method
* Prototype
* Singleton

|

構造に関するパターン|

* Adapter
* Bridge
* Composite
* Decorator
* Facade
* Flyweight
* Proxy

振る舞いに関するパターン|

* Chain of responsibility
* Command
* Interpreter
* Iterator
* Mediator
* Memento
* Observer
* State
* Strategy
* Template method
* Visitor

並行性に関するパターン|

* Active object（英語版）
* Balking（英語版）
* Double-checked locking（英語版）
* Event-based asynchronous（英語版）
* Guarded suspension（英語版）
* Join（英語版）
* ロック
* モニタ
* Proactor（英語版）
* Reactor
* Readers–writer lock（英語版）
* Scheduler（英語版）
* Thread pool（英語版）
* スレッド局所記憶

アーキテクチャに関するパターン|

* Front Controller（英語版）
* Interceptor（英語版）
* MVC
* MVVM
* 多層アーキテクチャ
* Specification（英語版）
* 出版-購読型モデル
* Naked objects（英語版）
* Service Locator（英語版）
* Active Record
* Identity map（英語版）
* Data Access Object
* Data Transfer Object

その他のパターン|

* 依存性の注入 (DI)
* 遅延読み込み
* モックオブジェクト
* Null object（英語版）
* Object pool（英語版）
* Servant（英語版）
* Type tunnel（英語版）

関連する人々|

* ギャング・オブ・フォー
* エーリヒ・ガンマ
* リチャード・ヘルム
* ラルフ・ジョンソン
* ジョン・ブリシディース
* クリストファー・アレグザンダー
* グラディ・ブーチ
* ケント・ベック
* ウォード・カニンガム
* マーティン・ファウラー
* ロバート・セシル・マーティン（英語版）
* ジム・コプリエン（英語版）
* ダグラス・C. シュミット（英語版）
* リンダ・ライジング（英語版）

関連項目|

* アナリシスパターン
* アンチパターン

* 一覧
* カテゴリ
* コモンズ

この項目は、コンピュータに関連した書きかけの項目です。この項目を加筆・訂正などしてくださる協力者を求めています（PJ:コンピュータ/P:コンピュータ）。

|

* 表示
* 編集