スライド 1

プログラムスライスを用いた
アスペクト指向プログラムのデバッグ支援環境
石尾 隆,楠本 真二,井上 克郎
大阪大学大学院情報科学研究科
{t-isio,kusumoto,inoue}@ist.osaka-u.ac.jp
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
オブジェクト指向モデル
オブジェクトの相互通信でシステムをモデル化
システムの機能をオブジェクトが分担して担当
横断要素: 複数のオブジェクトが関わる機能
コードが分散,一貫性の維持が困難 →保守性の悪化
例:エラー処理
Database でエラーが発生したらユーザの指示に従う
 GUI, Database にエラー処理コードが分散
ユーザの入力を通知
GUI
Database
エラーを通知
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
アスペクト指向モデル
アスペクト: 横断要素のモジュール化
アスペクト = (動作時点, 処理) の集合で定義
動作時点は,メッセージ送受信や例外の発生など
明示的な呼び出しが不要
Database
GUI
1. GUI の生成に応じて
参照を記憶
2. Database の例外発生に
対応して,GUI を使って
ユーザに通知
3. 結果を
エラー処理アスペクト
Databaseに反映
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
本研究の目的
アスペクトを組み込んだプログラムに対する依存関係
解析結果を用いた開発支援手法を提案する.
アスペクト干渉の検出
アスペクトを組み込む時点での支援
プログラムスライスの抽出
アスペクトを組み込んだ後のデバッグ支援
対象: AspectJ
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
アスペクト干渉の検出
アスペクトを組み込む段階での情報の提示
Aspect を含めた Call Graph の利用
頂点:クラス,アスペクトに含まれるメソッド(手続き)単位
辺:メソッドの呼び出し,アスペクトの呼び出し
(呼び出し関係はソースコードから解析)
ある時点でアスペクトが作動する=アスペクトを呼び
出している
「Call Graphでアスペクトの頂点に到達可能」ならば「ア
スペクトの影響を受ける」
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
Call Graph 例
凡例
Aspect
Class
call
無限ループ
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
プログラムスライスの定義
プログラムのある文sのある変数v(スライス基点
<s,v>)の値に“影響”を与えうる文の集合
影響 = 代入-参照 関係, if 文など制御関係
プログラム文を頂点,依存関係を辺としたグラフ探索
1:
2:
3:
4:
5:
6:
a = 5;
b = a + a;
if (b > 0) {
c = a;
}
d = b;
a
b
基点< 6, b >
制御
1:
2:
3:
4:
5:
6:
a = 5;
b = a + a;
if (b > 0) {
c = a;
}
d = b;
プログラマが扱う必要があるコードを提示
デバッグ作業の効率化
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
a
b
スライス計算に必要な情報
データ依存関係
ローカル変数の 代入 → 参照
フィールド(メンバ変数)の 代入 → 参照
制御依存関係
実行制御文の条件節 → 制御される文
メソッド呼び出し関係
メソッド呼び出し文 → 呼び出されるメソッドの文
メソッド呼び出し文の実引数 → 呼び出されるメソッドの仮引数
アスペクトの連動位置 → 動作するアスペクト
アスペクトの連動位置 → アスペクトが参照する実行時点情報
目的をデバッグに限定
実行が失敗するテストケースが特定されている状態を想定
動的(実行時)情報 が利用可能
オブジェクトの区別,動的束縛の解決によってコード量を減らす
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
動的情報収集の実装
アスペクトとして動的解析処理を記述する
1つのモジュールにカプセル化可能
可読性・保守性の向上
実現および実行時コストの軽減
実用上十分な情報が収集可能
Java を対象とした場合は十分に有効†
→ AspectJ で書かれたプログラム用に拡張
† 石尾隆, 楠本真二, 井上克郎: “アスペクト指向プログラミングの動的ス
ライス計算への応用”, 情報処理学会論文誌,Vol.44, No.7 (2003).
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
スライスツールの実装
統合開発環境 Eclipse への統合
プラグイン形式で機能を追加できる
開発者がエディタ上でそのまま利用できる
コンパイル時にソースコード情報を収集
静的依存情報の収集
Call Graphの作成,無限ループ等の指摘
実行時情報が存在すれば読み込んで利用
動的解析モジュールを付加して実行しておく必要あり
実行時情報がなければ静的情報だけでスライス計算
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
プロトタイプのスクリーンショット
3. スライス計算実行を指示
2. スライス基点をエディタ上で選択
1. コンパイル時に静的情報収集
4. スライス結果を
エディタ上に出力
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
実験(1) ツールの適用
適用対象
AspectJ サンプルコード 5種類
プログラムの実行時情報解析アスペクト
各サンプルコードのサイズは平均500行
実験内容
サンプルコードを実行し,その結果に対してプログラムスラ
イスを計算
従来のツールを用いた依存関係の追跡との定性的比較
AJDE: どこでアスペクトが動作するかをマーカーで表示する
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
「依存関係がなくなる」コードの例
開発者が意識する依存関係
void f1() {
x = f2();
:
}
int f2() {
return doSomething();
}
int f3() {
return doSomething2();
}
aspect redirectMethodCall {
int around(): call(f2) {
return f3();
メソッド呼び出しを
}
置き換えるアスペクト
}
実際のスライス結果
void f1() {
x = f2();
:
}
int f2() {
return doSomething();
}
int f3() {
return doSomething2();
}
aspect redirectMethodCall {
int around(): call(f2) {
return f3();
}
}
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
計算コスト
時間コスト
静的情報の収集=コンパイラが構築した意味解析木に対する1パ
ス処理
動的情報の収集(実行時情報を付加した状態での対象プログラ
ムの実行時間)=実行するプログラムとテストデータに依存,過去
の実験では通常の実行に比べて最大で10倍程度
空間コスト
アスペクトの種類によってコストに大きな差
多数のクラスを横断して動作するアスペクトは,メモリ消費量が非
常に大きくなることがある
約10000行のコードに,実行時情報解析アスペクト(1000行)を追加した
結果,必要メモリが20MBから100MB以上に増加
AspectJ が生成した意味解析木の肥大化による,解析コストの増大
動作回数が多い分,アドバイス呼び出しの頂点と辺の数が増加
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
実験(2) 開発への影響の評価
大学院の授業での利用
大学院生(修士課程) 12名
授業で Java 使用経験あり,AspectJ は使用経験なし
開発環境: Eclipse + AspectJ plug-in
実験の手順
Eclipse についての解説
Eclipse を用いた Javaプログラムのデバッグ演習(事前課題1)
AspectJ についての解説
Eclipse を用いた AspectJ プログラミング演習(事前課題2)
Eclipse を用いた AspectJ プログラムのデバッグ(実験)
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
対象プログラムの概要
AspectJ プログラムのデバッグ演習
対象: 式評価プログラム
入出力例: (+ 4 3 (* 2 7 ) (* 2 7) )  35
一部のノードは共有されていることがある
アスペクトの干渉によって正しい結果が出力できないプログラム
クラス5つ(式構造クラス),アスペクト4つ,合計340行
式評価経過の文字列出力,計算結果の共有,グラフのループ検出,評価
が終了したグラフの接続解除
学生の半数 6名に,プログラムスライスを追加資料として提供
時間の都合上,印刷物として提供
誤った出力結果を格納している変数をスライス基点として設定
4つのアスペクトのうち,2つは関与していないことが明示されている
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
提供したスライスの一部
public aspect CachingAspect {
// member of this Aspect
static private Set workers = new HashSet();
// add a member to Worker class
private boolean Worker.isAlreadyCalculated = false;
pointcut work_call() : call(void Worker.work());
pointcut first_work_call() :
work_call() && !cflowbelow(work_call());
void around(): work_call() {
Worker w = (Worker)thisJoinPoint.getTarget();
if (w.isAlreadyCalculated) return;
else {
proceed();
w.isAlreadyCalculated = true;
workers.add(w);
}
}
// clear the flag when calculation process is finished
after(): first_work_call() {
for (Iterator it = workers.iterator(); it.hasNext(); ) {
Worker w = (Worker)it.next();
w.isAlreadyCalculated = false;
}
workers.clear();
}
既に計算済みの場合は
計算を省略する
この計算省略機能が,
計算経過の文字列出力も
飛ばすことがバグの原因
計算が完全に終了した
時点で,フラグをクリア
出力結果には関係ないので
スライスに含まれない
}
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
実験の提出物
提出物 (事前の2回の演習課題,実験用の演習)
問題の原因
修正方針
変更したソースコード
作業に要した時間
スライスを使用した感想
提出した結果を分析
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
実験結果
Javaプログラム課題の作業時間との順位相関
相関係数 r = 0.54
AspectJ プログラミングでは Java に関するプログラミング能力が重
要な要素となる
スライス使用の効果
スライス使用者のほうが値は多少良いが,統計的に有意な差は
示せなかった
作業時間の平均 (単位: 分)
グループ 事前課題1 事前課題2 実験
(Java)
(AspectJ) (AspectJ)
1
150
186
200
2
200
210
190 (スライス使用)
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
まとめ
アスペクト指向プログラムの開発支援
Call Graphを用いた干渉の検出
アスペクトの動作を,メソッド呼び出しと等価とみなす
ループ等,実行を不可能にするような重大な干渉の提示
プログラムスライシングの適用
従来手法に,「アスペクト呼び出し」を追加
静的情報,実行時情報を組み合わせた開発者の支援
評価実験
スライスツールの適用
アスペクトによる振る舞いの変化を示す
開発作業への影響の評価
バグの原因特定には有用
バグの修正支援には他の手法が必要
今後の課題
多数のオブジェクトを横断するアスペクトの効率的な扱い
影響波及解析など,他のデバッグ支援手法との連携
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
アスペクトを含んだプログラム依存グラフ
呼び出し
データ依存
手続き内部頂点
around(): call (Foo.f1) の例
o, x を
代入したノード
呼び出し
引数: o, x
around(): call(Foo.f1)
データ o
元の o.f1(x); に対応
する頂点
thisJoinPoint.getThis();
戻り値
本来の
呼び出し
戻り値を代入する変数
引数: x
f1 メソッド本体
o, x
proceed();
戻り値
return 文
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
プログラムの概要 (1)
“Worker” 階層オブジェクト
17
それぞれ評価値を持つ
SumWorker
Sumは加算ノード
9
5
Prodは乗算ノード
ProdWorker
Literal (5)
Literalは定数
3
3
3
ノードは共有可能
Literal (3)
Worker.work() で評価値計算
Worker.getValue() で結果取得
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
プログラムの概要 (2)
main.Main
Worker ツリー構築 → 計算 → 結果の出力 を実装
4つのアスペクトを導入
Worker ツリーの解体 (CleanupAspect)
式の構造 出力 (PrintTreeAspect)
先ほどのツリーの出力: (+ 5 3 (* 3 3 ) )
共有ノードの再評価省略 (CachingAspect)
計算中のループ検出 (LoopDetectAspect)
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
オブジェクト/アスペクトのコード比較
class GUI {
public int notifyError(DBException e) {
// ダイアログを生成してユーザに通知
database.processError(e, user_input);
}
}
class Database {
private doSomething() {
try { ... } catch (DBException e)
{ gui.notifyError(e); }
}
private doSomething2() {
try { ... } catch (DBException e) {
gui.notifyError(e); }
}
}
DB内でのエラーが起きる場所
すべてで同じ処理が必要
aspect ErrorNotification {
// Databaseでのエラートラップ
after throwing(DBException e):
call (* Database.*(..) ) {
user_input = GUI.notifyError(e);
// エラー処理
}
// GUI に以下のコードを追加
public int GUI.notifyErorr(DBException e) {
// ダイアログを表示
// ユーザの入力を戻り値とする
return user_input;
}
}
一貫性の維持が難しい
・変更の反映を忘れる
・無関係な部分に実装を
追加してしまう
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
その他のアスペクトの利用例
アスペクトによるトランザクションの実現†
種々のトランザクションメカニズムを利用したトランザクションのモジュール化
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
‡
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
Architecture and Use Case of ADAS
1.edit
program slice
slice
criteria
Dynamic
Java Source
Analysis
Aspect
4.slice calculation
Slice Calculation Tool
Static
Analyzer
Static
Info.
2.compile
AspectJ
Java
Bytecode
Java VM
3.execute
a test case
Dynamic
Info.
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
情報収集の従来の実現方法
「監視」処理は対象ソフトウェア全体に影響する
単純な実装:対象ソフトウェアの各所でログを生成する
→ アスペクトでモジュール化するべき
Java を対象とした場合のその他の実現方法
Java Virtual Machine (JVM)の改造
移植性がない,実現に必要なコストが高い
JVMの持つ Profiler Interface の利用
実行時のコストが高い,バイトコード最適化で結果が変わる
プリプロセッサによるソースコード変換
構文木の変換ルールが複雑,保守性が低い
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
アスペクトによる実装の利点
アスペクトとして動的解析処理を記述
1つのモジュールにカプセル化可能
可読性・保守性の向上
実現および実行時に要するコストの軽減
実用上十分な情報が収集可能
成果については論文投稿中†
†:
石尾 隆,楠本 真二,井上 克郎: アスペクト指向プログラミングの
動的プログラムスライスへの応用,情報処理学会論文誌,投稿中
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
関連研究
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
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University