機能的関心事を抽出するためのプログラムスライシングの拡張

Slides:



Advertisements
Similar presentations
Web アプリをユーザー毎に カスタマイズ可能にする AOP フレームワーク
Advertisements

シーケンス図の生成のための実行履歴圧縮手法
Riding the Design Wave II
メソッド周辺の識別子と メソッド本体のAPI利用実績に基づいたAPI集合推薦手法
Myoungkyu Song and Eli Tilevich 発表者: 石尾 隆(大阪大学)
Object Group ANalizer Graduate School of Information Science and Technology, Osaka University OGAN visualizes representative interactions between a pair.
変数間データフローグラフを用いた ソースコード間の移動支援
プログラムの動作を理解するための技術として
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
メソッド名とその周辺の識別子の 相関ルールに基づくメソッド名変更支援手法
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
プログラム静的解析手法の効率化と 解析フレームワークの構築に関する研究
コンポーネントランクを用いた ソフトウェアのクラス設計に関する 分析手法の提案
Java ソフトウェア部品検索システム SPARS-J のための リポジトリ自動更新機能の実現
プログラム実行履歴を用いたトランザクションファンクション抽出手法
ソースコードの変更履歴における メトリクス値の変化を用いた ソフトウェアの特性分析
静的情報と動的情報を用いた プログラムスライス計算法
Javaクラスの利用関係を用いた ソフトウェア部品のカテゴリ階層構築法
コードクローンに含まれるメソッド呼び出しの 変更度合の分析
コードクローンに含まれるメソッド呼び出しの 変更度合の調査
識別子の命名支援を目的とした動詞-目的語関係の辞書構築
定兼邦彦 今井浩 東京大学理学系研究科 情報科学専攻
動的依存グラフの3-gramを用いた 実行トレースの比較手法
オブジェクト指向プログラムにおける エイリアス解析手法の提案と実現
動的スライスを用いたバグ修正前後の実行系列の差分検出手法
利用関係に基づく類似度を用いたJavaコンポーネント分類ツールの作成
ソフトウェア部品分類手法への コンポーネントランク法の応用
プログラムスライシングを用いた 機能的関心事の抽出手法の 提案と実装
限られた保存領域を使用する Javaプログラムの実行トレース記録手法の 提案と評価
Javaプログラムの変更を支援する 影響波及解析システム
リファクタリング支援のための コードクローンに含まれる識別子の対応関係分析
コンポーネントランク法を用いたJavaクラス分類手法の提案
動的データ依存関係解析を用いた Javaプログラムスライス手法
ソースコードの特徴量を用いた機械学習による メソッド抽出リファクタリング推薦手法
コードクローンの動作を比較するためのコードクローン周辺コードの解析
UMLモデルを対象とした リファクタリング候補検出の試み
Javaバイトコードの 動的依存解析情報を用いた スライシングシステムの実現
プログラム理解におけるThin sliceの 統計的調査による有用性評価
バイトコードを単位とするJavaスライスシステムの試作
コード片に共通した特性を自動抽出する ソースコード閲覧ツールの試作
○ 後藤 祥1,吉田 則裕2 ,井岡 正和1 ,井上 克郎1 1大阪大学 2奈良先端科学技術大学院大学
ソフトウェア保守のための コードクローン情報検索ツール
コードクローンの理解支援を目的としたコードクローン周辺コードの解析
コードクローン分類の詳細化に基づく 集約パターンの提案と評価
コーディングパターンの あいまい検索の提案と実装
JAVAバイトコードにおける データ依存解析手法の提案と実装
コードクローン間の依存関係に基づく リファクタリング支援環境の実装
オブジェクトの協調動作を用いた オブジェクト指向プログラム実行履歴分割手法
静的情報と動的情報を用いた Javaプログラムスライス計算法
プログラムスライスを用いた凝集度メトリクスに基づく 類似メソッド集約候補の順位付け手法
設計情報の再利用を目的とした UML図の自動推薦ツール
依存関係の局所性を利用した プログラム依存グラフの 効率的な構築法
保守請負時を対象とした 労力見積のためのメトリクスの提案
アスペクト指向言語のための視点に応じた編集を可能にするツール
プログラムの差分記述を 容易に行うための レイヤー機構付きIDEの提案
オープンソースソフトウェアに対する コーディングパターン分析の適用
メソッドの同時更新履歴を用いたクラスの機能別分類法
UMLモデルを対象とした リファクタリング候補検出手法の提案と実現
欠陥検出を目的とした類似コード検索法 吉田則裕,石尾隆,松下誠,井上克郎 大阪大学 大学院情報科学研究科
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
コードクローン解析に基づく デザインパターン適用候補の検出手法
回帰テストにおける実行系列の差分の効率的な検出手法
メソッド抽出リファクタリングが 行われるメソッドの特徴調査
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
識別子の読解を目的とした名詞辞書の作成方法の一試案
プログラム理解のための 付加注釈 DocumentTag の提案
プログラム依存グラフを用いた ソースコードのパターン違反検出法
Presentation transcript:

機能的関心事を抽出するためのプログラムスライシングの拡張 井上研究室 仁井谷 竜介

概要 ソフトウェアは多くの機能的関心事(≒一連の処理、以降単に関心事)で構成 関心事を理解するのはコストが高い 関心事の抽出手法を提案 関心事は複数のモジュール(クラスやメソッド)のコラボレーションで実現 関心事を理解するのはコストが高い 手がかりを見つける(単語検索, Feature locationなど) 関連するモジュールを探す モジュール間の関係を理解 関心事の抽出手法を提案 ヒューリスティクスで拡張したプログラムスライシング ここを支援したい 修士論文発表会 2007/02/19

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

理解支援でのスライシングの問題点 関心事との関連の弱い箇所が多く含まれる スライスのサイズが大きくなる 異なる関心事についての出力が重複する 例: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() 修士論文発表会 2007/02/19

提案手法 関連の強い / 弱い箇所の境界(バリア)をヒューリスティックに見つける [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() 修士論文発表会 [1] Krinke, J.: Slicing, Chopping, and Path Conditions with Barriers. Software Quality Journal, Vol.12, No.4, pp.339-360,December 2004. 2007/02/19

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

引数が callee の制御を変更しないメソッド呼び出し辺 入次数の大きい頂点に入る辺 キーワードマッチと距離に基づく境界 ここだけ紹介 3.i. ヒューリスティクスによるバリアの特定 フィールドへのアクセス 引数がないメソッド呼び出し辺 引数が callee の制御を変更しないメソッド呼び出し辺 入次数の大きい頂点に入る辺 キーワードマッチと距離に基づく境界 ここだけ紹介 Name Context(メソッド m からアクセスできる型や識別子を構成する単語の集合)の類似度が低い頂点との境界 Name Context の類似度と距離に基づく境界 修士論文発表会 2007/02/19

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 修士論文発表会 2007/02/19

3.ii. バリアと開発者の入力を用いたスライシング 開発者の入力からの依存関係を順/逆両方向に辿る バリアで訪問を停止 修士論文発表会 2007/02/19

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 修士論文発表会 2007/02/19

評価実験 目的 : 関心事の理解支援における有効性の評価 対象 : jEdit (テキストエディタ) 関心事 Java / 777 class / 144,692 LOC 関心事 Autosave : ファイルの自動保存 Undo : 変更取り消し マニュアルに機能として存在する単語 VFS Search : 仮想ファイルシステム上のディレクトリ検索 版管理システム上で見つかった、追加された機能 スライシング基準 : grep により得られた文 修士論文発表会 2007/02/19

評価内容 「キーワードマッチと距離に基づく境界」のみ紹介 スライスサイズの変化 grep の適合率/再現率との比較 異なる関心事間のスライスの共通箇所 ヒューリスティクスを組み合わせたもの 長さ制限付きスライシングとの比較 関心事グラフの評価 「キーワードマッチと距離に基づく境界」のみ紹介 (Autosave, Undo に関して単体で一番良かった) 修士論文発表会 2007/02/19

スライスサイズの変化 スライシング基準~従来手法のサイズまで変えられる 再現率(メソッド単位)もスライシング基準~従来手法で変化する ただしサイズに比例よりは良い 修士論文発表会 2007/02/19

grep (スライシング基準) の 適合率/再現率との比較 前提 抽出されたメソッドにのみ着目(メソッド間の関係は考慮しない) grep ⊆ スライス (メソッドの集合として) スライスの再現率は必ず grep 以上 適合率は下がる可能性が高い 提案手法は抽出したメソッドだけでも grep より良い 0.95 閾値:1.45 曲線の右上は grep より性能が良い 1.35 1.25 1.20 Autosave について メソッド単位での適合率/再現率 横軸: 適合率 縦軸: 再現率 丸: スライスの適合率/再現率 破線: grep の適合率/再現率 曲線: grep のF値 修士論文発表会 2007/02/19

異なる関心事間のスライスの共通箇所 互いに共通箇所の小さなスライスが得られた AutosaveとUndoに共通するメソッド(うち2つ)は、共通して登場する 「ファイルが変更されたかどうか」 のフラグを扱う 他の組にはもとから共通箇所がない 共通箇所 修士論文発表会 2007/02/19

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

修士論文発表会 2007/02/19

ライブラリやユーティリティや複数の関心事の合流点 3.i 入次数の大きい頂点に入る辺 ライブラリやユーティリティや複数の関心事の合流点 以下の入次数を個別に扱う 全ての依存辺の入次数(頂点単位) 呼出辺の入次数(メソッド単位) 修士論文発表会 2007/02/19

実装 修士論文発表会 2007/02/19

修士論文発表会 2007/02/19

長さ制限付きスライシングとの比較 提案手法(17クラス)上 長さ制限付き 適切なものが抽出できた 同程度のクラス数(16)下 関連の弱いクラスが多い 関心事グラフ的に接続されない 同程度の頂点数(175) 大きすぎるため不適 修士論文発表会 2007/02/19

関心事グラフ変化の考察 閾値が大きい 閾値が小さい ソフトウェア構造の段階的な理解を支援する 重要なクラスや関係のみを抽出 重要なクラスの周辺の振る舞いも抽出 ソフトウェア構造の段階的な理解を支援する Storeyら[2]の提案する、ソフトウェア理解支援ツールが満たすべき項目の1つ「E5: システムの構造を表すオーバービューが抽象度を変化させながら使えること」とも合致 [2] 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. 修士論文発表会 2007/02/19

フィールドへのアクセス グラフの説明 呼出辺の入次数の大きいメソッドのヒューリスティクスとの組み合わせによりスライスサイズが目立って減少 白がヒューリスティクス有効 / 灰色が無効の従来手法を 1.0 とした時のスライスサイズ(以降同様) 左から頂点数、メソッド数、クラス数 呼出辺の入次数の大きいメソッドのヒューリスティクスとの組み合わせによりスライスサイズが目立って減少 修士論文発表会 2007/02/19

引数のないメソッド 何と組み合わせても少し減っているだけ 修士論文発表会 2007/02/19

入次数の大きい頂点(全ての辺) 入次数の制限次第(この図は >4) ただし閾値の小さなところでスライスサイズが激減するため、単一使用には向かない(べき乗則参照) 修士論文発表会 2007/02/19

入次数の大きい頂点(呼出辺) 辺の総数が少ないので、全ての辺に比べてスライスは大きめ ただし、フィールドへのアクセスとの組み合わせは全ての辺の時よりスライスが小さい 修士論文発表会 2007/02/19

キーワードマッチした頂点との関連が弱い頂点との境界 閾値次第でサイズの調整が容易(この図は1.25) 他のヒューリスティクスと比べメソッド数が減る傾向にある 修士論文発表会 2007/02/19