豊富な情報を基にした pointcut を記述できるアスペクト指向言語
DESCRIPTION
豊富な情報を基にした pointcut を記述できるアスペクト指向言語. 東京工業大学大学院 情報理工学研究科 数理・計算科学専攻 千葉研究室 02M37220 中川 清志. アスペクト指向 (AOP). オブジェクト指向の限界 ある種の処理は複数クラスに散らばる ロギング,同期,永続性などの処理 アスペクト指向の利点 そのような処理をアスペクトとしてモジュール化 クラスとアスペクトは分離して記述 オブジェクト指向を補完. AOP の目標:図形エディタの例. Screen. 目標: 「 図形の外観変化を起こすメソッド 」 の後に Screen を更新したい - PowerPoint PPT PresentationTRANSCRIPT
Feb. 6, 2004 2003 年度 修士論文発表会 1
豊富な情報を基にした pointcut を記述できるアスペクト指向言語
東京工業大学大学院 情報理工学研究科 数理・計算科学専攻 千葉研究室
02M37220 中川 清志
Feb. 6, 2004 2003 年度 修士論文発表会 2
アスペクト指向 (AOP)
オブジェクト指向の限界 ある種の処理は複数クラスに散らばる ロギング,同期,永続性などの処理
アスペクト指向の利点 そのような処理をアスペクトとしてモジュール化 クラスとアスペクトは分離して記述 オブジェクト指向を補完
Feb. 6, 2004 2003 年度 修士論文発表会 3
AOP の目標:図形エディタの例
目標:「図形の外観変化を起こすメソッド」の後に Screen を更新したい 図形クラスから Screen 更新命令
最終的には図形クラス内の draw() メソッドが呼ばれる Point
getX()getY()setX(int)setY(int)move(int,int)draw()
Line
getP1()getP2()setP1(Point)setP2(Point)move(int,int)draw()
FigureElement
draw()
int x, y Point p1, p2
これらのメソッドの最後にはScreen を更新するコードが必要
Screen
Feb. 6, 2004 2003 年度 修士論文発表会 4
AOP の目標:図形エディタの例「従来の方法では」 更新のための命令が
各クラス、メソッドに散らばってしまう 保守性・再利用性が悪い
Point
getX()getY()setX(int)setY(int)move(int,int)draw()
Line
getP1()getP2()setP1(Point)setP2(Point)move(int,int)draw()
FigureElement
draw()
int x, y Point p1, p2void setX(int newX) { x = newX;
}
void move(int dx, int dy) { x += dx; y += dy;
}
void setP1(Point newP) { p1 = newP;
}
void move(int dx, int dy) { p1.move(dx, dy); p2.move(dx, dy);
}
screen.update();
screen.update();
screen.update();
screen.update();
Feb. 6, 2004 2003 年度 修士論文発表会 5
AOP の目標:図形エディタの例「 AOP では」 更新のための命令
を分離して記述
処理系 weaver により合成
Point
getX()getY()setX(int)setY(int)move(int,int)draw()
Line
getP1()getP2()setP1(Point)setP2(Point)move(int,int)draw()
FigureElement
draw()
int x, y Point p1, p2
screen.update();アスペクト: これらのメソッドの 最後には screen.update() を 実行せよ
void setP1(Point newP) { p1 = newP;
}
void move(int dx, int dy) { p1.move(dx, dy); p2.move(dx, dy);
}
void setX(int newX) { x = newX;
}
void move(int dx, int dy) { x += dx; y += dy;
}
screen.update();
screen.update();
screen.update();
screen.update();
Feb. 6, 2004 2003 年度 修士論文発表会 6
AOP の目標:図形エディタの例「 AOP では」 更新のための命令
を分離して記述
処理系 weaver により合成
Point
getX()getY()setX(int)setY(int)move(int,int)draw()
Line
getP1()getP2()setP1(Point)setP2(Point)move(int,int)draw()
FigureElement
draw()
int x, y Point p1, p2
screen.update();アスペクト: これらのメソッドの 最後には screen.update() を 実行せよ
weaverweaver
void setP1(Point newP) { p1 = newP;
}
void move(int dx, int dy) { p1.move(dx, dy); p2.move(dx, dy);
}
void setX(int newX) { x = newX;
}
void move(int dx, int dy) { x += dx; y += dy;
}
screen.update();
screen.update();
screen.update();
screen.update();
「どこに合成したいか?」をどのように指示するかが問題!!
「どこに合成したいか?」をどのように指示するかが問題!!
Feb. 6, 2004 2003 年度 修士論文発表会 7
AspectJ* における合成箇所の指定方法の問題点 コードを挿入するメソッドを
全て書き並べる必要あり
しかし、保守性・再利用性が悪い 見落とす可能性がある
例えば Line.rotate(..) というメソッド メソッドの追加、
名前変更などに弱い
Point
getX()getY()setX(int)setY(int)move(int,int)draw()
Line
getP1()getP2()setP1(Point)setP2(Point)move(int,int)draw()
FigureElement
draw()
int x, y Point p1, p2
call(void Point.set * (int))|| call(void Point.move * (..))|| call(void Line.set * (Point))|| call(void Line.move * (..))
* Kiczales 等 ECOOP1997
Feb. 6, 2004 2003 年度 修士論文発表会 8
必要とされる合成箇所の指定方法 深い情報を基にして、コードを挿入
するメソッドを指定したい
メソッド名を書き並べなくてもよい
Point
getX()getY()setX(int)setY(int)move(int,int)draw()
Line
getP1()getP2()setP1(Point)setP2(Point)move(int,int)draw()
FigureElement
draw()
int x, y Point p1, p2
「“ draw” メソッドの中で読み込まれるフィールドのどれか」をそのボディ中で更新するような、“ Point” クラス内の全てのメソッド
つまりは赤い枠内のメソッド
Feb. 6, 2004 2003 年度 修士論文発表会 9
pointcut の記述力が高いAOP 言語 Josh きめ細かい「どこに合成するか (pointcut) 」
の指示が可能 pointcut 記述言語の拡張
Java で拡張 リフレクションの使用
Javassist[Chiba00] を使用
汎用的な「何を合成するか」の記述 合成箇所の情報を利用したインタータイプ宣言本発表は、前者の「 pointcut 」についてのみ説
明する
Feb. 6, 2004 2003 年度 修士論文発表会 10
プログラム
pointcut のメカニズム
アスペクトの合成場所の指定 言い換え:
joinpoint ( 実行点 ) の選別作業 条件と対象 joinpoint のペア
例: 「 setX という名前の」
メソッド呼び出し 「 Line クラスの」フィールド参照 対象 joinpoint
条件:名前が setX
joinpoint メソッド呼び出し フィールド参照 インスタンス生成 etc.
pointcut
この箇所にアスペクト合成決定!!
Feb. 6, 2004 2003 年度 修士論文発表会 11
pointcut の記述方法
pointcut 指定子を使い記述 指定子は、対象 joinpoint と選別方針を持つ
例: call (“void * .setX(..)”) 「 void 型の“ setX” で引数とクラス名は任意」とい
うメソッド呼び出しを指定 call は pointcut 指定子で、メソッド呼び出しが対象 カッコ内は条件
Feb. 6, 2004 2003 年度 修士論文発表会 12
Josh が提供する強力な pointcut の原理 pointcut 指定子をユーザが新たに Java で定義
可能 joinpoint の選別方針を Java で定義
従来は言語組み込みの指定子のみ使用可
joinpoint を Java のオブジェクトで表現して公開 その joinpoint の情報を得るメソッドを提供
リフレクションを使い豊富な情報を入手
Feb. 6, 2004 2003 年度 修士論文発表会 13
pointcut 指定子 boolean 型メソッド pointcut 指定子を boolean 型のメソッド呼び出しへ変換
新たに boolean メソッドを定義すれば指定子として使用可能
before : call (“void Point.setX()”) { /* アドバイスボディ */ }
if ( call( jp, “void Point.setX()”, jc)) { /* アドバイスボディ挿入 */ }
コード変換器
jp : Java で表現された joinpoint のオブジェクト
jc : joinpoint に 関連する情報を持つ
アドバイスボディとは指定された箇所で実行されるコード断片
Feb. 6, 2004 2003 年度 修士論文発表会 14
新たな pointcut 指定子の定義例(1/2)[ 引数の決まりごと ]例: simpleCall という
pointcut 指定子を定義 第一引数で対象とする
joinpoint を指定 ここではメソッド呼び出し
String の配列で、条件を受け取る args[0] = “setX”
JoshContext は有用な情報を保持
static boolean simpleCall (MethodCall m,String[] args, JoshContext jc) { String name1 = m.getMethodName(); String name2 = args[0]; return name1.equals(name2);}
使用例: simpleCall(“setX”)
内容:メソッド呼び出しの中で、メソッド名が“ setX” というものを選別する
Feb. 6, 2004 2003 年度 修士論文発表会 15
新たな pointcut 指定子の定義例(2/2)[ボディの記述 ] name1 :
このメソッド呼び出し joinpointにおいて、呼び出されたメソッド (callee) の名前 joinpointオブジェクト
から入手 name2 :
この例ではname2 = “setX”
name1 と name2 が一致したら真を返す
static boolean simpleCall (MethodCall m,String[] args, JoshContext jc) { String name1 = m.getMethodName(); String name2 = args[0]; return name1.equals(name2);}
使用例: simpleCall(“setX”)
内容:メソッド呼び出しの中で、メソッド名が“ setX” というものを選別する
Feb. 6, 2004 2003 年度 修士論文発表会 16
複雑な pointcut 指定子の定義例[図形エディタ問題の解決 ]
updater 指定子を定義
図形エディタの問題を解決 リフレクションの使用
より深い情報を得られる
static boolean updater(MethodCall mc, String[] args, JoshContext jc) { CtClass root = jc.getCtClass(args[0]); String mname = args[1]; Hashtable fields = enumerateFields(root, mname); CtMethod mth = mc.getMethod(); mth.instrument(new ExprEditor() { public void edit(FieldAccess expr) { String name = expr.getFieldName(); if (expr.isWriter() && fields.get(name) == expr.getCtClass()) return true; } return false;}
内容:「 draw メソッドで読み込まれるフィールドを更新する」メソッド呼び出しを選別する
使用例: updater(“Point”, “draw”)
Feb. 6, 2004 2003 年度 修士論文発表会 17
Josh 処理系の全体図
コード変換器
.josh独自言語で書いたアスペクト
.classpointcut 指定子の定義pointcut の使用 & アドバイス
.classアスペクト埋め込みのターゲット
.classアスペクトとクラスの両方の機能
weaverweaver
Feb. 6, 2004 2003 年度 修士論文発表会 18
比較実験
実験内容 Josh と AspectJ の 性能比較
weave時間 weave済みプログラムの実行時間
実験環境 SunBlade1000 UltraSPARC-III 750MHzX2, Memory 1GB Solaris8 Sun JDK 1.4.0_01, AspectJ 1.1b2
Feb. 6, 2004 2003 年度 修士論文発表会 19
実験 (1) weave 対象: XML解析器 Xerces アスペクト:全ての public メソッド呼び出しの
前にカウンタをいれる 結果
Josh の方が weave 時間は少ないが実行時オーバヘッドがある
コード長が大きくなっている アドバイスをインライン展開しているため
コンパイル +weave( 秒 )
実行 ( ミリ秒 )
コード長(KB)
オリジナル 36.2(javac のみ )
408 1928
Josh 77.7(69%) 1106(130%) 4269(153%)
AspectJ 112 881 2787
Feb. 6, 2004 2003 年度 修士論文発表会 20
実験 (2)
0
10
20
30
40
Euler Molecular Monte Carlo RayTracer Search
weave 対象: JavaGrande ベンチマークプログラム アスペクト:あるクラスのオブジェクトを対象とした
メソッド呼び出しの前にカウンタをいれる 結果
先ほどと同様に、 Josh は weave 時間が少ないが実行時オーバヘッドがある
AspectJ は最適化に力をいれているため
0
2
4
6
8
10
[ 秒 ] Josh AspectJ
JavaGrande ベンチマークの種類
weave 時間
実行時間
[ 秒 ]
Feb. 6, 2004 2003 年度 修士論文発表会 21
関連研究
アスペクト指向言語 AspectJ Hyper/J Composition Filters
pointcut の拡張 pointcut を論理型言語で記述
Brichau 等 [GPCE2002] Gybels 等 [AOSD2003]
Feb. 6, 2004 2003 年度 修士論文発表会 22
まとめ
アスペクト指向言語 Josh を提案 [AOSD2004] pointcut に関して高い記述力を持つ
pointcut 指定子を新たに Java で定義できる 複雑な pointcut が可能
汎用的な指定子は組み込みで与える 複雑なものだけを自分で定義すればよい
Josh の性能を AspectJ と比較 コンパイル時間は少ないが、
実行時のオーバヘッド有り