動的依存情報に基づく アスペクト間の関係抽出

Slides:



Advertisements
Similar presentations
Web アプリをユーザー毎に カスタマイズ可能にする AOP フレームワーク
Advertisements

シーケンス図の生成のための実行履歴圧縮手法
背景 ソフトウェアの大規模化・複雑化 生産性と品質の向上 ↓ オブジェクト指向分析設計の適用 開発ツールの投入.
区間グラフにおける区間表現からMPQ-treeを効率よく構成するアルゴリズム
XHTML構文検証手法における スクリプト要素の静的解析アルゴリズム
情報伝播によるオブジェクト指向プログラム理解支援の提案
Object Group ANalizer Graduate School of Information Science and Technology, Osaka University OGAN visualizes representative interactions between a pair.
プログラムの動作を理解するための技術として
AspectScope によるアスペクトとクラスのつながりの視覚化
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
メソッド名とその周辺の識別子の 相関ルールに基づくメソッド名変更支援手法
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
アスペクト指向プログラミングを用いたIDSオフロード
Java ソフトウェア部品検索システム SPARS-J のための リポジトリ自動更新機能の実現
アスペクト指向プログラムに対する プログラムスライシング
プログラム実行履歴を用いたトランザクションファンクション抽出手法
プログラム実行時情報を用いたトランザクションファンクション抽出手法
ソースコードの変更履歴における メトリクス値の変化を用いた ソフトウェアの特性分析
コードクローンに含まれるメソッド呼び出しの 変更度合の調査
プログラムスライスを用いた アスペクト指向プログラムのデバッグ支援環境
暗黙的に型付けされる構造体の Java言語への導入
{t-isio, kamiya, kusumoto,
動的依存グラフの3-gramを用いた 実行トレースの比較手法
オブジェクト指向プログラムにおける エイリアス解析手法の提案と実現
動的情報を利用したソフトウェア 部品評価手法
シーケンス図を用いて実行履歴を可視化するデバッグ環境の試作
動的スライスを用いたバグ修正前後の実行系列の差分検出手法
プログラムスライスを用いた アスペクト指向プログラムのデバッグ支援環境
実行時情報に基づく OSカーネルのコンフィグ最小化
Javaプログラムの変更を支援する 影響波及解析システム
リファクタリング支援のための コードクローンに含まれる識別子の対応関係分析
プログラム動作理解支援を目的とした オブジェクトの振舞いの同値分割手法
横断的関心事に対応したオブジェクト指向言語GluonJとその織り込み関係の可視化ツール
コードクローンの動作を比較するためのコードクローン周辺コードの解析
ソースコード縮退による ソースコード理解 神谷年洋 科学技術振興事業団 さきがけ研究21 オブジェクト指向シンポジウム2003.
UMLモデルを対象とした リファクタリング候補検出の試み
コードクローン検出に基づくデザイン パターン適用支援手法の提案と実現
アスペクト指向言語のための 独立性の高いパッケージシステム
pointcut に関して高い記述力を持つ アスペクト指向言語 Josh
コンパイラ 2011年10月20日
Javaバーチャルマシンを利用した 動的依存関係解析手法の提案
コーディングパターンの あいまい検索の提案と実装
JAVAバイトコードにおける データ依存解析手法の提案と実装
インスタンスの型を考慮したJavaプログラムの実行経路の列挙手法の提案
オブジェクトの協調動作を用いた オブジェクト指向プログラム実行履歴分割手法
類似した振舞いのオブジェクトの グループ化による クラス動作シナリオの可視化
Josh : バイトコードレベルでのJava用 Aspect Weaver
統合開発環境によって表現された 言語機構によるコードのモジュール化
同期処理のモジュール化を 可能にする アスペクト指向言語
プログラムスライスを用いた凝集度メトリクスに基づく 類似メソッド集約候補の順位付け手法
保守請負時を対象とした 労力見積のためのメトリクスの提案
オブジェクトの動的支配関係解析を 用いたシーケンス図の縮約
オブジェクトの動的支配関係解析を用いた シーケンス図の縮約手法の提案
オープンソースソフトウェアに対する コーディングパターン分析の適用
メソッドの同時更新履歴を用いたクラスの機能別分類法
開発者との対話を活かした 横断的構造の表現
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
プログラムの一時停止時に 将来の実行情報を提供するデバッガ
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
コードクローン解析に基づく デザインパターン適用候補の検出手法
回帰テストにおける実行系列の差分の効率的な検出手法
木構造の比較に基づく メソッド呼び出し履歴の変化の可視化手法
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
プログラム理解のための 付加注釈 DocumentTag の提案
GluonJ を用いたビジネスロジックからのデータベースアクセスの分離
情報処理Ⅱ 小テスト 2005年2月1日(火).
オブジェクト生成の観測に基づく プログラム実行の要約の抽出
Josh : バイトコードレベルでのJava用 Aspect Weaver
Presentation transcript:

動的依存情報に基づく アスペクト間の関係抽出 石尾 隆 大阪大学大学院情報科学研究科 t-isio@ist.osaka-u.ac.jp

アスペクト指向プログラミングの利点 アスペクトは システムの振る舞いを外から変更する 既存のモジュール(クラス)の枠をこえて作用する オブジェクトに色々貼り付けて機能を拡張できる クラス階層とは直接関係ない機能: 永続化,シングルトン,ロギング,アクセス管理, トランザクションのサポートなど

アスペクト指向の複雑さ 理想: アスペクト同士は相互に独立 現実:アスペクトを複数貼り付けた結果は不明瞭 ユーザは,適当にいくつか選んで貼り付けるだけ 現実:アスペクトを複数貼り付けた結果は不明瞭 追加されたアスペクトが新しくイベントを発生させる 既にあるアスペクトがそのイベントに対しても動作する可能性がある あるアスペクトが別のアスペクトの動作を阻害する アスペクトが連鎖していって無限ループに陥る あるアスペクトが勝手にデータを書き換えてしまう

アスペクトの管理 アスペクトがどう動くか良く分からないのは不安 アスペクト間の関係を明示的に管理すればどうか? 何か設定ファイルのようなもので一元管理すると: 保守性,理解容易性は向上するはず しかし: アスペクトの便利さが失われる 何も書かなくて動くのが一番いい 管理情報を誰が,いつ,どのように書くのか? 誰: 個々のアスペクトの開発者?アスペクトのユーザ? いつ: アスペクトが「干渉しそう」と判断できたとき?

アスペクト間の関係の抽出 アスペクト間の関係を明示的に書くのはつらい しかし「どんな関係にあるか」という情報はほしい プログラムから,現在のアスペクト間の関係を抽出する

アスペクト間の関係 アスペクト A, B について ある特定のイベント(join point)に対して プログラムの実行経過にしたがって

関係が分かることにより期待される効果 問題が起きていないかどうかの診断 他のアスペクトに影響を与えるアスペクトの調査 関係ないアスペクトの間に関連が生じていないか確認 狙った相互関係,優先度が反映されているか確認 他のアスペクトに影響を与えるアスペクトの調査 テスト,保守作業時に注意すべき存在の把握 新しく導入したアスペクトの影響の調査

どうやって関係を抽出するか 動的な依存情報解析 実行履歴情報から,依存関係を見つけてくる 依存関係の中から候補を絞る メソッド呼び出し関係 アドバイスの実行関係 データの授受関係 依存関係の中から候補を絞る アスペクト間で起こっている依存関係パスを見つける そのパスの出現頻度などの特徴を調べる あるアスペクトに到達するパスがユニークか,複数あるのか

なぜ動的アプローチか? 静的な情報解析と何が違うか: 動いているものに対する診断 ソースコードからの検出は正確性が下がりがち 動的 pointcut,実行時ウィービングなど動的な要素が多い 「関連するかもしれない」関係の候補は大量に生成されうる 動いているものに対する診断 「実際に起こった関連」だけが抽出できる 注目したいテストケースだけを個別に調査できる ただし,関係を「証明」するわけではない

予備実験 実際にどの程度実行履歴から情報が抽出できるか AspectJ のプログラムを対象に実験: 用意したもの アスペクトのメンバー間の呼び出し関係 アスペクトの動作順序関係 用意したもの AspectJ のプログラム1個とテストケース メソッド呼び出し関係の抽出ツール JVMDI (Debugger Interface) を用いて構築したもの

用意したプログラム グラフ構造を Depth-First で訪問するプログラム アスペクト4つがノード訪問に関連付けられている ノードが “+”, “*” の演算,数値を表現 グラフ全体で1つの式を表現 グラフ構築 → ノードの訪問処理 → 最終結果の出力 アスペクト4つがノード訪問に関連付けられている LoopDetect: グラフ内部のループ検出 Print: 訪問した頂点の情報を出力 Caching: 一度訪問した頂点への再訪問を省略 Cleanup: 計算が終わったノードから解放していく

実施した作業 典型的なデータ構造を1個作成して実行  メソッド呼び出し列を得る 得られた実行履歴から,呼び出し関係を分析 取得した関係: AspectJ 生成コードの特徴を利用してアドバイス呼び出しを抽出 取得した関係: 「あるアスペクトAが呼び出された直後に 次のアスペクトBへの呼び出しが起きる」 「あるアスペクトAから他のアスペクトBへの呼び出しが起きる」 到達までに他のメソッドを経由しても OK B への A から以外の経路があるかどうかも調べる

実験結果 アドバイスごとの関係をアスペクト単位でまとめた結果 Caching が他のアスペクトに強く影響を与えている Print, Cleanup は Caching からのみ呼ばれる 呼び出し関係 外からの呼び出し Caching 前後関係 Cleanup LoopDetect Print

得られた情報の評価 アスペクトの動作として Caching が支配的 LoopDetect と Caching が絡みあっているように見える Print アスペクトは必ず Caching アスペクトの下で動く Caching が計算を飛ばすと Print 処理が飛ばされたりもする Cleanup アスペクトも Caching アスペクトの下で動く Cleanup は Caching の存在を前提にしているので OK LoopDetect と Caching が絡みあっているように見える LoopDetect は,ループ検出のために訪問ノードを管理している Caching の直前にループチェック,スタックへノードを載せる Caching の処理が終わるとスタックからノードを除去する Caching が,値のキャッシュを返すか,データ計算をする データ計算でノード訪問が発生するため LoopDetect が呼ばれる データ計算の再帰呼び出し構造をきちんと捉えれば,関係を整理できる?

まとめ 実行時情報から,アスペクト間の関係を抽出 解析手法,可視化方法の拡張 今の時点では呼び出し関係と,呼び出しの順序関係 アスペクトの動作関係を検知できている ただし,再帰呼び出しなどが原因で,結果がやや複雑になる 解析手法,可視化方法の拡張 データ依存関係の捕捉 同じ join point からのアスペクト起動の明示 再帰呼び出し構造も明示する

補足資料

アドバイスは実行履歴上でどう見える? ajc$before: before アドバイスに対応 ajc$after: after アドバイスに対応 aroundBody: around アドバイスに対応. コードはクラス内のメソッドとして見える. 直前に必ず around を実装した アスペクトの aspectOf が呼ばれる. aspectOf: アスペクトのインスタンス参照 clinit, init: アスペクトのロード,インスタンス初期化時 (アスペクトが最初に実行されるとき) interFieldInit: フィールドの初期化時

関連研究: アスペクトの干渉 干渉とは何か? 複数のアスペクトが同じ Join Point で動くこと[1] around アドバイス(proceed を使わないものなど)は問題の引き金となりやすい データを書き換える(副作用を持った)アスペクトは干渉を起こさないが問題となる データベースの中身を暗号化するアスペクトなど [1] Douence, R. et al.: Detection and Resolution of Aspect Interaction. RR-4435, INRIA, 2002.

関連研究: アスペクトの明示的な管理 アスペクト間の合成方法を明示的に開発者が指示する方法の提案[2] 同一時点で動作するアスペクトが複数あるとき, どのアスペクトがどのアスペクトより先,後という制約を  記述していくことで順序を確定する [2] Nagy, I. et al.: Declarative Aspect Composition. SPLAT Workshop held in conjunction with AOSD2004.

関連研究: 実行履歴の解析 実行トレースからの機能の実装位置特定[3] 実行履歴からのアスペクト抽出[4] 関数 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.

既存ツールと比べると? AJDT のようなマーカー表示は便利,ただし デバッガのステップ実行は非常に強力 順序関係の情報は出せない 直接見えない join point までは効果は及ばない メソッド呼び出し文からは,“execution” join point は見えない デバッガのステップ実行は非常に強力 スタックトレース情報があれば呼び出し関係は分かる しかし,途中経過まで調べるのは難しい ステップ実行だけで処理を進めていくのは非現実的 データ依存関係など,ステップ実行だけでは捕らえにくい