Download presentation
Presentation is loading. Please wait.
1
遠隔ポイントカット - 分散アスペクト指向プログラミング のための言語機構
西澤 無我 (02M37259) 指導教官: 千葉 滋 修士論文発表 2004年2月
2
本研究 分散ソフトウェアのモジュール化技術 アスペクト指向プログラミング (AOP) AOP で分散ソフトウェアをモジュール化
ソフトウェアを小さなプログラムに分割する技術 ソフトウェアの可読性・保守性の向上 アスペクト指向プログラミング (AOP) 横断的関心事をモジュール化する技術 AOP で分散ソフトウェアをモジュール化 DJcutter の開発 修士論文発表 2004年2月
3
アスペクト指向プログラミング (AOP) 横断的関心事をまとめる技術 横断的関心事とは まとめられたモジュールをアスペクトと呼ぶ
複数のモジュールにまたがってしまう処理 既存のモジュール化技術では分離が困難 例: ログ処理 ログ処理はモジュールその ものの機能とは無関係だが、 モジュール内に入り混じる 横断的関心事 class Car { void start() { System.out.println(“start”); … … }} class Bike { 修士論文発表 2004年2月
4
AspectJ: 汎用 AOP 言語 ポイントカット アドバイス 実行中のプログラム箇所を指定
例: メソッド呼出、メソッド実行、フィールドアクセス アドバイス ポイントカットとして指定された箇所で実行する処理 class Car { void start() { System.out.println(“start”); … … }} class Bike { aspect Log { before(): execution(void Car.start()) || execution(void Bike.start()) { System.out.println(“start”); }} exec exec 修士論文発表 2004年2月
5
認証サービス・アプリケーションの テストプログラム
認証サーバが正しく DB サーバにアクセスしているか? 1.registerUser() 呼出 AuthServer クライアント 2.addUser() 呼出 ・ユーザ認証を行うAuthServer DbServer ・ユーザ情報を DB に登録するDbServer テストプログラムで、registerUser() を呼び出したとき、 addUser() が実行されているかどうかを確認したい 修士論文発表 2004年2月
6
テストプログラムのアルゴリズム テストプログラムに flag を用意する AuthServerTest AuthServer
registerUser() 呼出 AuthServerTest AuthServer テスト本体 1. flag の初期値 false 2. registerUser() 呼出 3. flag をチェック true ならテスト成功 false なら失敗 addUser() 呼出 DbServer addUser() が実行され たら、flag を true に変更 修士論文発表 2004年2月
7
Java で書いたテストプログラム テストプログラムに flag を用意する AuthServerTest AuthServer
registerUser() 呼出 AuthServerTest AuthServer テスト本体 1. flag の初期値 false 2. registerUser() 呼出 3. flag をチェック true ならテスト成功 false なら失敗 addUser() 呼出 DbServer 通知 addUser() が実行され たら、flag を true に変更 修士論文発表 2004年2月
8
テストプログラムが DbServer を横断してしまう
テストのためだけに、既存のプログラムを修正・変更したくない addUser() 内に flag を true にするコードが入り込んでしまう 横断的関心事 ソフトウェアの開発・保守作業効率を低下 AOP でモジュール化を試みる テストコードと既存プログラムを うまく分離できないか? 修士論文発表 2004年2月
9
AspectJ を利用した テストプログラム
アドバイス内でプログラム setFlag を呼び出す 1.registerUser() 呼出 AuthServerTest AuthServer テスト本体 1. flag の初期値 false 2. registerUser() 呼出 3. flag をチェック true ならテスト成功 false なら失敗 2.addUser() 呼出 DbServer exec setFlag アスペクト RMI flag を true に変更 addUser() が実行され たら、setFlag を呼ぶ 一応、テストプログラムを DbServer から分離 修士論文発表 2004年2月
10
複数のモジュールから構成された テストプログラム
1つの関心事は1つのモジュールから構成されるべきだ (AOP の観点) 特に、分散コンピューティング 複数のモジュールから構成されるプログラムは 開発・保守が面倒くさい 互いに密なネットワーク通信をしている さらに、デプロイ作業が必要になる 汎用 AOP 言語 (AspectJ) では テストコードを既存ソフトウェアから分離することはできたが、複数のモジュールに分かれてしまった 修士論文発表 2004年2月
11
DJcutter の提案 単一ホスト上で動作するモジュールを作成できる 分散アスペクト指向プログラミング言語 遠隔ポイントカット機能を提供
分散した複数のモジュールからなる実装を避けられる 可読性・保守性の高いアスペクト、ソフトウェアを実現 分散アスペクト指向プログラミング言語 AspectJ の言語仕様を分散ソフトウェア用に拡張 遠隔ポイントカット機能を提供 修士論文発表 2004年2月
12
DJcutter の遠隔ポイントカット 遠隔ホスト上のプログラムをポイントカット可能 アドバイスはアスペクトのあるホスト上で実行 Log
ポイントカットした遠隔プログラムのコンテキストを扱える 2. アドバイスを実行 Log 1.addUser() 呼出 アドバイス実行の ためのメッセージ DbServer aspect Log { before() : execution(void DbServer.addUser()) { System.out.println(“addUser”); } 修士論文発表 2004年2月
13
AspectJ のポイントカットとの違い DJcutter AspectJ Log DbServer Log 遠隔ホスト上のプログラム
をポイントカット可能 AspectJ 同じホスト上のプログラム しかポイントカットできない aspect Log { before() : execution(void DbServer.addUser()) { System.out.println(“addUser”); } DJcutter の アスペクト Log addUser() 呼出 Remote exec DbServer Local exec Log AspectJ の アスペクト 修士論文発表 2004年2月
14
DJcutter でテストを記述 明示的なネットワーク通信のない、1つのモジュール AuthServerTest AuthServer
1.registerUser() 呼出 AuthServerTest AuthServer テスト本体 1. flag の初期値 false 2. registerUser() 呼出 3. flag をチェック true ならテスト成功 false なら失敗 2.addUser() 呼出 DbServer Remote exec addUser() が実行され たらflag を true に変更 テストプログラムを DbServer から分離 かつ、1つのモジュールにまとめられる 修士論文発表 2004年2月
15
具体的な実装 可読性・保守性の高いアスペクト記述 wasAddUserCalled を初期化 registerUser() を呼び出す
aspect AuthServerTest extends TestCase { boolean wasAddUserCalled; void testRegisterUser() { wasAddUserCalled = false; String userId = "muga", password = "xxx"; AuthServer auth = (AuthServer) Naming.lookup("auth"); auth.registerUser(userId, password); assertTrue(wasAddUserCalled); } before(): // remote pointcut execution(void DbServer.addUser(..)) { wasAddUserCalled = true; }} wasAddUserCalled を初期化 registerUser() を呼び出す wasAddUserCalled の真偽 でテストの成功を判断 AddUser() が実行されたら wasAddUserCalled が true 修士論文発表 2004年2月
16
AspectJ を利用した テストプログラムの実装
1.registerUser() 呼出 AuthServerTest AuthServer class AuthServerTest extends TestCase { boolean wasAddUserCalled; void testRegisterUser() { Naming.rebind("test", new RecieverImpl()); wasAddUserCalled = false; String userId = "muga", password = "xxx"; AuthServer auth = (AuthServer) Naming.lookup("auth"); auth.registerUser(userId, password); assertTrue(wasAddUserCalled); } class ReceiverImpl extends UnicastRemoteObject implements NotificationReceiver { void confirmCall() { wasAddUserCalled = true; } } interface NotificationReceiver { void confirmCall(); } 2.addUser() 呼出 DbServer interface NotificationReceiver { void confirmCall(); } aspect Notification { before(): execution(void DbServer.addUser()){ NotificationReceiver test = (NotificationReceiver) Naming.lookup("test"); test.confirmCall(); }} RMI 修士論文発表 2004年2月
17
言語仕様 (1) ポイントカット指定子 アドバイス宣言 アスペクトメソッドの宣言
Call, execution, target, within, args … すべてのホスト上のプログラムを指定可能 Hosts(HostIds) ホスト毎にプログラムを指定可能 Cflow(Pointcut) 異なるスレッド、異なるホストでも有効なコントロールフロー アドバイス宣言 Before, after, around をサポート アスペクトメソッドの宣言 アクセス方法はインターフェース経由でアクセス 修士論文発表 2004年2月
18
言語仕様 (2) 遠隔インタータイプ宣言 アスペクト内で遠隔ホスト上で動作するクラスのメソッド・フィールドを宣言
AuthServerTest 実行時に適用する DbServer boolean containsUser(); aspect AuthServerTest { boolean DbServer.containsUser(String userId) { // DB にユーザ情報が登録されているかどうか } 修士論文発表 2004年2月
19
実装 コンパイラ ランタイムライブラリ アスペクトのソースファイルの内容から Java のbytecode を生成
ポイントカットや遠隔インタータイプ宣言の情報をランタイムライブラリに渡す AspectJ のコンパイラが出力するコードと同等 ランタイムライブラリ コンパイル済みのアスペクトやその他の分散ソフトウェアをロード・実行 それぞれのホスト上の拡張クラスローダがポイントカットや遠隔インタータイプ宣言の情報を受け取り、bytecode 変換 修士論文発表 2004年2月
20
関連研究 分散プログラム内の特定の横断的関心事を モジュール化 DJcutter
Addistant: オブジェクトの配置、遠隔参照の実装 JAC: Consistency、同期、トランザクション DJcutter 遠隔ポイントカットを提供 AspectJ と同様、汎用的な横断的関心事が扱える 修士論文発表 2004年2月
21
これまでの仕事 (1) 査読つきの論文 査読なしの論文(発表のみ・ポスターのみを除く)
Remote Pointcut – A Language Construct for Distributed AOP AOSD 2004 (International Conference on Aspect-Oriented Software Development) 査読なしの論文(発表のみ・ポスターのみを除く) 分散 Java プログラミングのための AOP 言語 SWoPP 2003 (Summer United Workshops on Parallel, Distributed and Cooperative Processing) Jarcler: Aspect-Oriented Middleware for Distributed Software in Java Dept. of Math. and Comp. Sciences Research Reports 2002 C-164 アスペクト指向の分散化支援ツール SPA summer 2002 (Systems for Programming and Applications) プログラム分散化のためのアスペクト指向言語 SPA 2002 (Systems for Programming and Applications) 修士論文発表 2004年2月
22
これまでの仕事 (2) 発表のみ、ポスターのみ プログラム分散化のためのアスペクト指向言語
SPA 2002 (Systems for Programming and Applications) SPA 2003 (Systems for Programming and Applications) 分散 Java プログラムのためのアスペクト指向言語 SPA summer 2003 (Systems for Programming and Applications) 分散 Java プログラミングのためのアスペクト指向言語 CREST Meeting 2003 アスペクト指向ソフトウェア開発のための基盤ツール 情報学 公開シンポジウム 2004 SPA 2004 (Systems for Programming and Applications) (予定) CREST Meeting 2004 (予定) PPL 2004 (Programming and Programming Languages) (予定) 修士論文発表 2004年2月
23
まとめ DJcutter: Java 用の分散 AOP 言語 関連研究 遠隔ポイントカット機能を提供
分散ソフトウェア内の横断的関心事をモジュール化 認証サービス・アプリケーションのテストプログラムを例に出した 汎用 AOP 言語では複数のモジュールになってしまう DJcutter では、1つのモジュールに記述できる 可読性・保守性の高いアスペクト記述 関連研究 D言語、Addistant, JAC 修士論文発表 2004年2月
24
まとめ DJcutter: Java 用の分散 AOP 言語 遠隔ポイントカット機能を提供 分散ソフトウェア内の横断的関心事をモジュール化
認証サービス・アプリケーションのテストプログラムを例に出した 汎用 AOP 言語では複数のモジュールになってしまう DJcutter では、1つのモジュールに記述できる 可読性・保守性の高いアスペクト記述 修士論文発表 2004年2月
25
修士論文発表 2004年2月
26
修士論文発表 2004年2月
27
実装 (1) - DJcutter コンパイラ アスペクトのソースファイルの内容から Java のbytecode を生成
AspectJ のコンパイラが出力するコードと同等 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); } 修士論文発表 2004年2月
28
実装 (2) DJcutter runtime - アスペクト・サーバ
アドバイスやアスペクトメソッドを実行 プログラム実行時にコンパイル済みアスペクトをロード アスペクトの pointcut 情報を保持 他のホストの DJcutter runtime はアスペクト・サーバに問い合わせる 修士論文発表 2004年2月
29
実装 (3) DJcutter runtime - 拡張クラスローダ
各ホストで Java クラスをロード、実行 クラスのロード時 Pointcut をアスペクト・サーバに問い合わせ ロードしているクラスがポイントカットされていれば、アドバイスを呼び出すコードをbytecode 変換で埋め込む 修士論文発表 2004年2月
30
DJcutter Runtime の性能測定 - Advice 呼び出しと JavaRMI
DJcutter は join point が存在するホストの情報等を advice へ送る 同一 ホスト 遠隔 DJcutter 1.3 2.3 JavaRMI (0 引数) 0.7 1.4 (1 引数) 実験に利用したマシンスペック Sun Blade 1000 Sun Enterprise 450 ネットワーク - 1000baseFX Null advice/method の実行時間(msec.) 修士論文発表 2004年2月
31
今後の課題 DJcutter の実行速度を改良 多くの pointcut 機構をサポート
Join point が同一ホスト上にある場合も、advice は別プロセスで実行 多くの pointcut 機構をサポート Join point をホストの情報で選択するための指定子は用意していない 修士論文発表 2004年2月
Similar presentations
© 2024 slidesplayer.net Inc.
All rights reserved.