Download presentation
Presentation is loading. Please wait.
1
Dynamic AOPと その実装手法について
情報処理学会プログラミング研究会 発表資料 2003年1月23日 Dynamic AOPと その実装手法について 東京工業大学 佐藤芳樹 千葉滋 Mar 12-14, 2003 SPA 2003, Hakone
2
情報処理学会プログラミング研究会 発表資料 2003年1月23日
情報処理学会プログラミング研究会 発表資料 2003年1月23日 1.AOP(Aspect-Oriented-Programming) 簡単な例 モジュール間を横断する関心事(crosscutting concerns)をアスペクトとしてカプセル化 [ BookShelf ] Book search(String key) { while (_booklist.hasMoreElements()) if (_booklist.next().match(key)) return book[i]; } なぜか遅いんだけど、 一体なんでだろう? どこがボトルネック!? [Book] boolean match(String key) { if (match0(key)) return true; else return false; } モジュール間にまたがる横断的関心事(crosscutting concern)をアスペクトとしてモジュール化する新たなプログラミングパラダイム Mar 12-14, 2003 SPA 2003, Hakone
3
情報処理学会プログラミング研究会 発表資料 2003年1月23日
情報処理学会プログラミング研究会 発表資料 2003年1月23日 1.AOP(Aspect-Oriented-Programming) 散らばるコード モジュール間を横断する関心事(crosscutting concerns)をアスペクトとしてカプセル化 [ BookShelf ] public static File loggingFile; Book search(String key) { Profiler.start(BookShelf.loggingFile); while (_booklist.hasMoreElements()) if (_booklist.next().match(key)) return book[i]; Profiler.stop(BookShelf.loggingFile); } あちこちに散らばるコード crosscutting concern 分散、同期、セキュリティ トランザクション、etc… [Book] boolean match(String key) { Profiler.start(BookShelf.loggingFile); if (match0(key)) { Profiler.stop(BookShelf.loggingFile); return true; } else { return false; } モジュール間にまたがる横断的関心事(crosscutting concern)をアスペクトとしてモジュール化する新たなプログラミングパラダイム 保守性・再利用性が低下 どうやらOOでも駄目らしい Mar 12-14, 2003 SPA 2003, Hakone
4
情報処理学会プログラミング研究会 発表資料 2003年1月23日
情報処理学会プログラミング研究会 発表資料 2003年1月23日 1.AOP(Aspect-Oriented-Programming) アスペクトにカプセル化 モジュール間を横断する関心事(crosscutting concerns)をアスペクトとしてカプセル化 [ BookShelf ] Book search(String key) { while (_booklist.hasMoreElements()) if (_booklist.next().match(key)) return book[i]; } Aspect searchとmatchの前後 Profiler#start(),stop() loggingFile [Book] boolean match(String key) { if (match0(key)) return true; else return false; } 散らばっていた処理、無理に 受け渡してたデータを分離 モジュール間にまたがる横断的関心事(crosscutting concern)をアスペクトとしてモジュール化する新たなプログラミングパラダイム アプリロジックと無関係な 非機能的処理も再利用できる Mar 12-14, 2003 SPA 2003, Hakone
5
情報処理学会プログラミング研究会 発表資料 2003年1月23日
情報処理学会プログラミング研究会 発表資料 2003年1月23日 1.AOP(Aspect-Oriented-Programming) アスペクト処理系が合成 モジュール間を横断する関心事(crosscutting concerns)をアスペクトとしてカプセル化 [ BookShelf ] public static File loggingFile; Book search(String key) { Profiler.start(BookShelf.loggingFile); while (_booklist.hasMoreElements()) if (_booklist.next().match(key)) return book[i]; Profiler.stop(BookShelf.loggingFile); } Aspect searchとmatchの前後 Profiler#start(),stop() loggingFile [Book] boolean match(String key) { Profiler.start(BookShelf.loggingFile); if (match0(key)) { Profiler.stop(BookShelf.loggingFile); return true; } else { return false; } モジュール間にまたがる横断的関心事(crosscutting concern)をアスペクトとしてモジュール化する新たなプログラミングパラダイム weaver アスペクトとプログラムを 静的に合成(weave) Mar 12-14, 2003 SPA 2003, Hakone
6
Dynamic AOP 2. Dynamic AOPとその実装 実行時にアスペクトとプログラムを合成 利点 開発効率を改善
実行したまま、プロファイリング、アサーション、ロギングのOn/Off AspectJ : ポーリング箇所を替えるごとにstop-rebuild-restart 実行環境に適応するソフトウェア 要求・環境に応じて、最適なアスペクトに切り替え Mar 12-14, 2003 SPA 2003, Hakone
7
分散GUIの例 2. Dynamic AOPとその実装 クライアントに応じて アスペクトを合成 ・配置 ・解像度 ・ビットレート
Aspect pda = new Aspect(“PDAAspect”); Aspect pc = new Aspect(“PCAspect”); switch(client) { case PDA : weaver.weave(pda); case PC : weaver.weave(pc); } クライアントに応じて アスペクトを合成 PC用Aspect ・配置 ・解像度 ・ビットレート ・色数 etc… Note用Aspect PDA用Aspect Mar 12-14, 2003 SPA 2003, Hakone
8
情報処理学会プログラミング研究会 発表資料 2003年1月23日
情報処理学会プログラミング研究会 発表資料 2003年1月23日 2. Dynamic AOPとその実装 AOPのモデル ・フィールド アクセス join-point でアドバイスを実行する プログラム中の場所 コードの断片 ・メソッド 呼び出し ・オブジェクト 生成 ・・・ Dynamic Join Point Model (AspectJ[*1]で提案) アスペクト pointcut 場所の指定 (join-pointを指定) match() search() advice 処理の記述 『AOPはJoin-pointでアドバイスと呼ばれるコードの断片を実行するというモデルに基づく』 join-pointを指定するポイントカットとjoin-pointで実行するコードを表すアドバイスがある join-point Profiler.start() *1 Xerox Corporation. “The AspectJ Programming Guide. Online Documentation”, Mar 12-14, 2003 SPA 2003, Hakone
9
情報処理学会プログラミング研究会 発表資料 2003年1月23日
情報処理学会プログラミング研究会 発表資料 2003年1月23日 2. Dynamic AOPとその実装 フックでの典型的な実装 フックコードの挿入 コード変換器でjoin-pointへフックコードを挿入 プログラムの実行をインターセプトし、アドバイスを実行 挿入された フックコード do_before_advice(); do_after_advice(); join point フック 『オブジェクト指向言語でAOPを実装する典型的な方法は、join-pointにあたる場所フックを挿入し フックした場所で適切なアドバイスを実行する』 pointcut 指定 Mar 12-14, 2003 SPA 2003, Hakone
10
求められるDAOPシステムの要件 2. Dynamic AOPとその実装 実行時にフックを引っ掛けてアスペクトを合成 仕掛けが少なく
通常の実行では性能を落とさない 処理系に手を加えない 合成は早く 停止時間を抑えてプログラムに反映 コードの実行も早く 高速にアドバイスを実行 Mar 12-14, 2003 SPA 2003, Hakone
11
情報処理学会プログラミング研究会 発表資料 2003年1月23日
情報処理学会プログラミング研究会 発表資料 2003年1月23日 2. Dynamic AOPとその実装 DAOPシステムの実装技法 実行時にフックを挿入するための技法 MOP(Metaobject Protocol) CLOS、Smalltalk、etc リフレクション(イントロスペクション)[3] クラスを巡回 静的コード変換[4,5] 静的なAOPシステムの手法と類似した手法 処理系に用意[6,7] インタプリタ(JIT)、デバッガ ジャストインタイム・フック 埋め込み(我々) オンデマンドにフックを埋め込む [3] D. Orleans and K. Lieberherr. DJ: Dynamic Adaptive Programming in Java In Reflection 2001 [4] J. Baker and W. Hsieh. “Runtime Aspect Weaving Through Metaprogramming” In AOSD’02 [5] A. Popovici, T. Gross, and G. Alonso. “Dynamic Weaving for Aspect Oriented Programming” In AOSD’02 [6] A. Popovici, G. Alonso, and T. Gross. “Just-In-Time Aspects” In AOSD’03 [7] Andrei. P, Thomas. G and Gustavo. A. “Dynamic Weaving for Aspect-Oriented Programming” In AOSD’02 『DAOPシステムは多数存在するが、リフレクションを処理系がサポートする言語では、実行時に容易にフックを挿入できる』 Mar 12-14, 2003 SPA 2003, Hakone
12
情報処理学会プログラミング研究会 発表資料 2003年1月23日
情報処理学会プログラミング研究会 発表資料 2003年1月23日 2. Dynamic AOPとその実装 DAOPシステムの実装技法 実行時にフックを挿入するための技法 MOP(Metaobject Protocol) CLOS、Smalltalk、etc リフレクション(イントロスペクション)[3] クラスを巡回 静的コード変換[4,5] 静的なAOPシステムの手法と類似した手法 処理系に用意[6,7] インタプリタ(JIT)、デバッガ ジャストインタイム・フック 埋め込み(我々) オンデマンドにフックを埋め込む [3] D. Orleans and K. Lieberherr. DJ: Dynamic Adaptive Programming in Java In Reflection 2001 [4] J. Baker and W. Hsieh. “Runtime Aspect Weaving Through Metaprogramming” In AOSD’02 [5] A. Popovici, T. Gross, and G. Alonso. “Dynamic Weaving for Aspect Oriented Programming” In AOSD’02 [6] A. Popovici, G. Alonso, and T. Gross. “Just-In-Time Aspects” In AOSD’03 [7] Andrei. P, Thomas. G and Gustavo. A. “Dynamic Weaving for Aspect-Oriented Programming” In AOSD’02 Mar 12-14, 2003 SPA 2003, Hakone
13
情報処理学会プログラミング研究会 発表資料 2003年1月23日
情報処理学会プログラミング研究会 発表資料 2003年1月23日 2. Dynamic AOPとその実装 イントロスペクションによる手法 DJ(Demeter/Java)[3] Adaptive-Programming アドバイスを実行する場所を、戦略として与える 実行時にクラスを巡回し、アドバイスを実行 フックをかけられず、毎回巡回のため遅い int sumSalaries() { // Adaptiveメソッドを定義 String s = "from Company to Salary"; // traversal strategy Visitor v = new Visitor() { // adaptive visitor private int sum; public void before(Salary man) { sum += man.getSalary(); } public Object getReturnValue() { return new Integer(sum); } }; フックを挿入できないため、かなり制限が大きい Mar 12-14, 2003 SPA 2003, Hakone
14
情報処理学会プログラミング研究会 発表資料 2003年1月23日
情報処理学会プログラミング研究会 発表資料 2003年1月23日 2. Dynamic AOPとその実装 DAOPシステムの実装技法 実行時にフックを挿入するための技法 MOP(Metaobject Protocol) CLOS、Smalltalk、etc リフレクション(イントロスペクション)[3] クラスを巡回 静的コード変換[4,5] 静的なAOPシステムの手法と類似した手法 処理系に用意[6,7] インタプリタ(JIT)、デバッガ ジャストインタイム・フック 埋め込み(我々) オンデマンドにフックを埋め込む [3] D. Orleans and K. Lieberherr. DJ: Dynamic Adaptive Programming in Java In Reflection 2001 [4] J. Baker and W. Hsieh. “Runtime Aspect Weaving Through Metaprogramming” In AOSD’02 [5] A. Popovici, T. Gross, and G. Alonso. “Dynamic Weaving for Aspect Oriented Programming” In AOSD’02 [6] A. Popovici, G. Alonso, and T. Gross. “Just-In-Time Aspects” In AOSD’03 [7] Andrei. P, Thomas. G and Gustavo. A. “Dynamic Weaving for Aspect-Oriented Programming” In AOSD’02 『DAOPシステムは多数存在するが、リフレクションを処理系がサポートする言語では、実行時に容易にフックを挿入できる』 Mar 12-14, 2003 SPA 2003, Hakone
15
情報処理学会プログラミング研究会 発表資料 2003年1月23日
情報処理学会プログラミング研究会 発表資料 2003年1月23日 2. Dynamic AOPとその実装 静的コード変換による手法 コンパイル時リフレクションですべてのjoin-pointへ最小のフックを挿入 (JAC[3], Handiwrap[4]) 静的にはフックする場所を特定できない アドバイスを実行するかどうかをチェック need_advice(); need_advice(); need_advice(); 分岐、無駄なフック - 仕掛けが大 need_advice(); need_advice(); pointcut 指定はここだけ need_advice(); 『静的コード変換ですべてのjoin-pointにフックを挿入すると不必要なフックが多数埋め込まれてしまう』 need_advice(); 常にすべてのjoin-pointでチェック コードサイズの肥大化 need_advice(); need_advice(); need_advice(); need_advice(); need_advice(); Mar 12-14, 2003 SPA 2003, Hakone
16
情報処理学会プログラミング研究会 発表資料 2003年1月23日
情報処理学会プログラミング研究会 発表資料 2003年1月23日 2. Dynamic AOPとその実装 DAOPシステムの実装技法 実行時にフックを挿入するための技法 MOP(Metaobject Protocol) CLOS、Smalltalk、etc リフレクション(イントロスペクション)[3] クラスを巡回 静的コード変換[4,5] 静的なAOPシステムの手法と類似した手法 処理系に用意[6,7] インタプリタ(JIT)、デバッガ ジャストインタイム・フック 埋め込み(我々) オンデマンドにフックを埋め込む [3] D. Orleans and K. Lieberherr. DJ: Dynamic Adaptive Programming in Java In Reflection 2001 [4] J. Baker and W. Hsieh. “Runtime Aspect Weaving Through Metaprogramming” In AOSD’02 [5] A. Popovici, T. Gross, and G. Alonso. “Dynamic Weaving for Aspect Oriented Programming” In AOSD’02 [6] A. Popovici, G. Alonso, and T. Gross. “Just-In-Time Aspects” In AOSD’03 [7] Andrei. P, Thomas. G and Gustavo. A. “Dynamic Weaving for Aspect-Oriented Programming” In AOSD’02 『DAOPシステムは多数存在するが、リフレクションを処理系がサポートする言語では、実行時に容易にフックを挿入できる』 Mar 12-14, 2003 SPA 2003, Hakone
17
情報処理学会プログラミング研究会 発表資料 2003年1月23日
情報処理学会プログラミング研究会 発表資料 2003年1月23日 2. Dynamic AOPとその実装 JITコンパイラによるフック JITが生成したネィティブコード上のすべてのjoin-pointへ最小のフック挿入(PROSE[7]) Javaでのフックよりネィティブのフックは小さい Jalapeno(Javaで書かれたVM、すべてJITコンパイル)へ実装 再JITコンパイルしない 不必要なフックも挿入 need_advice(); need_advice(); need_advice(); need_advice(); 『静的コード変換ですべてのjoin-pointにフックを挿入すると不必要なフックが多数埋め込まれてしまう』 need_advice(); need_advice(); need_advice(); need_advice(); need_advice(); need_advice(); need_advice(); need_advice(); Mar 12-14, 2003 SPA 2003, Hakone
18
情報処理学会プログラミング研究会 発表資料 2003年1月23日
情報処理学会プログラミング研究会 発表資料 2003年1月23日 2. Dynamic AOPとその実装 デバッガによるフック フックをbreakpointとして設定 (PROSE[6]) 標準機能 JPDA の利用 HotSpot使用でデバッグ実行(3~6%程度遅い) アドバイスの実行が遅い breakpointセット デバッガが アドバイス実行 デバッガ デバッガ do_advice(); Mar 12-14, 2003 SPA 2003, Hakone
19
デバッガによるフック挿入・実行 2. Dynamic AOPとその実装 Mar 12-14, 2003 SPA 2003, Hakone
do_advice(); Mar 12-14, 2003 SPA 2003, Hakone
20
情報処理学会プログラミング研究会 発表資料 2003年1月23日
情報処理学会プログラミング研究会 発表資料 2003年1月23日 2. Dynamic AOPとその実装 DAOPシステムの実装技法 実行時にフックを挿入するための技法 MOP(Metaobject Protocol) CLOS、Smalltalk、etc リフレクション(イントロスペクション)[3] クラスを巡回 静的コード変換[4,5] 静的なAOPシステムの手法と類似した手法 処理系に用意[6,7] インタプリタ(JIT)、デバッガ ジャストインタイム・フック 埋め込み(我々) オンデマンドにフックを埋め込む [3] D. Orleans and K. Lieberherr. DJ: Dynamic Adaptive Programming in Java In Reflection 2001 [4] J. Baker and W. Hsieh. “Runtime Aspect Weaving Through Metaprogramming” In AOSD’02 [5] A. Popovici, T. Gross, and G. Alonso. “Dynamic Weaving for Aspect Oriented Programming” In AOSD’02 [6] A. Popovici, G. Alonso, and T. Gross. “Just-In-Time Aspects” In AOSD’03 [7] Andrei. P, Thomas. G and Gustavo. A. “Dynamic Weaving for Aspect-Oriented Programming” In AOSD’02 『DAOPシステムは多数存在するが、リフレクションを処理系がサポートする言語では、実行時に容易にフックを挿入できる』 Mar 12-14, 2003 SPA 2003, Hakone
21
情報処理学会プログラミング研究会 発表資料 2003年1月23日
情報処理学会プログラミング研究会 発表資料 2003年1月23日 2. Dynamic AOPとその実装 動的クラス書き換え(我々が開発1) フックをコード中に埋め込む 古いクラス定義を新しいもので置換 HotSwap機能を使用 (Sun JDK1.4 JPDA) デバッガの制御下でロード済みクラスを再ロード 置換処理は低速だが、アドバイスの実行は高速 JVM 『アスペクトとプログラムの合成を可能な限り遅延させる。フックの挿入は必要になるときまで遅延され、プログラムに埋め込まれる』 JPDA ロード済み クラス do_advice(); do_advice(); do_advice(); do_advice(); フック入り クラス do_advice(); do_advice(); do_advice(); do_advice(); クラス再定義 Mar 12-14, 2003 SPA 2003, Hakone
22
動的クラス書き換え(我々が開発1) 2. Dynamic AOPとその実装 Mar 12-14, 2003 SPA 2003, Hakone
do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); Mar 12-14, 2003 SPA 2003, Hakone
23
ジャストインタイム・フック埋め込み(我々が開発2)
情報処理学会プログラミング研究会 発表資料 2003年1月23日 ジャストインタイム・フック埋め込み(我々が開発2) 2段階のフック挿入 デバッガによるフックと動的クラス書き換えをハイブリッド フック挿入に準備がいらない 高速にフックを挿入 デバッガによるフック アドバイス実行時間 1 switch バイトコード変換でフックを挿入し、クラスを再ロード 頻繁にデバッガへスイッチするなら、フックを埋め込んでしまう 『効率的なDAOPシステムを実現するために、ジャストインタイム・フック埋め込み技術を提案する』 2 動的クラス書き換え フック埋め込み時間 Mar 12-14, 2003 SPA 2003, Hakone
24
ジャストインタイム・フック埋め込み(我々が開発2)
do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); do_advice(); Mar 12-14, 2003 SPA 2003, Hakone
25
アスペクト処理系 Wool 3. Wool ジャストインタイム・フック埋め込みをPure Javaで実装 実行途中のメソッドにもフック挿入
ActiveFrameで参照されるクラスへもフック挿入 フックを挿入するか否かも選択 Javaでアスペクトを記述 ポイントカットの動的な変更 アドバイスの動的な追加・変更・削除 性能劣化の60~70%がコード変換・再ロード処理 Mar 12-14, 2003 SPA 2003, Hakone
26
今後のDAOPの展望 4.おわりに ポストDLL 開発時にリンクポイントを用意しなくて良い オートノミックコンピューティング
アプリケーションコードの見せ方 フックポイントの制限(セキュリティ) オートノミックコンピューティング あらゆる場所へ改変箇所が浸透 実行時にアスペクトの自動抽出・自動分離 フックの高速化・コードの高質化の両立(Wool) Mar 12-14, 2003 SPA 2003, Hakone
Similar presentations
© 2024 slidesplayer.net Inc.
All rights reserved.