分散 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 2025 ExpyDoc