アスペクト指向プログラミングの 動的プログラムスライスへの応用 石尾 隆, 楠本 真二, 井上 克郎 大阪大学大学院基礎工学研究科 研究の背景 ソフトウェアの大規模化 フォールト特定、修正のコスト増大 テストケースからのフォールト特定 扱うコード量が多いと効率が悪くなる 実際に動くコードは、全体のごく一部 関係のないコードを自動的に除外して 迅速なフォールト特定を行いたい 2 プログラムスライス プログラム中のある文sのある変数v (スラ イス基点)の値に影響を与えうる文の集合 1: 2: 3: 4: 5: 6: a = 5; b = a + a; if (b > 0) { c = a; } d = b; スライス基点(6, b)に 対するスライス 1: 2: 3: 4: 5: 6: a = 5; b = a + a; if (b > 0) { c = a; } d = b; デバッグ対象が限定され、フォールト位置 特定を効率よく行うことができる 3 DC(Dependence Cache)スライス データ依存関係 1.依存関係解析 動的データ依存関係 静的制御依存関係 2.プログラム依存グラフ(PDG)構築 節点:各プログラム文 有向辺:文間の依存関係 3.グラフ探索 スライス基点に対応する節点から 有向辺を逆向きに探索 10: a = 1; 11: c = 4; 12: b = a; a 制御依存関係 20: if (a < 1) { 21: b = a; 22: } プログラム依存グラフ (PDG) Y.Ashida, F.Ohata and K.Inoue: “Slicing Methods Using Static and Dynamic Information”, Proceedings of the 6th Asia Pacific Software Engineering Conference , pp.344-350, Takamatsu, Japan, December (1999). † 4 既存の手法 Java Virtual Machine (JVM)の改造† 細粒度でのスライスが可能 特定のJVMの実装、バージョンに依存する プログラムがそのバージョンのJVMで動くかどうかの 検証は困難 コンパイラによる最適化を抑止する必要あり → ソースコード側に依存関係解析処理を追加する † 誉田謙二, 大畑文明, 井上克郎: Javaバーチャルマシンを利用した動的依 存関係解析手法の提案, SIGSS-2002 Jan 5 アスペクト指向プログラミング 複数のクラスを横断する要素をモジュール「アス ペクト」として記述するプログラミング手法 ある特定の目的に関する処理が、複数のクラスに分 散することを避ける ソースコード上では、ひとつの単位にまとめて記述 コンパイル時、実行時にクラスに結合する AspectJ: Java 用アスペクト記述・処理系 http://aspectj.org/ 6 アスペクトの例 クラスによる実現 HTTP Request HTTP Session HTTP Response Session Managing Code Session Managing Code Session Managing Code AspectJ HTTP Request アスペクトをクラスに結合する (Aspect Weaving) HTTP Session HTTP Response アスペクトによる実現 Session Managing Aspect 7 アスペクトの記述 アスペクト = 結合の基準 + 結合するコード 主要な結合の基準 結合するコードの特徴 メソッド呼び出し、メソッド実行 フィールド代入、参照 メソッド、フィールドの属するクラスに関する条件 通常の Java で記述される 実際の結合位置に関する情報へアクセスできる 動的データ依存関係解析アスペクト フィールドへの代入: 代入のソースコード内での位置を記録 フィールドの参照: そのフィールドへの最後の代入位置を取得し、 動的依存関係を記録 8 アスペクトによる実現の特徴 利点 高い抽象度で、結合ルールを明快に記述できる データ依存関係解析処理をカプセル化できる 特定のJavaのバージョンに依存しない コンパイラによる最適化の影響を受けない AspectJ における制限 ローカル変数に対してはアスペクトを結合できない →静的解析で補う必要がある 9 アスペクトによる依存関係解析 スライスツールの実装(Java) 約 16,000 行(コメント含む) AspectJ によるデータ依存関係解析 依存関係解析アスペクト+クラス: 300行 JVM改造アプローチでは、16,000 行程度の追 加コードが必要(全体で約 580,000 行) 10 ツールの動作 スライス結果 スライス対象 ソースコード 依存関係解析 アスペクト スライス 計算 AspectJ 依存関係情報 アスペクト結合済み クラスファイル 通常の JVM 通常の実行結果 11 評価: スライスのサイズ JVM 改造による実現との比較 適用対象 P1: 簡易データベースプログラム (4クラス、262行) P2: ソーティングプログラム(5クラス、228行) P3: スライス計算プログラム(125クラス、約16000 単位: 行 行) ローカル変数の扱いの差 アスペクト JVM による影響はほとんど見られない P1 33 30 P2 25 28 短いメソッドが多いため P3 226 240 12 評価: 実行コスト 同じ入力を与えて実行時間を比較 適用対象はスライスサイズの場合と同様 コンパイラの最適化による影響 JVMは、すべてのクラスに対し、解析コストを支払う ライブラリが多いプログラムほど、JVM のアプローチは不利 通常実行 アスペクト JVM P1 240 ms 343ms(x1.4) 1829 ms(x7.6) P2 242 ms 416ms(x1.7) 2846 ms(x11.8) P3 0.7 sec 9.0 sec(x12.9) 79.3 sec(x113.3) 13 まとめと今後の課題 アスペクトを用いた動的データ依存解析 アスペクト指向プログラミングによって、動的 情報取得モジュールの取り扱いが容易になる JVM 改造アプローチに比べ、わずかなスライ スサイズの変化で、高速化できる 課題 大規模プログラムへの適用 手法のスケーラビリティ 14
© Copyright 2024 ExpyDoc