分散 Java プログラムのための アスペクト指向言語

分散 Java プログラムのための
アスペクト指向言語
西澤無我(東工大, CREST)
千葉滋(東工大, CREST)
SWoPP2003, Matsue
1
本研究は

分散プログラミング支援ツールの開発


分散プログラムのモジュール化を促進
モジュール化は、プログラムの可読性の向上


プログラムをメンテナンスし易くなる
DJcutter の提案

Java 用のアスペクト指向プログラミング言語
SWoPP2003, Matsue
2
既存の技術ではモジュール化が
できない処理

横断的関心事


オブジェクト指向技術では
異なるモジュール間にまたがってしまう処理
横断的関心事が存在する
分散プログラムの例

分散化した observer パターン
Subject と observer が異なるクラス・ホストに存在
SWoPP2003, Matsue
3
分散化した observer パターン
① 
グループ図形エディタの説明
利用者がスクリーン上の
図形の位置を変更する
②
その図形の位置の変更にとも
ないそれぞれのホストのスクリ
ーンも更新される
SWoPP2003, Matsue
4
分散化した observer パターン
- モジュール化の困難さ

2 種類の横断的関心事



異なるクラス間を横断する関心事(AspectJ で対応可)
異なるホスト間を横断する関心事
分散版では…

Observer


複数のScreen オブジェクトが各ホストに存在する
Subject

Point, Line オブジェクトの複製が各ホストに存在する
(編集中の図形の情報のコピーが各ホストに存在)
SWoPP2003, Matsue
5
異なるクラス間の横断的関心事

クラス図
FigureElement: Subject
Screen: Observer
observer: Screen
update(Subject): void
addObserver(Screen)
notify(): void
Point
Line
getX(): int
getY(): int
setX(int): void
setY(int): void
getP1(): Point
getP2(): Point
setP1(Point): void
setP2(Point): void
横断的関心事: Subject の状態の変更を observer に通知しなくてはならない
SWoPP2003, Matsue
6
異なるクラス間の横断的関心事の
モジュール化

アスペクト指向技術(AOP)


横断的関心事をアスペクトと呼ばれるモジュールに
分離する技術
AspectJ



汎用的な Java 用 AOP 言語
異なるクラス間の横断的関心事のモジュール化は
可能
しかし、異なるホスト間の横断的関心事のモジュー
ル化は困難
SWoPP2003, Matsue
7
AspectJ によるモジュール化
class Point {
void setX(int) { … }
void setY(int) { … }
int getX() { … }
int getY() { … }
}
class Line {
void setP1(Point p) {
… … p.setX(int); notify();
… p.setY(int); notify(); …
}
void setP2(Point p) {
… … p.setX(int); notify();
… p.setY(int); notify(); …
}
Point getP1() { … }
Point getP2() { … }
}
aspect ObserverProtocol {
pointcut subjectChange(Subject s):
(call(void Point.setX(int))
|| call(void Point.setY(int))
|| call(void Line.setP1(Point))
|| call(void Line.setP2(Point)))
&& target(s);
after(Subject s): subjectChange(s) {
s.observer.update(s);
}}
class Line {
void setP1(Point p) {
… p.setX(int); … p.setY(int); …
}
void setP2(Point p) {
… p.setX(int); … p.setY(int); …
}
Point getP1() { … }
Point getP2() { … }}
SWoPP2003, Matsue
8
AspectJ の言語仕様

Join point

プログラム実行中の基本要素


Advice 定義

散らばってしまうコードの断片


例: メソッド呼び出し、メソッド実
行、フィールドアクセス
aspect ObserverProtocol {
pointcut subjectChange(Subject s):
(call(void Point.setX(int))
|| call(void Point.setY(int))
|| call(void Line.setP1(Point))
|| call(void Line.setP2(Point)))
&& target(s);
Before, after, around
after(Subject s): subjectChange(s) {
s.observer.update(s);
}
Pointcut 記述

Advice を実行する join point
の指定


}
Pointcut 指定子 target, call
Pointcut 引数: advice に渡す
join point の情報
SWoPP2003, Matsue
9
異なるホスト間の横断的関心事
- 遠隔ホスト上の observer

AspectJ は苦手

Subject の状態の変更を、すべてのホストのスク
リーンに遠隔呼び出しで通知
:Screen
:Screen
:Point
Advice
Pointcut
遠隔メソッド呼出
(RMI)
SWoPP2003, Matsue
:Screen
10
異なるホスト間の横断的関心事
- 散らばる advice

各ホストに Point や Line の複製を配置すると

各ホストに advice が散らばる

各 advice 内では、各ホスト上の Screen の遠隔参照(ポインタ)
のコピーを保持していなければならない
:Screen
RMI
:Screen
:Point
Advice
:Point
Advice
:Screen
Pointcut
AspectJ は advice と同じホスト上の
join point だけしか pointcut できない
SWoPP2003, Matsue
Advice
:Point
11
散らばった advice の問題

各ホスト上に散った複数の advice が一つ
の関心事を実装


プログラミング上好ましくない
全 Screen の遠隔参照(ポインタ)を全
advice 間で共有
コピーを配布
 集中管理

一貫性の管理が面倒
一部の advice は proxy??
Proxy の定義は単純だが面倒
SWoPP2003, Matsue
12
DJcutter の提案


AspectJ の言語仕様を拡張
遠隔ホスト上の join point を pointcut できる


遠隔ホスト上のプログラム実行が join point に達し
たら advice を呼び出す
Advice が分散しない
AspectJ の
pointcut 機構
:Point
Advice
DJcutter の
pointcut 機構
Advice
遠隔 pointcut
SWoPP2003, Matsue
13
DJcutter による分散 observer
パターンのモジュール化
アスペクト・サーバ・ホス
ト
Pointcut
Advice
RMI
:Screen
RMI
:Point
RMI
:Point
:Screen
:Screen
Advice が各ホストに
散らばらずにすむ
:Point
SWoPP2003, Matsue
14
言語仕様 (1)
- Pointcut 記述

AspectJ のサブセットをサポート

Within(Type)


Target(Id)


Id と同じ型を引数にとる join point を全て指定
Args(Id, …)


それぞれのホスト上に存在する Type クラス内の全ての
join point を指定
Ids と同じ型を引数にとる join point を指定
Call(Signature)

Sigunature に一致しているメソッド呼び出しを指定
SWoPP2003, Matsue
15
言語仕様 (2)
- Advice 定義

AspectJ と同様の機能をサポート

Before


After


選択した join point の直後に advice を実行
Around


選択した join point の直前に advice を実行
選択した join point 自体に代わり advice を実行
拡張: 組み込み変数 $remotehost

Advice を呼び出した join point の存在するホスト
名を String 型で表す
SWoPP2003, Matsue
16
言語仕様(3)
- アスペクトフィールド・メソッド


クラス定義と同様のフィールド・メソッドをアスペクト内に
定義可能
普通のクラスからアスペクトメソッドを呼び出したい場合


普通のクラスとアスペクトメソッドとは異なるホスト上に存在す
る場合が多い。
ユーザはインターフェースを経由
JavaRMI の registry server
aspect LoggingAspect
implements Logger {
void displayLog(Point p, int x) {
……
}}
Logger logger = (Logger)
Aspect.get(“LoggingAspect”, this);
Logger.displayLog();
Interface Logger extends AspectInterface{
void displayLog(Point p, int x); }
SWoPP2003, Matsue
アスペクト・メソッドの呼び出し
17
実装

DJcutter は


アスペクトのソースファイルを処理するコン
パイラ
分散プログラムを実行する実行時ライブラリ
アスペクト・サーバ
 拡張クラスローダ

SWoPP2003, Matsue
18
DJcutter コンパイラ

アスペクトのソースファイルを Java のクラスに
変換する
aspect LoggingAspect {
pointcut logX(Point p):
(call(void Point.setX(int)
|| call(void Point.setY(int))
&& target(p);
after(Point p, int x):
logX(p, x) {
System.out.println(“set x: “ + x);
}
}
class LoggingAspect {
static void after_$0(Point p, int x) {
System.out.println(“set x: “ + x);
}
}
Bytecode 変換
SWoPP2003, Matsue
19
アスペクト・サーバ

プログラム実行時に最初に起動



アスペクトのソースをコンパイルして得られたクラス
をロード
Advice やアスペクトメソッドを実行
アスペクトのソース内の pointcut 情報をクライ
アントに配布

クライアントは、通常のクラスをロードして実行
SWoPP2003, Matsue
20
拡張クラスローダ


各クライアント・ホストで、通常のクラスを
ロードして実行
クラスのロード時


Pointcut をアスペクト・サーバに問い合わせ
クラス内の join point が pointcut で指定さ
れていれば、advice を呼び出すコードを
bytecode 変換でそこに埋め込む
SWoPP2003, Matsue
21
遠隔参照の実装

オブジェクトの遠隔参照を利用して、遠隔メソッ
ド呼び出しを実現


遠隔参照は Remote proxy パターンで実装
オブジェクトへの参照を遠隔参照に変換




指定された join point に制御の流れが到達したとき
Aspect.get メソッドによってアスペクトの参照を入
手したとき
アスペクトメソッドを呼び出すとき
遠隔参照がさすオブジェクトのメソッドを遠隔メソッド
呼び出ししたとき
22
SWoPP2003, Matsue
実行時ライブラリの性能測定実験
- Advice 呼び出しと JavaRMI

DJcutter は join point が存在するホストの情報等
を advice へ送る
同一
ホスト
遠隔
ホスト
DJcutter
1.3
2.3
JavaRMI
(0 引数)
0.7
1.4
JavaRMI
(1 引数)
1.3
2.3
実験に利用したマシンスペック
-Sun Blade 1000
-Sun Enterprise 450
ネットワーク
- 1000baseFX
Null advice/method の実行時間(msec.)
SWoPP2003, Matsue
23
関連研究

分散プログラム内の特定の非機能的な横断的
関心事をモジュール化



D 言語: 並列に動作するスレッド間の協調動作、遠
隔メソッド呼び出し
Addistant : オブジェクトの分散配置、遠隔参照の
実装
DJcutter


AspectJ と同様、汎用的な横断的関心事が扱える
分散している join point を1つのアスペクトの中で
取り扱える
SWoPP2003, Matsue
24
まとめ

2 種類の横断的関心事



異なるクラス間
異なるホスト間
DJcutter


Java 用のアスペクト指向言語
AspectJ ではうまくモジュール化しきれない異なる
ホスト間の横断的関心事をモジュール化する


遠隔ホスト上のプログラム内の join point を指定すること
が可能な pointcut 機構
分散化した observer パターンに有効
SWoPP2003, Matsue
25
今後の課題

DJcutter の実行速度を改良


Join point が同一ホスト上にある場合も、
advice は別プロセスで実行
多くの pointcut 機構をサポート

Join point をホストの情報で選択するため
の指定子は用意していない
SWoPP2003, Matsue
26
SWoPP2003, Matsue
27
アスペクト記述

グループ図形エディタ内の横断的関心事
をモジュール化
アスペクト記述
SWoPP2003, Matsue
28
SWoPP2003, Matsue
29
SWoPP2003, Matsue
30