310 likes | 491 Views
プログラムスライスを用いた アスペクト指向プログラムのデバッグ支援環境. 石尾 隆 井上研究室 博士前期課程2年 t-isio@ics.es.osaka-u.ac.jp. 発表の概 要. アスペクト指向プログラミング オブジェクト指向プログラミング アスペクト指向の特徴 アスペクト指向の問題点 アスペクト指向プログラムの開発支援 アスペクト干渉の検出 プログラムスライシングの適用 ツールの実装と評価 今後の課題. オ ブジェクト指向モデル. システムの機能を オブジェクトが分担して担当 横断要素 : 複数のオブジェクトが関わる機能
E N D
プログラムスライスを用いたアスペクト指向プログラムのデバッグ支援環境プログラムスライスを用いたアスペクト指向プログラムのデバッグ支援環境 石尾 隆 井上研究室 博士前期課程2年 t-isio@ics.es.osaka-u.ac.jp
発表の概要 • アスペクト指向プログラミング • オブジェクト指向プログラミング • アスペクト指向の特徴 • アスペクト指向の問題点 • アスペクト指向プログラムの開発支援 • アスペクト干渉の検出 • プログラムスライシングの適用 • ツールの実装と評価 • 今後の課題
オブジェクト指向モデル • システムの機能をオブジェクトが分担して担当 • 横断要素: 複数のオブジェクトが関わる機能 • コードが分散,一貫性の維持が困難 →保守性の悪化 エラーが起きたらGUIに通知 GUIはユーザの入力に従って Databaseを制御 例:学生の成績管理システム GUI Student 学生情報を要求 情報の保存・取得 Database 履修情報 統計情報を要求 Statistics 情報の保存・取得 Course
アスペクト指向モデル • アスペクト: 横断要素のモジュール化 • アスペクト= (動作時点, 処理) の集合で定義 • 動作時点は,メッセージ送受信や例外の発生など • 明示的な呼び出しが不要 Error Notification Aspect 「エラーが起きたら動作」 ユーザへの通知 ユーザ からの 指示 監視 GUI Student Database Statistics Course
アスペクト指向の利点と問題点 • 利点:モジュール性の向上 • 保守性の向上 • 横断要素がアスペクトにまとまっているので,変更が容易 • 再利用性の向上 • モジュール間の相互依存性の解消 • 横断要素とオブジェクトの独立した再利用 • 問題点:プログラムの複雑化 • オブジェクトを見ただけでは動作がわからない • アスペクトの干渉 • アスペクトの動作順序で実行結果が変わる • アスペクトの動作中に別のアスペクトが動作する
本研究の目的 • アスペクトを組み込んだプログラムに対する依存関係解析結果を用いた開発支援手法を提案する. • アスペクト干渉の検出 • アスペクトを組み込む時点での支援 • プログラムスライスの抽出 • アスペクトを組み込んだ後のデバッグ支援 • 対象: AspectJ
アスペクト干渉の検出 • Aspect を含めた Call Graph の利用 • 頂点:クラス,アスペクトに含まれるメソッド(手続き)単位 • 辺:メソッドの呼び出し,アスペクトの呼び出し (呼び出し関係はソースコードから解析) • ある時点でアスペクトが作動する=アスペクトを呼び出している • 「Call Graphでアスペクトの頂点に到達可能」ならば「アスペクトの影響を受ける」
無限ループ Call Graph 例 凡例 Aspect Class call
プログラムスライシングの適用 • プログラムスライシングとは • プログラム解析手法のひとつ • 開発者が注目する必要があるコードのみを抽出し,提示する技術 • 元々は手続き的プログラム用に開発され,オブジェクト指向プログラムに対して拡張されている • 依存関係が複雑になるアスペクト指向プログラムに対して有効性が期待される
プログラムスライスの定義 • プログラムのある文sのある変数v(スライス基点<s,v>)の値に“影響”を与えうる文の集合 • 影響 = 代入-参照 関係, if 文など制御関係 • プログラム文を頂点,依存関係を辺としたグラフ探索 • プログラマが扱う必要があるコードを提示 • デバッグ作業の効率化 1: a = 5; 2: b = a + a; 3: if (b > 0) { 4: c = a; 5: } 6: d = b; a 1: a = 5; 2: b = a + a; 3: if (b > 0) { 4: c = a; 5: } 6: d = b; a 基点< 6, b > b 制御 b
スライス計算に必要な情報 • データ依存関係 • ローカル変数の 代入 → 参照 • フィールド(メンバ変数)の 代入 → 参照 • 制御依存関係 • 実行制御文の条件節 → 制御される文 • メソッド呼び出し文 → 呼び出されるメソッドの文 • アスペクトが連動する位置 → 動作するアスペクト • 目的をデバッグに限定 • 実行が失敗するテストケースが特定されている状態を想定 • 動的(実行時)情報が利用可能 • オブジェクトの区別,動的束縛の解決によってコード量を減らす
動的情報収集の実装 • アスペクトとして動的解析処理を記述する • 1つのモジュールにカプセル化可能 • 可読性・保守性の向上 • 実現および実行時コストの軽減 • 実用上十分な情報が収集可能 Java を対象とした場合は十分に有効† → AspectJ で書かれたプログラム用に拡張 • † 石尾隆, 楠本真二, 井上克郎: “アスペクト指向プログラミングの動的スライス計算への応用", 2002年電子情報通信学会総合大会講演論文集,D-3-4,p.30 (2002).
スライスツールの実装 • 統合開発環境 Eclipse への統合 • プラグイン形式で機能を追加できる • 開発者がエディタ上でそのまま利用できる • コンパイル時にソースコード情報を収集 • 静的依存情報の収集 • Call Graphの作成,無限ループ等の指摘 • 実行時情報が存在すれば読み込んで利用 • 動的解析モジュールを付加して実行しておく必要あり • 実行時情報がなければ静的情報だけでスライス計算
3. スライス計算実行を指示 2. スライス基点をエディタ上で選択 4. スライス結果を エディタ上に出力 プロトタイプのスクリーンショット • コンパイル時に静的情報収集
適用実験 • 適用対象 • AspectJ サンプルコード 5種類 • プログラムの実行時情報解析アスペクト • 実験内容 • サンプルコードを実行し,その結果に対してプログラムスライスを計算 • 従来のツールを用いた依存関係の追跡との定性的比較 • AJDE: どこでアスペクトが動作するかをマーカーで表示する • 各サンプルコードのサイズは平均500行
評価 • プログラムスライシングの有用性 • アスペクトが増えた分,考慮すべき依存関係は増加 • ファイルをまたいだ依存関係:手作業の追跡はコスト大 • 「依存関係がなくなる」コードの発見が可能 • アスペクトの動作によって,実行されなくなるような文が発見できる
実際のスライス結果 void foo() { x = bar(); : } int bar() { return doSomething(); } int baz() { return doSomething2(); } aspect redirectMethodCall { int around(): call(bar) { return baz(); } } 「依存関係がなくなる」コードの例 void foo() { x = bar(); : } int bar() { return doSomething(); } int baz() { return doSomething2(); } aspect redirectMethodCall { int around(): call(bar) { return baz(); } } 開発者が意識する依存関係 メソッド呼び出しを 置き換えるアスペクト
計算コスト • 時間コスト • 静的情報の収集=コンパイラが構築した意味解析木に対する1パス処理 • 動的情報の収集=実行するプログラムに依存,過去の実験では通常の実行に比べて最大で10倍程度 • 空間コスト • アスペクトの種類によってコストに大きな差 • 多数のクラスを横断して動作するアスペクトは,メモリ消費量が非常に大きい • 約10000行のコードに,実行時情報解析アスペクト(1000行)を追加した結果,必要メモリが20MBから500MB以上に増加
まとめ • アスペクト指向プログラミングの特徴 • 横断要素のモジュール化 • 保守性,再利用性の向上 • ソースコードの見た目と動作とのギャップが拡大 • Call Graphを用いた干渉の検出 • アスペクトの動作を,メソッド呼び出しと等価とみなす • ループ等,実行を不可能にするような重大な干渉の提示 • プログラムスライシングの適用 • 従来手法に,「アスペクト呼び出し」を追加 • 静的情報,実行時情報を組み合わせた開発者の支援 • アスペクトによる振る舞いの変化を示す • 今後の課題 • 多数のオブジェクトを横断するアスペクトの効率的な扱い
オブジェクトの横断要素 • 横断要素=複数のオブジェクトに要求される特性 • 例:「データベースでエラーが起こったらユーザの指示を仰ぎたい」 • 例:「デバッグ用に,オブジェクトに送られたメッセージを記録したい」 • 処理が複数のオブジェクトに分散する → 分散したコードの一貫性の維持が困難 • 変更すべき場所を変更し忘れる • 変更すべきでない場所まで一緒に変更してしまう • 書かれたコードを後で見て,どこまでがその処理に関連するか分からない 横断要素をモジュール化する単位「アスペクト」の導入
利用例:プログラムの実行時情報収集† • オブジェクト指向プログラムの実行経過を観測する • メソッドの呼び出し関係 • データの依存関係(代入-参照) • 抽出した情報の主な用途 • デバッグ支援 • ソフトウェアの定量的評価(複雑さ,品質等)
その他のアスペクトの利用例 • アスペクトによるトランザクションの実現† • 種々のトランザクションメカニズムを利用したトランザクションのモジュール化 • GoF デザインパターンのアスペクトによる書き換え‡ • デザインパターン=オブジェクトの「連携のやりかた」のパターン • 設計レベルでの再利用,使うときは個別のコードを書く • パターンに関連するオブジェクトにコードは分散する • いくつかのパターンは,単独のアスペクトに簡潔に記述することができる • アスペクトとして再利用可能なコードになったパターンも存在 † S. Soares, E. Laureano, P. Borba: `Implementing Distribution and Persistence Aspects with AspectJ'', OOPSLA 2002 ‡ J. Hannemann, G. Kiczales: ”Design Pattern Implementation in Java and AspectJ'‘, OOPSLA 2002
情報収集の従来の実現方法 「監視」処理は対象ソフトウェア全体に影響する 単純な実装:対象ソフトウェアの各所でログを生成する → アスペクトでモジュール化するべき Java を対象とした場合のその他の実現方法 • Java Virtual Machine (JVM)の改造 移植性がない,実現に必要なコストが高い • JVMの持つ Profiler Interface の利用 実行時のコストが高い,バイトコード最適化で結果が変わる • プリプロセッサによるソースコード変換 構文木の変換ルールが複雑,保守性が低い
アスペクトによる実装の利点 アスペクトとして動的解析処理を記述 • 1つのモジュールにカプセル化可能 • 可読性・保守性の向上 • 実現および実行時に要するコストの軽減 • 実用上十分な情報が収集可能 成果については論文投稿中† • †: 石尾 隆,楠本 真二,井上 克郎: アスペクト指向プログラミングの • 動的プログラムスライスへの応用,情報処理学会論文誌,投稿中
アスペクト指向の「複雑さ」 • アスペクトは便利だが…… • オブジェクトを見ただけでは動作がわからない • 単純な代入文でさえも,アスペクトが連動していることがある • アスペクトが,予想外の場面で作動してしまう可能性がある • アスペクトの干渉 • アスペクトの動作順序で実行結果が変わる • アスペクトの動作中に別のアスペクトが動作する ツールによるサポートが重要! • アスペクトの表示 • デバッグ支援
アスペクト干渉とは • アスペクトが他のアスペクトに影響を与える • 単体では正しいアスペクトでも,正しい動作が阻害されることがある 以下は無限ループの例 Client Object Disk I/O Object ディスク I/O を ネットワーク I/O にマップする アスペクト Network I/O Object ディスク I/O 以外の呼び出しを ディスクに記録するアスペクト
アスペクト干渉に対する方針 • アスペクトの干渉は必要な場合もある • ディスク I/O を置き換えるアスペクトなど • コンパイル時に干渉可能性を検出してユーザに通知,実行するかどうかはユーザの選択
スライス結果 スライス 計算 AspectJ Compiler 通常の JVM 依存関係情報 アスペクト結合済み クラスファイル 通常の実行結果 スライスツールの動作概要 スライス対象 ソースコード (含アスペクト) 依存関係解析 アスペクト
情報収集: 動的 or 静的 • 目的をデバッグに限定 • 実行が失敗するテストケースが特定されている状態を想定 • 動的(実行時)情報 が利用可能 • オブジェクトの区別,動的束縛の解決によってコード量を減らす • データ依存関係 • フィールド(メンバ変数)の 代入 → 参照 関係 • ローカル変数の 代入 → 参照 関係 • 制御依存関係 • 実行制御文の条件節 → 制御される文 • メソッド呼び出し文 → 呼び出されるメソッドの文 • アスペクトが連動するメッセージ → 動作するアスペクト
関連研究 • AspectJ† IDE for JBuilder, Forte, Emacs • ソースコードエディタで,オブジェクトのコード上にアスペクトの連動位置を表示する • アスペクト干渉の検出は行わない • アスペクト指向プログラムに対するプログラムスライス計算の提案‡ • 提案だけ,有効性については評価されていない †: AspectJ Official Site: http://www.eclipse.org/aspectj/ ‡: Jianjun Zhao, “Slicing Aspect-Oriented Software”, In Proc. of the 10th IEEE International Workshop on Programming Comprehension, pp.251--260, 2002