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

31
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University プププププププププププププ プププププププププププププププププププププ ププ プ プププププ ププププププ [email protected] c.jp

Upload: neil

Post on 07-Jan-2016

45 views

Category:

Documents


6 download

DESCRIPTION

プログラムスライスを用いた アスペクト指向プログラムのデバッグ支援環境. 石尾 隆 井上研究室 博士前期課程2年 [email protected]. 発表の概 要. アスペクト指向プログラミング オブジェクト指向プログラミング アスペクト指向の特徴 アスペクト指向の問題点 アスペクト指向プログラムの開発支援 アスペクト干渉の検出 プログラムスライシングの適用 ツールの実装と評価 今後の課題. オ ブジェクト指向モデル. システムの機能を オブジェクトが分担して担当 横断要素 : 複数のオブジェクトが関わる機能 - PowerPoint PPT Presentation

TRANSCRIPT

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

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

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

支援環境

石尾 隆井上研究室 博士前期課程2年

[email protected]

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

Statistics

Student

Database

Course

学生情報を要求

例:学生の成績管理システム

情報の保存・取得

履修情報

情報の保存・取得

統計情報を要求

エラーが起きたら GUIに通知GUIはユーザの入力に従ってDatabaseを制御

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

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

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

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

GUI

Statistics

Student

Database

Course

Error Notification Aspect「エラーが起きたら動作」

監視ユーザへの通知 ユーザ

からの指示

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 で書かれたプログラム用に拡張

† 石尾隆 , 楠本真二 , 井上克郎 : “ アスペクト指向プログラミングの動的スライス計算への応用 ", 2002年電子情報通信学会総合大会講演論文集, D-3-4 , p.30 (2002).

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

適用実験適用対象

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

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

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

各サンプルコードのサイズは平均 500 行

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

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

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

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

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

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

アスペクトの種類によってコストに大きな差多数のクラスを横断して動作するアスペクトは,メモリ消費量が非常に大きい約 10000 行のコードに,実行時情報解析アスペクト( 1000 行)を追加した結果,必要メモリが 20MB から500MB以上に増加

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

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

まとめアスペクト指向プログラミングの特徴

横断要素のモジュール化保守性,再利用性の向上ソースコードの見た目と動作とのギャップが拡大

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

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

今後の課題多数のオブジェクトを横断するアスペクトの効率的な扱い

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

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

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

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

オブジェクトの横断要素横断要素=複数のオブジェクトに要求される特性

例:「データベースでエラーが起こったらユーザの指示を仰ぎたい」例:「デバッグ用に,オブジェクトに送られたメッセージを記録したい」処理が複数のオブジェクトに分散する → 分散したコードの一貫性の維持が困難

変更すべき場所を変更し忘れる変更すべきでない場所まで一緒に変更してしまう書かれたコードを後で見て,どこまでがその処理に関連するか分からない

横断要素をモジュール化する単位「アスペクト」の導入

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

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

利用例 : プログラムの実行時情報収集†

オブジェクト指向プログラムの実行経過を観測する

メソッドの呼び出し関係データの依存関係(代入 - 参照)

抽出した情報の主な用途デバッグ支援ソフトウェアの定量的評価(複雑さ,品質等)

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

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 24: プログラムスライスを用いた アスペクト指向プログラムのデバッグ支援環境

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 25: プログラムスライスを用いた アスペクト指向プログラムのデバッグ支援環境

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

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

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

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

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

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

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

アスペクト干渉とはアスペクトが他のアスペクトに影響を与える

単体では正しいアスペクトでも,正しい動作が阻害されることがある以下は無限ループの例

ディスク I/O をネットワーク I/O にマップする

アスペクト

ディスク I/O 以外の呼び出しをディスクに記録するアスペクト

ClientObject

Disk I/OObject

Network I/OObject

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

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

アスペクト干渉に対する方針アスペクトの干渉は必要な場合もある

ディスク I/O を置き換えるアスペクトなど

コンパイル時に干渉可能性を検出してユーザに通知,実行するかどうかはユーザの選択

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

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

スライスツールの動作概要

スライス対象ソースコード(含アスペクト)

依存関係解析アスペクト

通常のJVM

依存関係情報

通常の実行結果

スライス計算

スライス結果

AspectJ Compiler

アスペクト結合済みクラスファイル

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

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

情報収集: 動的 or 静的目的をデバッグに限定

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

データ依存関係フィールド(メンバ変数)の 代入 → 参照 関係ローカル変数の 代入 → 参照 関係

制御依存関係実行制御文の条件節 → 制御される文メソッド呼び出し文 → 呼び出されるメソッドの文アスペクトが連動するメッセージ → 動作するアスペクト

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

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/