分散 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
© Copyright 2026 ExpyDoc