プログラムスライシングを用いた 機能的関心事の抽出手法の 提案と実装

Slides:



Advertisements
Similar presentations
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 1 ソフトウェア部品推薦のための.
Advertisements

背景 ソフトウェアの大規模化・複雑化 生産性と品質の向上 ↓ オブジェクト指向分析設計の適用 開発ツールの投入.
XHTML構文検証手法における スクリプト要素の静的解析アルゴリズム
ソースコードの編集内容を入力とした ソフトウェア部品の自動検索
情報伝播によるオブジェクト指向プログラム理解支援の提案
変数間データフローグラフを用いた ソースコード間の移動支援
プログラムの動作を理解するための技術として
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
メソッド名とその周辺の識別子の 相関ルールに基づくメソッド名変更支援手法
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
プログラム静的解析手法の効率化と 解析フレームワークの構築に関する研究
川口真司 松下誠 井上克郎 大阪大学大学院情報科学研究科
Java ソフトウェア部品検索システム SPARS-J のための リポジトリ自動更新機能の実現
ソースコードに対する適用可能な修正手順を 可視化するリファクタリング支援手法の提案
プログラム実行履歴を用いたトランザクションファンクション抽出手法
ソースコードの変更履歴における メトリクス値の変化を用いた ソフトウェアの特性分析
静的情報と動的情報を用いた プログラムスライス計算法
Javaクラスの利用関係を用いた ソフトウェア部品のカテゴリ階層構築法
コードクローンに含まれるメソッド呼び出しの 変更度合の分析
コードクローンに含まれるメソッド呼び出しの 変更度合の調査
動的スライスを用いた バグ修正前後の実行系列の比較
動的依存グラフの3-gramを用いた 実行トレースの比較手法
オブジェクト指向プログラムにおける エイリアス解析手法の提案と実現
動的スライスを用いたバグ修正前後の実行系列の差分検出手法
利用関係に基づく類似度を用いたJavaコンポーネント分類ツールの作成
ソフトウェア部品分類手法への コンポーネントランク法の応用
機能的関心事を抽出するためのプログラムスライシングの拡張
Javaプログラムの変更を支援する 影響波及解析システム
コードクローン検出ツールを用いた ソースコード分析システムの試作と プログラミング演習への適用
コンポーネントランク法を用いたJavaクラス分類手法の提案
動的データ依存関係解析を用いた Javaプログラムスライス手法
コードクローンの動作を比較するためのコードクローン周辺コードの解析
ソースコード縮退による ソースコード理解 神谷年洋 科学技術振興事業団 さきがけ研究21 オブジェクト指向シンポジウム2003.
UMLモデルを対象とした リファクタリング候補検出の試み
Javaバイトコードの 動的依存解析情報を用いた スライシングシステムの実現
コードクローン検出に基づくデザイン パターン適用支援手法の提案と実現
プログラム理解におけるThin sliceの 統計的調査による有用性評価
バイトコードを単位とするJavaスライスシステムの試作
コード片に共通した特性を自動抽出する ソースコード閲覧ツールの試作
○ 後藤 祥1,吉田 則裕2 ,井岡 正和1 ,井上 克郎1 1大阪大学 2奈良先端科学技術大学院大学
ソフトウェア保守のための コードクローン情報検索ツール
コードクローンの理解支援を目的としたコードクローン周辺コードの解析
コードクローン分類の詳細化に基づく 集約パターンの提案と評価
Javaバーチャルマシンを利用した 動的依存関係解析手法の提案
コーディングパターンの あいまい検索の提案と実装
JAVAバイトコードにおける データ依存解析手法の提案と実装
コードクローン間の依存関係に基づく リファクタリング支援環境の実装
オブジェクトの協調動作を用いた オブジェクト指向プログラム実行履歴分割手法
静的情報と動的情報を用いた Javaプログラムスライス計算法
プログラムスライスを用いた凝集度メトリクスに基づく 類似メソッド集約候補の順位付け手法
設計情報の再利用を目的とした UML図の自動推薦ツール
依存関係の局所性を利用した プログラム依存グラフの 効率的な構築法
保守請負時を対象とした 労力見積のためのメトリクスの提案
アスペクト指向言語のための視点に応じた編集を可能にするツール
プログラムの差分記述を 容易に行うための レイヤー機構付きIDEの提案
オープンソースソフトウェアに対する コーディングパターン分析の適用
メソッドの同時更新履歴を用いたクラスの機能別分類法
UMLモデルを対象とした リファクタリング候補検出手法の提案と実現
欠陥検出を目的とした類似コード検索法 吉田則裕,石尾隆,松下誠,井上克郎 大阪大学 大学院情報科学研究科
ソフトウェア理解支援を目的とした 辞書の作成法
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
コードクローン解析に基づく デザインパターン適用候補の検出手法
回帰テストにおける実行系列の差分の効率的な検出手法
メソッド抽出リファクタリングが 行われるメソッドの特徴調査
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
識別子の読解を目的とした名詞辞書の作成方法の一試案
プログラム理解のための 付加注釈 DocumentTag の提案
Presentation transcript:

プログラムスライシングを用いた 機能的関心事の抽出手法の 提案と実装 仁井谷 竜介†, 石尾 隆† ‡, 井上 克郎† †大阪大学 大学院情報科学研究科 ‡日本学術振興会特別研究員(PD)

機能的関心事 (以降単に “関心事”) 開発者が興味ある事柄 ソフトウェアの理解に関心事の理解は必要 ソフトウェアの機能や品質など 複数のモジュール(クラスやメソッドなど)のコラボレーションによってソースコード上に実現される 修正や再利用をする1つの単位 ソフトウェアの理解に関心事の理解は必要 PPL2007 2007/03/09

ソースコード上の関心事の理解 手順 コストが高い 手がかりを探す(単語検索, Feature locationなど) 関連するモジュールを探す モジュール間の関係を理解 コストが高い 保守工程の多くが理解に費やされる PPL2007 2007/03/09

本研究の対象 手順 関心事の抽出手法を提案 手がかりを探す(単語検索, Feature locationなど) 関連するモジュールを探す モジュール間の関係を理解 関心事の抽出手法を提案 ヒューリスティクスで拡張したプログラムスライシング ここを支援したい PPL2007 2007/03/09

プログラムスライシング スライシング基準と関連のあるプログラム要素、および要素間の関係の抽出を自動で行う技術 プログラム P をプログラム依存グラフに変換 頂点 : 文(など) 辺 : 依存関係(データ依存/制御依存) P に対してスライシング基準 <s, v> を指定 s : P 中の文 v : 変数 P 上の頂点の訪問により v に影響する/される文の集合とその間の関係を特定 i = 3; if (a > 0) { print i; } データ依存 <3, i> 制御依存 PPL2007 2007/03/09

理解支援でのスライシングの問題点 関心事との関連の弱い箇所が多く含まれる スライスのサイズが大きくなる 異なる関心事についての出力が重複する 例:main()やライブラリの詳細 スライスのサイズが大きくなる 異なる関心事についての出力が重複する 例: 「ドキュメントを開く」と「ドキュメントを保存」 依存 制御フロー 関心事(開く) スライス(開く) 関心事(保存) スライス(保存) Main.main(args) App.run() Menu.onClick(buttonID) FileDialog.getPath() Document.open(path) File.read(path) MDI.add(document) Log.debug(message) FileDialog.getPath() Document.save(path) File.write(path) App.quit() PPL2007 2007/03/09

提案手法 関連の強い / 弱い箇所の境界(バリア)をヒューリスティックに見つける [1] では手動で配置される 頂点 提案手法では自動で配置される 依存辺 適切な関連の強さの箇所にバリアを配置することで、関心事に固有の部分が抽出できる バリア 依存 制御フロー 関心事(開く) スライス(開く) 関心事(保存) スライス(保存) Main.main(args) App.run() Menu.onClick(buttonID) FileDialog.getPath() Document.open(path) File.read(path) MDI.add(document) Log.debug(message) FileDialog.getPath() Document.save(path) File.write(path) App.quit() PPL2007 [1] Krinke, J.: Slicing, Chopping, and Path Conditions with Barriers. Software Quality Journal, Vol.12, No.4, pp.339-360,December 2004. 2007/03/09

提案手法の手順 プログラム依存グラフの構築 開発者による入力(スライシング基準) 関心事に関連の強いメソッドと関係の抽出 ヒューリスティクスによるバリアの特定 バリアと開発者の入力を用いたスライシング 結果からライブラリに属すものをフィルタリング 開発者に提示 関心事グラフを用いた可視化 PPL2007 2007/03/09

入次数の大きい頂点に入る辺 キーワードマッチと距離に基づく境界 3.i. ヒューリスティクスによるバリアの特定 スライシング基準 PDG頂点 依存辺 バリア PPL2007 2007/03/09

入次数が閾値以上の頂点に入る辺をバリアにする 3.i 入次数の大きい頂点に入る辺 入次数の大きい頂点は関連が弱い ライブラリ ユーティリティ 複数の関心事の合流点 入次数が閾値以上の頂点に入る辺をバリアにする 入次数が大きい頂点 バリア PPL2007 2007/03/09

キーワードにマッチする箇所やその近隣によって関心事が実現されていると考えられる 3.i. キーワードマッチと距離に基づく境界 関心事には対応するキーワードがある 識別子などに用いられる 例) save: autosave(), saveBuffer() キーワードにマッチする箇所やその近隣によって関心事が実現されていると考えられる キーワードにマッチした箇所から遠い頂点に出入りする辺をバリアにする PPL2007 2007/03/09

3.i. 「キーワードマッチと距離に基づく境界」の手順 キーワードと閾値を与える 下の例は autosave と buffer と閾値1.0 頂点にマークをつける キーワードにマッチするメソッドに含まれる頂点 各頂点の重みを決める マーク付き頂点からの距離から以下の式で決定 単純な距離とは異なり、同じ距離でも中間の方が重みが高い 閾値以下の頂点の辺をバリアにする autosave() getBuffers() 距離2 1.70 1.46 1.28 0.93 0.75 1.16 1.70 1.46 1.28 0.93 0.75 1.16 PPL2007 2007/03/09

3.ii. バリアと開発者の入力を用いたスライシング 開発者の入力からの依存関係を順/逆両方向に辿る バリアで訪問を停止 スライシング基準 PDG頂点 依存辺 バリア  スライス PPL2007 2007/03/09

5. 関心事グラフを用いた可視化 頂点 辺 クラス(メソッド・フィールドを内包) メソッド フィールド 呼び出し辺 フィールドに対するデータフロー辺 インスタンス生成辺 親子クラス辺 org.gjt.sp.jedit.Autosave actionPerformed(java.awt.event.ActionEvent): void init(): void setInterval(int): void javax.swing.Timer timer org.gjt.sp.jedit.jEdit getIntegerProperty(java.lang.String, int): int propertiesChanged(): void call PPL2007 2007/03/09

評価実験 目的 : 関心事の理解支援に適したスライスかの評価 対象 : jEdit (テキストエディタ) 関心事 Java / 777 class / 144,692 LOC 関心事 Autosave : ファイルの自動保存 Undo : 変更取り消し マニュアルに機能として存在する単語 正解のメソッド集合は人手で作った VFS Search : 仮想ファイルシステム上のディレクトリ検索 版管理システム上で見つかった、追加された機能 差分から正解を作った スライシング基準 : grep により得られた文 PPL2007 2007/03/09

評価内容 スライスサイズの変化 ヒューリスティクスを組み合わせたもの 異なる関心事間のスライスの共通箇所 長さ制限付きスライシングとの比較 関心事グラフの変化 PPL2007 2007/03/09

スライスサイズの変化 従来のスライス 提案手法について以下の点を確認する 理解に必要な箇所はほぼ全て含んでいる サイズが大きすぎる 理解に適したサイズか サイズが小さくても必要な箇所を含んでいるか メソッド単位の再現率 / 適合率 / F値を計算 PPL2007 2007/03/09

スライスサイズの変化の結果 閾値を変えたときの変化 サイズ : スライシング基準~従来手法で変化 サイズ : スライシング基準~従来手法で変化 再現率 : スライシング基準~従来手法で変化 サイズに比例より良い 従来手法 スライシング基準 PPL2007 2007/03/09

スライスサイズの変化の結果(キーワード) F値がスライシング基準より向上している その時のサイズは十分小さい 関連 弱 強 PPL2007 2007/03/09

スライスサイズの変化の結果(入次数) 閾値によるサイズの制御が困難 F値は低い 小さな値付近(1~4)で極端にサイズが変わる PPL2007 2007/03/09

スライスサイズの変化の考察 キーワードマッチと距離に基づく境界 入次数の大きい頂点に入る辺 理解に適したサイズを適切な中身で提示できる 単体での使用には不適切 PPL2007 2007/03/09

ヒューリスティクスを組み合わせたもの 再現率を損なわず適合率が向上した(キーワードのヒューリスティクス基準) 入次数のヒューリスティクスも組み合わせることで有効 PPL2007 2007/03/09

異なる関心事間のスライスの共通箇所 従来のスライス 提案手法について以下を確認 異なる関心事間に、多くの関連の弱い共通箇所 共通箇所のサイズ 共通箇所と、それぞれの関心事との関連の強さ PPL2007 2007/03/09

異なる関心事間のスライスの共通箇所の結果 互いに共通箇所の小さなスライスが得られた AutosaveとUndoに共通するメソッド(うち2つ)は、共通して登場する 「ファイルが変更されたかどうか」 のフラグを扱う 残りの2つのメソッドは関連が弱かった 共通箇所 PPL2007 2007/03/09

長さ制限付きスライシングとの比較 長さ制限付きスライシング[2] キーワードマッチと距離に基づく境界 プログラム依存グラフ上での、スライシング基準からの距離を制限している キーワードマッチと距離に基づく境界 距離に基づいているため類似している 以下の点で異なる 複数頂点を考慮している 意味的情報(キーワード)を用いる [2] Krinke, J.: Visualization of Program Dependence and Slices, ICSM ’04: Proceedings of the 20th IEEE International Conference on Software Maintenance, 2004, pp. 168–177. PPL2007 2007/03/09

長さ制限付きスライシングとの比較の結果 提案手法(39メソッド)上 長さ制限付き 適切なものが抽出できた 同程度のメソッド数(45)下 関連の弱いクラスが多い 関心事グラフが接続されない 同程度の頂点数(479) 大きすぎるため不適 PPL2007 2007/03/09

関心事グラフの変化 閾値が大きい 閾値が小さい ソフトウェア構造の段階的な理解を支援する 重要なクラスや関係のみを抽出 重要なクラスの周辺の振る舞いも抽出 ソフトウェア構造の段階的な理解を支援する Storeyら[3]の提案する、ソフトウェア理解支援ツールが満たすべき項目の1つ「E5: システムの構造を表すオーバービューが抽象度を変化させながら使えること」とも合致 [3] M.-A. D. Storey, F. D. Fracchia, and H. A. M¨uller. Cognitive design elements to support the construction of a mental model during software exploration. The Journal of Systems and Software, Vol. 44, No. 3, pp. 171–185, 1999. PPL2007 2007/03/09

まとめ 機能的関心事の理解支援に適切な、プログラム要素とその間の関係を抽出 今後の課題 ヒューリスティクスにより関連の強い箇所のみ抽出 評価実験により理解支援に適したスライスが抽出ができたことが確認された 今後の課題 複数の関心事間の相互作用の調査 閾値の自動計算手法の確立 PPL2007 2007/03/09