アスペクト指向プログラミングの 動的プログラムスライスへの

アスペクト指向プログラミングの
動的プログラムスライスへの応用
石尾 隆, 楠本 真二, 井上 克郎
大阪大学大学院基礎工学研究科
研究の背景


ソフトウェアの大規模化
フォールト特定、修正のコスト増大



テストケースからのフォールト特定
扱うコード量が多いと効率が悪くなる
実際に動くコードは、全体のごく一部
関係のないコードを自動的に除外して
迅速なフォールト特定を行いたい
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