プログラムスライスを用いた...

35
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University プププププププププププププ プププププププププププププププププププププ ププ プ ププ ププ ププ ププ ププププププププププププププ {t-isio,kusumoto,inoue}@ist.osa ka-u.ac.jp

Upload: mave

Post on 21-Jan-2016

69 views

Category:

Documents


0 download

DESCRIPTION

プログラムスライスを用いた アスペクト指向プログラムのデバッグ支援環境. 石尾 隆,楠本 真二,井上 克郎 大阪大学大学院情報科学研究科 {t-isio,kusumoto,inoue}@ist.osaka-u.ac.jp. 発表の概 要. アスペクト指向プログラミング オブジェクト指向プログラミング アスペクト指向の特徴 アスペクト指向の問題点 アスペクト指向プログラムの開発支援 アスペクト干渉の検出 プログラムスライシングの適用 ツールの実装 評価実験 今後の課題. オ ブジェクト指向モデル. オブジェクトの相互通信でシステムをモデル化 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: プログラムスライスを用いた アスペクト指向プログラムのデバッグ支援環境

Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

プログラムスライスを用いたアスペクト指向プログラムのデバッグ

支援環境

石尾 隆,楠本 真二,井上 克郎大阪大学大学院情報科学研究科

{t-isio,kusumoto,inoue}@ist.osaka-u.ac.jp

Page 2: プログラムスライスを用いた アスペクト指向プログラムのデバッグ支援環境

Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

発表の概要アスペクト指向プログラミング

オブジェクト指向プログラミングアスペクト指向の特徴アスペクト指向の問題点

アスペクト指向プログラムの開発支援アスペクト干渉の検出プログラムスライシングの適用

ツールの実装評価実験今後の課題

Page 3: プログラムスライスを用いた アスペクト指向プログラムのデバッグ支援環境

Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

オブジェクト指向モデルオブジェクトの相互通信でシステムをモデル化

システムの機能をオブジェクトが分担して担当

横断要素 : 複数のオブジェクトが関わる機能コードが分散,一貫性の維持が困難 →保守性の悪化

GUI Database

例:エラー処理

ユーザの入力を通知

エラーを通知

Database でエラーが発生したらユーザの指示に従う GUI, Database にエラー処理コードが分散

Page 4: プログラムスライスを用いた アスペクト指向プログラムのデバッグ支援環境

Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

アスペクト指向モデルアスペクト : 横断要素のモジュール化

アスペクト = ( 動作時点 , 処理 ) の集合で定義動作時点は,メッセージ送受信や例外の発生など明示的な呼び出しが不要

GUIDatabase

エラー処理アスペクト

2. Database の例外発生に対応して, GUI を使ってユーザに通知1. GUI の生成に応じて

参照を記憶 3. 結果をDatabase に反映

Page 5: プログラムスライスを用いた アスペクト指向プログラムのデバッグ支援環境

Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

アスペクト指向の利点と問題点利点:モジュール性の向上

保守性の向上横断要素がアスペクトにまとまっているので,変更が容易

再利用性の向上モジュール間の相互依存性の解消横断要素とオブジェクトの独立した再利用

問題点:プログラムの複雑化オブジェクトを見ただけでは動作がわからないアスペクトの干渉

アスペクトの動作順序で実行結果が変わるアスペクトの動作中に別のアスペクトが動作する

Page 6: プログラムスライスを用いた アスペクト指向プログラムのデバッグ支援環境

Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

本研究の目的アスペクトを組み込んだプログラムに対する依存関係解析結果を用いた開発支援手法を提案する.

アスペクト干渉の検出アスペクトを組み込む時点での支援

プログラムスライスの抽出アスペクトを組み込んだ後のデバッグ支援

対象 : AspectJ

Page 7: プログラムスライスを用いた アスペクト指向プログラムのデバッグ支援環境

Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

アスペクト干渉の検出アスペクトを組み込む段階での情報の提示Aspect を含めた Call Graph の利用

頂点:クラス,アスペクトに含まれるメソッド(手続き)単位辺:メソッドの呼び出し,アスペクトの呼び出し(呼び出し関係はソースコードから解析)

ある時点でアスペクトが作動する=アスペクトを呼び出している

「 Call Graph でアスペクトの頂点に到達可能」ならば「アスペクトの影響を受ける」

Page 8: プログラムスライスを用いた アスペクト指向プログラムのデバッグ支援環境

Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

Call Graph 例

Aspect

Class

call

凡例

無限ループ

Page 9: プログラムスライスを用いた アスペクト指向プログラムのデバッグ支援環境

Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

プログラムスライシングの適用プログラムスライシングとは

プログラム解析手法のひとつ開発者が注目する必要があるコードのみを抽出し,提示する技術元々は手続き的プログラム用に開発され,オブジェクト指向プログラムに対して拡張されている依存関係が複雑になるアスペクト指向プログラムに対して有効性が期待される

Page 10: プログラムスライスを用いた アスペクト指向プログラムのデバッグ支援環境

Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

プログラムスライスの定義プログラムのある文 s のある変数 v (スライス基点 <s,v> )の値に“影響”を与えうる文の集合

影響 = 代入-参照 関係, if 文など制御関係プログラム文を頂点,依存関係を辺としたグラフ探索

プログラマが扱う必要があるコードを提示デバッグ作業の効率化

基点 < 6, b >1: a = 5;

2: b = a + a;

3: if (b > 0) {

4: c = a;

5: }

6: d = b;

1: a = 5;

2: b = a + a;

3: if (b > 0) {

4: c = a;

5: }

6: d = b;

a

b

ab 制御

Page 11: プログラムスライスを用いた アスペクト指向プログラムのデバッグ支援環境

Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

スライス計算に必要な情報データ依存関係

ローカル変数の 代入 → 参照フィールド(メンバ変数)の 代入 → 参照

制御依存関係実行制御文の条件節 → 制御される文

メソッド呼び出し関係メソッド呼び出し文 → 呼び出されるメソッドの文メソッド呼び出し文の実引数 → 呼び出されるメソッドの仮引数アスペクトの連動位置 → 動作するアスペクトアスペクトの連動位置 → アスペクトが参照する実行時点情報

目的をデバッグに限定実行が失敗するテストケースが特定されている状態を想定動的(実行時)情報 が利用可能オブジェクトの区別,動的束縛の解決によってコード量を減らす

Page 12: プログラムスライスを用いた アスペクト指向プログラムのデバッグ支援環境

Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

動的情報収集の実装アスペクトとして動的解析処理を記述する

1つのモジュールにカプセル化可能可読性・保守性の向上

実現および実行時コストの軽減実用上十分な情報が収集可能

Java を対象とした場合は十分に有効†

→ AspectJ で書かれたプログラム用に拡張

† 石尾隆 , 楠本真二 , 井上克郎 : “ アスペクト指向プログラミングの動的スライス計算への応用” , 情報処理学会論文誌, Vol.44, No.7 (2003).

Page 13: プログラムスライスを用いた アスペクト指向プログラムのデバッグ支援環境

Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

スライスツールの実装統合開発環境 Eclipse への統合

プラグイン形式で機能を追加できる開発者がエディタ上でそのまま利用できる

コンパイル時にソースコード情報を収集静的依存情報の収集Call Graph の作成,無限ループ等の指摘

実行時情報が存在すれば読み込んで利用動的解析モジュールを付加して実行しておく必要あり実行時情報がなければ静的情報だけでスライス計算

Page 14: プログラムスライスを用いた アスペクト指向プログラムのデバッグ支援環境

Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

プロトタイプのスクリーンショット

3. スライス計算実行を指示2. スライス基点をエディタ上で選択

4. スライス結果をエディタ上に出力

1. コンパイル時に静的情報収集

Page 15: プログラムスライスを用いた アスペクト指向プログラムのデバッグ支援環境

Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

実験 (1) ツールの適用適用対象

AspectJ サンプルコード 5種類プログラムの実行時情報解析アスペクト各サンプルコードのサイズは平均 500 行

実験内容サンプルコードを実行し,その結果に対してプログラムスライスを計算従来のツールを用いた依存関係の追跡との定性的比較

AJDE: どこでアスペクトが動作するかをマーカーで表示する

Page 16: プログラムスライスを用いた アスペクト指向プログラムのデバッグ支援環境

Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

評価プログラムスライシングの有用性

アスペクトがもたらす複雑さの軽減アスペクトが増えた分,考慮すべき依存関係は増加ファイルをまたいだ依存関係:手作業の追跡はコスト大

「依存関係がなくなる」コードの発見が可能アスペクトの動作によって,実行されなくなるような文が発見できる

Page 17: プログラムスライスを用いた アスペクト指向プログラムのデバッグ支援環境

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(); }}

実際のスライス結果開発者が意識する依存関係

メソッド呼び出しを置き換えるアスペクト

Page 18: プログラムスライスを用いた アスペクト指向プログラムのデバッグ支援環境

Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

計算コスト時間コスト静的情報の収集=コンパイラが構築した意味解析木に対する1パス処理動的情報の収集(実行時情報を付加した状態での対象プログラムの実行時間)=実行するプログラムとテストデータに依存,過去の実験では通常の実行に比べて最大で 10倍程度

空間コストアスペクトの種類によってコストに大きな差多数のクラスを横断して動作するアスペクトは,メモリ消費量が非常に大きくなることがある約 10000 行のコードに,実行時情報解析アスペクト( 1000 行)を追加した結果,必要メモリが 20MB から 100MB以上に増加AspectJ が生成した意味解析木の肥大化による,解析コストの増大動作回数が多い分,アドバイス呼び出しの頂点と辺の数が増加

Page 19: プログラムスライスを用いた アスペクト指向プログラムのデバッグ支援環境

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 プログラムのデバッグ(実験)

Page 20: プログラムスライスを用いた アスペクト指向プログラムのデバッグ支援環境

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つは関与していないことが明示されている

Page 21: プログラムスライスを用いた アスペクト指向プログラムのデバッグ支援環境

Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

提供したスライスの一部public aspect CachingAspect {

// member of this Aspectstatic private Set workers = new HashSet();

// add a member to Worker classprivate 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 finishedafter(): first_work_call() {

for (Iterator it = workers.iterator(); it.hasNext(); ) {Worker w = (Worker)it.next();w.isAlreadyCalculated = false;

}workers.clear();

}}

既に計算済みの場合は計算を省略する

計算が完全に終了した時点で,フラグをクリア

この計算省略機能が,計算経過の文字列出力も飛ばすことがバグの原因

出力結果には関係ないのでスライスに含まれない

Page 22: プログラムスライスを用いた アスペクト指向プログラムのデバッグ支援環境

Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

実験の提出物提出物 (事前の2回の演習課題,実験用の演習)

問題の原因修正方針変更したソースコード作業に要した時間スライスを使用した感想

提出した結果を分析

Page 23: プログラムスライスを用いた アスペクト指向プログラムのデバッグ支援環境

Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

実験結果Java プログラム課題の作業時間との順位相関

相関係数 r = 0.54

AspectJ プログラミングでは Java に関するプログラミング能力が重要な要素となる

スライス使用の効果スライス使用者のほうが値は多少良いが,統計的に有意な差は示せなかった

グループ

事前課題1  (Java)

事前課題2

(AspectJ)

実験(AspectJ)

1 150 186 200

2 200 210 190 (スライス使用)

作業時間の平均 ( 単位 : 分 )

Page 24: プログラムスライスを用いた アスペクト指向プログラムのデバッグ支援環境

Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

考察スライスを用いた学生の意見を分析した結果:

バグの原因特定について作業に取り掛かる段階で,コードを読む指針となる「原因の候補」として目をつけた点に対して,その部分がスライスに含まれているかどうかで,候補を絞り込める

バグの修正について変更結果が他のアスペクトに影響を及ぼさないことを確認するには,他のアスペクトも読まないといけない

スライスだけで,作業時間を短縮できるとは限らない 影響波及解析など他のデバッグ支援手法と組み合わせる

Page 25: プログラムスライスを用いた アスペクト指向プログラムのデバッグ支援環境

Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

まとめアスペクト指向プログラムの開発支援

Call Graph を用いた干渉の検出アスペクトの動作を,メソッド呼び出しと等価とみなすループ等,実行を不可能にするような重大な干渉の提示

プログラムスライシングの適用従来手法に,「アスペクト呼び出し」を追加静的情報,実行時情報を組み合わせた開発者の支援

評価実験スライスツールの適用

アスペクトによる振る舞いの変化を示す開発作業への影響の評価

バグの原因特定には有用バグの修正支援には他の手法が必要

今後の課題多数のオブジェクトを横断するアスペクトの効率的な扱い影響波及解析など,他のデバッグ支援手法との連携

Page 26: プログラムスライスを用いた アスペクト指向プログラムのデバッグ支援環境

Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

Page 27: プログラムスライスを用いた アスペクト指向プログラムのデバッグ支援環境

Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

アスペクトを含んだプログラム依存グラフ

around(): call (Foo.f1) の例

元の o.f1(x); に対応する頂点 thisJoinPoint.getThis();

呼び出し引数 : o, x

データ o

proceed();

f1 メソッド本体

呼び出しデータ依存手続き内部頂点

around(): call(Foo.f1)

o, x を代入したノード

戻り値を代入する変数

o, x

引数 : xreturn 文

戻り値

戻り値

本来の呼び出し

Page 28: プログラムスライスを用いた アスペクト指向プログラムのデバッグ支援環境

Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

プログラムの概要 (1)

“Worker” 階層オブジェクトそれぞれ評価値を持つSum は加算ノードProd は乗算ノードLiteral は定数ノードは共有可能Worker.work() で評価値計算Worker.getValue() で結果取得

SumWorker

Literal (5)

Literal (3)

ProdWorker5

3 3 3

9

17

Page 29: プログラムスライスを用いた アスペクト指向プログラムのデバッグ支援環境

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)

Page 30: プログラムスライスを用いた アスペクト指向プログラムのデバッグ支援環境

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.n

otifyError(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; }}

Page 31: プログラムスライスを用いた アスペクト指向プログラムのデバッグ支援環境

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

Page 32: プログラムスライスを用いた アスペクト指向プログラムのデバッグ支援環境

Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

Architecture and Use Case of ADAS

Java SourceDynamicAnalysisAspect

JavaBytecode

Java VMAspectJ DynamicInfo.

Slice Calculation Tool

program slice

StaticInfo.

slicecriteria

3.executea test case

1.edit

4.slice calculation

StaticAnalyzer

2.compile

Page 33: プログラムスライスを用いた アスペクト指向プログラムのデバッグ支援環境

Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

情報収集の従来の実現方法「監視」処理は対象ソフトウェア全体に影響する単純な実装:対象ソフトウェアの各所でログを生成する→ アスペクトでモジュール化するべき

Java を対象とした場合のその他の実現方法Java Virtual Machine (JVM) の改造

移植性がない,実現に必要なコストが高いJVM の持つ Profiler Interface の利用

実行時のコストが高い,バイトコード最適化で結果が変わる

プリプロセッサによるソースコード変換 構文木の変換ルールが複雑,保守性が低い

Page 34: プログラムスライスを用いた アスペクト指向プログラムのデバッグ支援環境

Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

アスペクトによる実装の利点アスペクトとして動的解析処理を記述

1つのモジュールにカプセル化可能可読性・保守性の向上

実現および実行時に要するコストの軽減実用上十分な情報が収集可能

成果については論文投稿中†

†: 石尾 隆,楠本 真二,井上 克郎 : アスペクト指向プログラミングの動的プログラムスライスへの応用,情報処理学会論文誌,投稿中

Page 35: プログラムスライスを用いた アスペクト指向プログラムのデバッグ支援環境

Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

関連研究AspectJ† IDE for JBuilder, Forte, Emacs

ソースコードエディタで,オブジェクトのコード上にアスペクトの連動位置を表示するアスペクト干渉の検出は行わない

アスペクト指向プログラムに対するプログラムスライス計算の提案‡

提案だけ,有効性については評価されていない

‡: Jianjun Zhao, “Slicing Aspect-Oriented Software”, In Proc. of the 10th IEEE International Workshop on Programming Comprehension, pp.251--260, 2002

†: AspectJ Official Site: http://www.eclipse.org/aspectj/