22
EPP: Extensive Java Preprocessor Survey: Yutaka Oiwa Jul 10, 2000

EPP: E xtensive Java P re p rocessor

  • Upload
    tacey

  • View
    28

  • Download
    1

Embed Size (px)

DESCRIPTION

EPP: E xtensive Java P re p rocessor. Survey: Yutaka Oiwa Jul 10, 2000. What’s EPP?. 一杉氏 @電総研 作の Java 用 Preprocessor 文法解析ルーチンの拡張が簡単に可能 Mix-in モデルに基づく拡張の組み合わせ 型情報に基づく書き換えのサポート URI : http://www.etl.go.jp/etl/divisions/~epp/. EPP の用途. Java 言語の拡張用 preprocessor Java のソースコードの解析ツール - PowerPoint PPT Presentation

Citation preview

Page 1: EPP:  E xtensive Java  P re p rocessor

EPP: Extensive Java Preprocessor

Survey: Yutaka OiwaJul 10, 2000

Page 2: EPP:  E xtensive Java  P re p rocessor

What’s EPP?

一杉氏 @ 電総研 作の Java 用 Preprocessor– 文法解析ルーチンの拡張が簡単に可能– Mix-in モデルに基づく拡張の組み合わせ– 型情報に基づく書き換えのサポート

URI : http://www.etl.go.jp/etl/divisions/~epp/

Page 3: EPP:  E xtensive Java  P re p rocessor

EPP の用途

Java 言語の拡張用 preprocessorJava のソースコードの解析ツールJava のソース→ソース変換ツール

... を作るためのツールキット

Page 4: EPP:  E xtensive Java  P re p rocessor

EPP でできる書き換え

Java(+α) → Java のソース→ソース変換ならほとんど全て– 例えば ...

• 簡単なもの : enum, symbol, typeof, #ifdef, etc...

• 中程度なもの : 連想配列 etc...• 大規模なもの :

– SystemMixin (EPP の mix-in 機構 )– Tiny DataPallel Java (SWoPP’97)

(in old EPP written on Lisp...)

– JavaGo みたいなものとか ...

Page 5: EPP:  E xtensive Java  P re p rocessor

EPP structure

4 段階の処理フェーズ– 構文解析– マクロ展開– 型チェック (optional)– コード出力

各段階を拡張可能– 通常は上 3 つを

plugin で拡張する

Lexical Parser

Macro Expander

Type Checker

Code Emitter

Input

OutputPlugin1Plugin2Plugin3

Page 6: EPP:  E xtensive Java  P re p rocessor

Parser phase

入力を構文解析して Abstract Syntax Tree を生成するフェーズ– Java 用の再帰下降パーサが組み込み– 各 entry ( 例えば primary expression)

をmix-in ( 後述 ) で拡張できる

Page 7: EPP:  E xtensive Java  P re p rocessor

Macro Expand Phase

Parser phase で生成された AST を再帰的に変換する phase– AST 中の各要素型に対して変換処理を記

述• デフォルトはなにもしない• ほぼありとあらゆる型に依らない書き換えが

書ける• 「現在のクラスに要素を追加」なども可能

Page 8: EPP:  E xtensive Java  P re p rocessor

Type Checking Phase

AST を再帰探索して静的な型付けを与える– ここでもローカルな式の書き換えは可能– 型情報を用いた書き換え規則を記述できる

Page 9: EPP:  E xtensive Java  P re p rocessor

Code Emit Phase

ここまでで得られた Java の AST を実際のプログラムソースに変換する– ここはあまり拡張しない ( らしい )

Page 10: EPP:  E xtensive Java  P re p rocessor

EPP のプログラミングスタイル

解析したい文法の拡張部分の parser を独自言語 Ld-2 で差分だけ記述– 構文木に新たな型のノードを追加– Mix-in Program Model でフックをかける

マクロ展開フェーズか型チェックフェーズで拡張された AST を通常の AST に変換– ノードの型でフックをかける

Page 11: EPP:  E xtensive Java  P re p rocessor

Mix-in Model とは ? (1)

1 つのクラスを分割して記述する機構– 例 : あるクラス Foo

class Foo { void m(String d) { if ( d.equals("B") ) doB(); else if ( d.equals("A") ) doA(); else { doDefault(); }}

に else if (d.equals(“C”)) { doC(); } を追加したい

Page 12: EPP:  E xtensive Java  P re p rocessor

Mix-in Model とは ? (2)

通常の型継承の場合class Bar extends Foo { void m (String d) { if d.equals(“C”) doC(); else super.m(d); }}

– しかし、型の名前は変わってしまう !• 他所からの参照があると困ってしまう

– Plugin 同士の衝突が起きやすい

Page 13: EPP:  E xtensive Java  P re p rocessor

Mix-in Model とは ? (3)

Mix-in Model での解決 :– この処理を 3 つの mix-in で記述

•SystemMixin Skeleton { class Foo { define void m(String d)

{ doDefault(); } } }

Page 14: EPP:  E xtensive Java  P re p rocessor

Mix-in Model とは ? (4)

•SystemMixin A { class Foo {

extend void m(String d){ if(d.equals(“A”)) doA(); else

original(); } } }•SystemMixin B { ....extend void m

(...) ........}

Page 15: EPP:  E xtensive Java  P re p rocessor

Mix-in Model とは ? (5)

Mix-in Model での解決 ( 続 )– 実行直前にこれらの Mix-in から

1 つのクラスを生成• 読み込まれた全ての Foo::m の定義を結合して

1 つのメソッドを構成• 外部参照・サブクラスへメソッドの変更の影響が

自動的に伝播する

• Ld-2 言語の key feature

Page 16: EPP:  E xtensive Java  P re p rocessor

Mix-in Model とは ? (6)

EPP では ...– parser の拡張に Mix-in を利用

• 例 : symbol plugin extend Tree primaryTop() { // Java 用の primaryTop

に if (lookahead() == :“:”) { // Hook をかける return symbol(); // ←“:foo” を解釈して (:symbol

foo) } else { // を返すメソッド ( 新設 ) return original(); } }

Page 17: EPP:  E xtensive Java  P re p rocessor

EPP plugin の例 (1)

enum plugin ( リスト enum/Plugin.java)– enum { RED, BLUE, ... } →

public static int RED = 0; public static INT BLUE = 1; ...

– parser: クラスメンバ宣言 (classBodyDeclaration) にフック、 enum { .... } を (:enum ..... ) という AST に

– expander: enum が出てきたらそのクラスの定義の先頭に public static int .... を追加( addTree(:beginningOfClassBody, ....) )

Page 18: EPP:  E xtensive Java  P re p rocessor

EPP plugin の例 (2)

typeof Plugin ( リスト typeof/Plugin.java)– (typeof(a)) b; → (int) b;

– type checker: ( ) 内に与えられた式を型付けし、

        その結果で全体を置き換え

Page 19: EPP:  E xtensive Java  P re p rocessor

EPP plugin の例 (3)

BackQuote plugin (BackQuote/PlugIn.java)– plugin 開発者用 plugin– `(S 式 ) という式を new Tree(...) とい

うEPP 内部の構文木データ構造に変換

Page 20: EPP:  E xtensive Java  P re p rocessor

EPP プログラムの開発

結局、 EPP を使うのに必要なのは ...– Java の知識 ( 当然 )– 再帰下降パーサの理解– 抽象構文木とは何ぞや ?

– 割とお気楽に preprocess できます

Page 21: EPP:  E xtensive Java  P re p rocessor

いまやってること ... (1)

とりあえず C̀ の Java 版みたいなもの書いてます– EPP で preprocess

• EPP マクロで cspec の構文木から直接Java バイトコード生成器を気合で生成 (第 1版 )

→ SPA ‘00 のポスターセッション• backend に javac を使う (第 2版 )

– EPP → javac → 自作フィルタ → javac (SIG のほうでもう少し詳細を話す /話した 予

定 )

Page 22: EPP:  E xtensive Java  P re p rocessor

いまやってること ...(2)

方向性としては ...– C̀ のような動的コード生成を Java のよう

な object-oriented, strongly static typed の世界の実用言語に持ち込む• 動的コードに対する typing

– メソッド引数とか、「文脈」を要求するコードの扱い• Object-oriented との関連

– class とかも動的に作りたい → typing は ? 実現は ?• もっと高級に書きたい

– 「 partial evaluation を explicit に書いた」くらいにはしたい

やること山積