遠隔ポイントカット - 分散アスペクト指向プログラミング のための言語機構

Slides:



Advertisements
Similar presentations
関心事指向アーキテクチャモデリング環 境 Concern-oriented Architecture Modeling Environment 九州工業大学大学院情報工学府 情報科学専攻 鵜林研究室 M1 佐藤 友紀 1.
Advertisements

Web アプリをユーザー毎に カスタマイズ可能にする AOP フレームワーク
6.4継承とメソッド 6.5継承とコンストラクタ 11月28日 時田 陽一
Riding the Design Wave II
Javaのための暗黙的に型定義される構造体
Dynamic AOPと その実装手法について
アルゴリズムとプログラミング (Algorithms and Programming)
Myoungkyu Song and Eli Tilevich 発表者: 石尾 隆(大阪大学)
AspectScope によるアスペクトとクラスのつながりの視覚化
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
同期的にアドバイスを活性化できる分散動的アスペクト指向システム
ユーザ毎にカスタマイズ可能な Web アプリケーション用のフレームワークの実装
RMI ソフトウェア特論 第6回 /
アスペクト指向プログラミングを用いたIDSオフロード
効率的なJava Dynamic AOPシステムを実現する Just-in-Time weaver
アスペクト指向プログラミングと Dependency Injection の融合
既存Javaプログラムの バイトコード変換による 機能分散
AOP言語への 織り込みインターフェイスの導入 A Weaving-Interface for AOP Languages
契約に基づいたアスペクト指向リファクタリングの検証
過負荷時の分散ソフトウェアの 性能劣化を改善する スケジューリングの提案
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
細かい粒度で コードの再利用を可能とする メソッド内メソッドと その効率の良い実装方法の提案
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
アスペクト指向の 分散化支援ツール 西澤無我、千葉滋 東京工業大学 SPA summer 2002, Hakone.
暗黙的に型付けされる構造体の Java言語への導入
関心事ごとに視点を切り替えて プログラムを編集できる 統合開発環境の提案と実装
数理・計算科学専攻 千葉研究室 08M37315 森田 悟史 指導教員 千葉 滋 教授
理学部 情報科学科 指導教官 千葉 滋 助教授 学籍番号 03_03686 内河 綾
統合開発環境のための アスペクト指向システム
アスペクト指向言語による 例外処理の記述方法の改善
ユーザ毎にカスタマイズ可能な Webアプリケーションの 効率の良い実装方法
Javaプログラムの変更を支援する 影響波及解析システム
AspectScope による アスペクト指向プログラ ミングの支援
アスペクト指向に基づく 拡張可能な MDAモデルコンパイラ
10-1 SAXの概要 10-2 Saxプログラミングの基礎 10-3 saxのプログラム例
横断的関心事に対応したオブジェクト指向言語GluonJとその織り込み関係の可視化ツール
活性化のタイミング制御の実装を分離記述可能な分散動的アスペクト指向言語
既存Javaプログラム向け 分散化支援システムの開発
豊富な情報を基にした pointcut を記述できるアスペクト指向言語
Recoveryアドバイスをもつ アスペクト指向システム
オブジェクト指向言語論 第八回 知能情報学部 新田直也.
Addistant:アスペクト指向の 分散プログラミング支援ツール
クラスのインターフェース やその振る舞いに及ぼすアスペクトの影響の解析と可視化
アスペクト指向言語のための 独立性の高いパッケージシステム
アプリケーション依存の先読みが可能なO/Rマッピングツール
アスペクト指向言語のための 独立性の高いパッケージシステム
pointcut に関して高い記述力を持つ アスペクト指向言語 Josh
Java における 先進的リフレクション技術
契約による クラスとアスペクト間の 影響解析
プログラムの織り込み関係を可視化するアウトラインビューの提案と実装
アルゴリズムとプログラミング (Algorithms and Programming)
ソフトウェア工学 知能情報学部 新田直也.
分散 Java プログラムのための アスペクト指向言語
プログラミング言語論 第十一回 理工学部 情報システム工学科 新田直也.
Josh : バイトコードレベルでのJava用 Aspect Weaver
統合開発環境によって表現された 言語機構によるコードのモジュール化
IDE を活用した言語機構に頼らないコード再利用のためのモジュール化
同期処理のモジュール化を 可能にする アスペクト指向言語
様々なAOPメカニズムをモデル化する パラメータ化インタプリタ
アスペクト指向言語のための視点に応じた編集を可能にするツール
プログラムの差分記述を 容易に行うための レイヤー機構付きIDEの提案
ユビキタスコンピューティングの ための ハンドオーバー機能付きRMIの実装
状況に応じて適切な 例外処理が行なえる アスペクト指向分散環境実験の 支援ツール
プログラム分散化のための アスペクト指向言語
プログラミング基礎a 第9回 Java言語による図形処理入門(1) Javaアプレット入門
開発者との対話を活かした 横断的構造の表現
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
GluonJ を用いたビジネスロジックからのデータベースアクセスの分離
Josh : バイトコードレベルでのJava用 Aspect Weaver
Presentation transcript:

遠隔ポイントカット - 分散アスペクト指向プログラミング のための言語機構 西澤 無我 (02M37259) 指導教官: 千葉 滋 修士論文発表 2004年2月

本研究 分散ソフトウェアのモジュール化技術 アスペクト指向プログラミング (AOP) AOP で分散ソフトウェアをモジュール化 ソフトウェアを小さなプログラムに分割する技術 ソフトウェアの可読性・保守性の向上 アスペクト指向プログラミング (AOP) 横断的関心事をモジュール化する技術 AOP で分散ソフトウェアをモジュール化 DJcutter の開発 修士論文発表 2004年2月

アスペクト指向プログラミング (AOP) 横断的関心事をまとめる技術 横断的関心事とは まとめられたモジュールをアスペクトと呼ぶ 複数のモジュールにまたがってしまう処理 既存のモジュール化技術では分離が困難 例: ログ処理 ログ処理はモジュールその ものの機能とは無関係だが、 モジュール内に入り混じる 横断的関心事 class Car { void start() { System.out.println(“start”); … … }} class Bike { 修士論文発表 2004年2月

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月

認証サービス・アプリケーションの テストプログラム 認証サーバが正しく DB サーバにアクセスしているか? 1.registerUser() 呼出 AuthServer クライアント 2.addUser() 呼出 ・ユーザ認証を行うAuthServer DbServer ・ユーザ情報を DB に登録するDbServer テストプログラムで、registerUser() を呼び出したとき、 addUser() が実行されているかどうかを確認したい 修士論文発表 2004年2月

テストプログラムのアルゴリズム テストプログラムに flag を用意する AuthServerTest AuthServer registerUser() 呼出 AuthServerTest AuthServer テスト本体 1. flag の初期値 false 2. registerUser() 呼出 3. flag をチェック   true ならテスト成功   false なら失敗 addUser() 呼出 DbServer addUser() が実行され たら、flag を true に変更 修士論文発表 2004年2月

Java で書いたテストプログラム テストプログラムに flag を用意する AuthServerTest AuthServer registerUser() 呼出 AuthServerTest AuthServer テスト本体 1. flag の初期値 false 2. registerUser() 呼出 3. flag をチェック   true ならテスト成功   false なら失敗 addUser() 呼出 DbServer 通知 addUser() が実行され たら、flag を true に変更 修士論文発表 2004年2月

テストプログラムが DbServer を横断してしまう テストのためだけに、既存のプログラムを修正・変更したくない addUser() 内に flag を true にするコードが入り込んでしまう 横断的関心事 ソフトウェアの開発・保守作業効率を低下 AOP でモジュール化を試みる テストコードと既存プログラムを うまく分離できないか? 修士論文発表 2004年2月

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月

複数のモジュールから構成された テストプログラム 1つの関心事は1つのモジュールから構成されるべきだ (AOP の観点) 特に、分散コンピューティング 複数のモジュールから構成されるプログラムは 開発・保守が面倒くさい 互いに密なネットワーク通信をしている さらに、デプロイ作業が必要になる 汎用 AOP 言語 (AspectJ) では テストコードを既存ソフトウェアから分離することはできたが、複数のモジュールに分かれてしまった 修士論文発表 2004年2月

DJcutter の提案 単一ホスト上で動作するモジュールを作成できる 分散アスペクト指向プログラミング言語 遠隔ポイントカット機能を提供 分散した複数のモジュールからなる実装を避けられる 可読性・保守性の高いアスペクト、ソフトウェアを実現 分散アスペクト指向プログラミング言語 AspectJ の言語仕様を分散ソフトウェア用に拡張 遠隔ポイントカット機能を提供 修士論文発表 2004年2月

DJcutter の遠隔ポイントカット 遠隔ホスト上のプログラムをポイントカット可能 アドバイスはアスペクトのあるホスト上で実行 Log ポイントカットした遠隔プログラムのコンテキストを扱える 2. アドバイスを実行 Log 1.addUser() 呼出 アドバイス実行の ためのメッセージ DbServer aspect Log { before() : execution(void DbServer.addUser()) { System.out.println(“addUser”); } 修士論文発表 2004年2月

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月

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月

具体的な実装 可読性・保守性の高いアスペクト記述 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月

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月

言語仕様 (1) ポイントカット指定子 アドバイス宣言 アスペクトメソッドの宣言 Call, execution, target, within, args … すべてのホスト上のプログラムを指定可能 Hosts(HostIds) ホスト毎にプログラムを指定可能 Cflow(Pointcut) 異なるスレッド、異なるホストでも有効なコントロールフロー アドバイス宣言 Before, after, around をサポート アスペクトメソッドの宣言 アクセス方法はインターフェース経由でアクセス 修士論文発表 2004年2月

言語仕様 (2) 遠隔インタータイプ宣言 アスペクト内で遠隔ホスト上で動作するクラスのメソッド・フィールドを宣言 AuthServerTest 実行時に適用する DbServer boolean containsUser(); aspect AuthServerTest { boolean DbServer.containsUser(String userId) { // DB にユーザ情報が登録されているかどうか } 修士論文発表 2004年2月

実装 コンパイラ ランタイムライブラリ アスペクトのソースファイルの内容から Java のbytecode を生成 ポイントカットや遠隔インタータイプ宣言の情報をランタイムライブラリに渡す AspectJ 1.0.6 のコンパイラが出力するコードと同等 ランタイムライブラリ コンパイル済みのアスペクトやその他の分散ソフトウェアをロード・実行 それぞれのホスト上の拡張クラスローダがポイントカットや遠隔インタータイプ宣言の情報を受け取り、bytecode 変換 修士論文発表 2004年2月

関連研究 分散プログラム内の特定の横断的関心事を モジュール化 DJcutter Addistant: オブジェクトの配置、遠隔参照の実装 JAC: Consistency、同期、トランザクション DJcutter 遠隔ポイントカットを提供 AspectJ と同様、汎用的な横断的関心事が扱える 修士論文発表 2004年2月

これまでの仕事 (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月

これまでの仕事 (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月

まとめ DJcutter: Java 用の分散 AOP 言語 関連研究 遠隔ポイントカット機能を提供 分散ソフトウェア内の横断的関心事をモジュール化 認証サービス・アプリケーションのテストプログラムを例に出した 汎用 AOP 言語では複数のモジュールになってしまう DJcutter では、1つのモジュールに記述できる 可読性・保守性の高いアスペクト記述 関連研究 D言語、Addistant, JAC 修士論文発表 2004年2月

まとめ DJcutter: Java 用の分散 AOP 言語 遠隔ポイントカット機能を提供 分散ソフトウェア内の横断的関心事をモジュール化 認証サービス・アプリケーションのテストプログラムを例に出した 汎用 AOP 言語では複数のモジュールになってしまう DJcutter では、1つのモジュールに記述できる 可読性・保守性の高いアスペクト記述 修士論文発表 2004年2月

修士論文発表 2004年2月

修士論文発表 2004年2月

実装 (1) - DJcutter コンパイラ アスペクトのソースファイルの内容から Java のbytecode を生成 AspectJ 1.0.6 のコンパイラが出力するコードと同等 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月

実装 (2) DJcutter runtime - アスペクト・サーバ アドバイスやアスペクトメソッドを実行 プログラム実行時にコンパイル済みアスペクトをロード アスペクトの pointcut 情報を保持 他のホストの DJcutter runtime はアスペクト・サーバに問い合わせる 修士論文発表 2004年2月

実装 (3) DJcutter runtime - 拡張クラスローダ 各ホストで Java クラスをロード、実行 クラスのロード時 Pointcut をアスペクト・サーバに問い合わせ ロードしているクラスがポイントカットされていれば、アドバイスを呼び出すコードをbytecode 変換で埋め込む 修士論文発表 2004年2月

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月

今後の課題 DJcutter の実行速度を改良 多くの pointcut 機構をサポート Join point が同一ホスト上にある場合も、advice は別プロセスで実行 多くの pointcut 機構をサポート Join point をホストの情報で選択するための指定子は用意していない 修士論文発表 2004年2月