動的依存情報に基づく アスペクト間の関係抽出 石尾 隆 大阪大学大学院情報科学研究科 [email protected] Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University アスペクト指向プログラミングの利点 アスペクトは システムの振る舞いを外から変更する 既存のモジュール(クラス)の枠をこえて作用する オブジェクトに色々貼り付けて機能を拡張できる クラス階層とは直接関係ない機能: 永続化,シングルトン,ロギング,アクセス管理, トランザクションのサポートなど Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University アスペクト指向の複雑さ 理想: アスペクト同士は相互に独立 ユーザは,適当にいくつか選んで貼り付けるだけ 現実:アスペクトを複数貼り付けた結果は不明瞭 追加されたアスペクトが新しくイベントを発生させる 既にあるアスペクトがそのイベントに対しても動作する可能性がある あるアスペクトが別のアスペクトの動作を阻害する アスペクトが連鎖していって無限ループに陥る あるアスペクトが勝手にデータを書き換えてしまう Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University アスペクトの管理 アスペクトがどう動くか良く分からないのは不安 アスペクト間の関係を明示的に管理すればどうか? 何か設定ファイルのようなもので一元管理すると: 保守性,理解容易性は向上するはず しかし: アスペクトの便利さが失われる 何も書かなくて動くのが一番いい 管理情報を誰が,いつ,どのように書くのか? 誰: 個々のアスペクトの開発者?アスペクトのユーザ? いつ: アスペクトが「干渉しそう」と判断できたとき? Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University アスペクト間の関係の抽出 アスペクト間の関係を明示的に書くのはつらい しかし「どんな関係にあるか」という情報はほしい プログラムから,現在のアスペクト間の関係を抽出する Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University アスペクト間の関係 アスペクト A, B について ある特定のイベント(join point)に対して A が動いた後に Bが動く(順序関係) A が動くときは必ず B も動く (制御依存関係) A が動くときは必ず B は動かない A が動かないときは必ず B も動かない A が動かないときは必ず B が動く プログラムの実行経過にしたがって A が作成したデータを B が使う(データ依存) A が作成したデータを B が書き換える Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 関係が分かることにより期待される効果 問題が起きていないかどうかの診断 関係ないアスペクトの間に関連が生じていないか確認 狙った相互関係,優先度が反映されているか確認 他のアスペクトに影響を与えるアスペクトの調査 テスト,保守作業時に注意すべき存在の把握 新しく導入したアスペクトの影響の調査 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University どうやって関係を抽出するか 動的な依存情報解析 実行履歴情報から,依存関係を見つけてくる メソッド呼び出し関係 アドバイスの実行関係 データの授受関係 依存関係の中から候補を絞る アスペクト間で起こっている依存関係パスを見つける そのパスの出現頻度などの特徴を調べる – あるアスペクトに到達するパスがユニークか,複数あるのか Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University なぜ動的アプローチか? 静的な情報解析と何が違うか: ソースコードからの検出は正確性が下がりがち 動的 pointcut,実行時ウィービングなど動的な要素が多い 「関連するかもしれない」関係の候補は大量に生成されうる 動いているものに対する診断 「実際に起こった関連」だけが抽出できる 注目したいテストケースだけを個別に調査できる ただし,関係を「証明」するわけではない Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 予備実験 実際にどの程度実行履歴から情報が抽出できるか AspectJ のプログラムを対象に実験: アスペクトのメンバー間の呼び出し関係 アスペクトの動作順序関係 用意したもの AspectJ のプログラム1個とテストケース メソッド呼び出し関係の抽出ツール JVMDI (Debugger Interface) を用いて構築したもの Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 用意したプログラム グラフ構造を Depth-First で訪問するプログラム ノードが “+”, “*” の演算,数値を表現 グラフ全体で1つの式を表現 グラフ構築 → ノードの訪問処理 → 最終結果の出力 アスペクト4つがノード訪問に関連付けられている LoopDetect: グラフ内部のループ検出 Print: 訪問した頂点の情報を出力 Caching: 一度訪問した頂点への再訪問を省略 Cleanup: 計算が終わったノードから解放していく Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 実施した作業 典型的なデータ構造を1個作成して実行 メソッド呼び出し列を得る 得られた実行履歴から,呼び出し関係を分析 AspectJ 生成コードの特徴を利用してアドバイス呼び出しを抽出 取得した関係: 「あるアスペクトAが呼び出された直後に 次のアスペクトBへの呼び出しが起きる」 「あるアスペクトAから他のアスペクトBへの呼び出しが起きる」 到達までに他のメソッドを経由しても OK B への A から以外の経路があるかどうかも調べる Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 実験結果 アドバイスごとの関係をアスペクト単位でまとめた結果 Caching が他のアスペクトに強く影響を与えている Print, Cleanup は Caching からのみ呼ばれる Caching 呼び出し関係 外からの呼び出し 前後関係 Cleanup LoopDetect Print Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 得られた情報の評価 アスペクトの動作として Caching が支配的 Print アスペクトは必ず Caching アスペクトの下で動く Caching が計算を飛ばすと Print 処理が飛ばされたりもする Cleanup アスペクトも Caching アスペクトの下で動く Cleanup は Caching の存在を前提にしているので OK LoopDetect と Caching が絡みあっているように見える LoopDetect は,ループ検出のために訪問ノードを管理している Caching の直前にループチェック,スタックへノードを載せる Caching の処理が終わるとスタックからノードを除去する Caching が,値のキャッシュを返すか,データ計算をする データ計算でノード訪問が発生するため LoopDetect が呼ばれる データ計算の再帰呼び出し構造をきちんと捉えれば,関係を整理できる? Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University まとめ 実行時情報から,アスペクト間の関係を抽出 今の時点では呼び出し関係と,呼び出しの順序関係 アスペクトの動作関係を検知できている ただし,再帰呼び出しなどが原因で,結果がやや複雑になる 解析手法,可視化方法の拡張 データ依存関係の捕捉 同じ join point からのアスペクト起動の明示 再帰呼び出し構造も明示する Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 補足資料 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University アドバイスは実行履歴上でどう見える? ajc$before: ajc$after: aroundBody: before アドバイスに対応 after アドバイスに対応 around アドバイスに対応. コードはクラス内のメソッドとして見える. 直前に必ず around を実装した アスペクトの aspectOf が呼ばれる. aspectOf: clinit, init: アスペクトのインスタンス参照 アスペクトのロード,インスタンス初期化時 (アスペクトが最初に実行されるとき) フィールドの初期化時 interFieldInit: Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 関連研究: アスペクトの干渉 干渉とは何か? 複数のアスペクトが同じ Join Point で動くこと[1] around アドバイス(proceed を使わないものなど)は問 題の引き金となりやすい データを書き換える(副作用を持った)アスペクトは干渉を 起こさないが問題となる データベースの中身を暗号化するアスペクトなど [1] Douence, R. et al.: Detection and Resolution of Aspect Interaction. RR-4435, INRIA, 2002. Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 関連研究: アスペクトの明示的な管理 アスペクト間の合成方法を明示的に開発者が指示 する方法の提案[2] 同一時点で動作するアスペクトが複数あるとき, どのアスペクトがどのアスペクトより先,後という制約を 記述していくことで順序を確定する [2] Nagy, I. et al.: Declarative Aspect Composition. SPLAT Workshop held in conjunction with AOSD2004. Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 関連研究: 実行履歴の解析 実行トレースからの機能の実装位置特定[3] 関数 f が様々な実行履歴に,共通して登場するか単独でしか登 場しないか,といった特性によって関数を分類し,システム内での役 割を推測する 実行履歴からのアスペクト抽出[4] メソッド呼び出し関係の履歴から規則を発見 使っているのはメソッド呼び出しの順序関係だけ [3] Eisenbarth, T. et al.: Locating Features In Source Code. IEEE Transactions on Software Engineering, Vol.29, No.3, pp.210-224, 2003. [4] Silvia Breu et al.: Aspect Mining Using Event Traces. ASE2004, to appear. Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 既存ツールと比べると? AJDT のようなマーカー表示は便利,ただし 順序関係の情報は出せない 直接見えない join point までは効果は及ばない メソッド呼び出し文からは,“execution” join point は見えない デバッガのステップ実行は非常に強力 スタックトレース情報があれば呼び出し関係は分かる しかし,途中経過まで調べるのは難しい ステップ実行だけで処理を進めていくのは非現実的 データ依存関係など,ステップ実行だけでは捕らえにくい Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
© Copyright 2025 ExpyDoc