豊富な情報を基にした pointcut を記述できるアスペクト指向言語

22
Feb. 6, 2004 2003年年 年年年年年年年 1 年年年年年年年年年年 pointcut 年年 年年年年年年年年年年年年年 年年年年年年年年年 年年年年年年年年 年年 年年年年年年 年年年年年 02M37220 年年 年年

Upload: brencis-casimir

Post on 03-Jan-2016

55 views

Category:

Documents


2 download

DESCRIPTION

豊富な情報を基にした pointcut を記述できるアスペクト指向言語. 東京工業大学大学院 情報理工学研究科 数理・計算科学専攻 千葉研究室 02M37220  中川 清志. アスペクト指向 (AOP). オブジェクト指向の限界 ある種の処理は複数クラスに散らばる ロギング,同期,永続性などの処理 アスペクト指向の利点 そのような処理をアスペクトとしてモジュール化 クラスとアスペクトは分離して記述 オブジェクト指向を補完. AOP の目標:図形エディタの例. Screen. 目標: 「 図形の外観変化を起こすメソッド 」 の後に Screen を更新したい - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 豊富な情報を基にした  pointcut を記述できるアスペクト指向言語

Feb. 6, 2004 2003 年度 修士論文発表会 1

豊富な情報を基にした pointcut を記述できるアスペクト指向言語

東京工業大学大学院 情報理工学研究科 数理・計算科学専攻 千葉研究室

02M37220  中川 清志

Page 2: 豊富な情報を基にした  pointcut を記述できるアスペクト指向言語

Feb. 6, 2004 2003 年度 修士論文発表会 2

アスペクト指向 (AOP)

オブジェクト指向の限界 ある種の処理は複数クラスに散らばる ロギング,同期,永続性などの処理

アスペクト指向の利点 そのような処理をアスペクトとしてモジュール化 クラスとアスペクトは分離して記述 オブジェクト指向を補完

Page 3: 豊富な情報を基にした  pointcut を記述できるアスペクト指向言語

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

Page 4: 豊富な情報を基にした  pointcut を記述できるアスペクト指向言語

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();

Page 5: 豊富な情報を基にした  pointcut を記述できるアスペクト指向言語

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();

Page 6: 豊富な情報を基にした  pointcut を記述できるアスペクト指向言語

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();

「どこに合成したいか?」をどのように指示するかが問題!!

「どこに合成したいか?」をどのように指示するかが問題!!

Page 7: 豊富な情報を基にした  pointcut を記述できるアスペクト指向言語

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

Page 8: 豊富な情報を基にした  pointcut を記述できるアスペクト指向言語

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” クラス内の全てのメソッド

つまりは赤い枠内のメソッド

Page 9: 豊富な情報を基にした  pointcut を記述できるアスペクト指向言語

Feb. 6, 2004 2003 年度 修士論文発表会 9

pointcut の記述力が高いAOP 言語 Josh きめ細かい「どこに合成するか (pointcut) 」

の指示が可能 pointcut 記述言語の拡張

Java で拡張 リフレクションの使用

Javassist[Chiba00] を使用

汎用的な「何を合成するか」の記述 合成箇所の情報を利用したインタータイプ宣言本発表は、前者の「 pointcut 」についてのみ説

明する

Page 10: 豊富な情報を基にした  pointcut を記述できるアスペクト指向言語

Feb. 6, 2004 2003 年度 修士論文発表会 10

プログラム

pointcut のメカニズム

アスペクトの合成場所の指定 言い換え:

joinpoint ( 実行点 ) の選別作業 条件と対象 joinpoint のペア

例: 「 setX という名前の」

メソッド呼び出し 「 Line クラスの」フィールド参照 対象 joinpoint

条件:名前が setX

joinpoint メソッド呼び出し フィールド参照 インスタンス生成 etc.

pointcut

この箇所にアスペクト合成決定!!

Page 11: 豊富な情報を基にした  pointcut を記述できるアスペクト指向言語

Feb. 6, 2004 2003 年度 修士論文発表会 11

pointcut の記述方法

pointcut 指定子を使い記述 指定子は、対象 joinpoint と選別方針を持つ

例: call (“void * .setX(..)”) 「 void 型の“ setX” で引数とクラス名は任意」とい

うメソッド呼び出しを指定 call は pointcut 指定子で、メソッド呼び出しが対象 カッコ内は条件

Page 12: 豊富な情報を基にした  pointcut を記述できるアスペクト指向言語

Feb. 6, 2004 2003 年度 修士論文発表会 12

Josh が提供する強力な pointcut の原理 pointcut 指定子をユーザが新たに Java で定義

可能 joinpoint の選別方針を Java で定義

従来は言語組み込みの指定子のみ使用可

joinpoint を Java のオブジェクトで表現して公開 その joinpoint の情報を得るメソッドを提供

リフレクションを使い豊富な情報を入手

Page 13: 豊富な情報を基にした  pointcut を記述できるアスペクト指向言語

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 に  関連する情報を持つ

アドバイスボディとは指定された箇所で実行されるコード断片

Page 14: 豊富な情報を基にした  pointcut を記述できるアスペクト指向言語

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” というものを選別する

Page 15: 豊富な情報を基にした  pointcut を記述できるアスペクト指向言語

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” というものを選別する

Page 16: 豊富な情報を基にした  pointcut を記述できるアスペクト指向言語

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”)

Page 17: 豊富な情報を基にした  pointcut を記述できるアスペクト指向言語

Feb. 6, 2004 2003 年度 修士論文発表会 17

Josh 処理系の全体図

コード変換器

.josh独自言語で書いたアスペクト

.classpointcut 指定子の定義pointcut の使用 & アドバイス

.classアスペクト埋め込みのターゲット

.classアスペクトとクラスの両方の機能

weaverweaver

Page 18: 豊富な情報を基にした  pointcut を記述できるアスペクト指向言語

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

Page 19: 豊富な情報を基にした  pointcut を記述できるアスペクト指向言語

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

Page 20: 豊富な情報を基にした  pointcut を記述できるアスペクト指向言語

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 時間

実行時間

[ 秒 ]

Page 21: 豊富な情報を基にした  pointcut を記述できるアスペクト指向言語

Feb. 6, 2004 2003 年度 修士論文発表会 21

関連研究

アスペクト指向言語 AspectJ Hyper/J Composition Filters

pointcut の拡張 pointcut を論理型言語で記述

Brichau 等 [GPCE2002] Gybels 等 [AOSD2003]

Page 22: 豊富な情報を基にした  pointcut を記述できるアスペクト指向言語

Feb. 6, 2004 2003 年度 修士論文発表会 22

まとめ

アスペクト指向言語 Josh を提案 [AOSD2004] pointcut に関して高い記述力を持つ

pointcut 指定子を新たに Java で定義できる 複雑な pointcut が可能

汎用的な指定子は組み込みで与える 複雑なものだけを自分で定義すればよい

Josh の性能を AspectJ と比較 コンパイル時間は少ないが、

実行時のオーバヘッド有り