メソッド間の依存関係を利用した プログラム理解支援手法の提案と実現

Slides:



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

シーケンス図の生成のための実行履歴圧縮手法
ソースコードの編集内容を入力とした ソフトウェア部品の自動検索
利用実績に基づくソフトウェア部品検索システムSPARS-J
Myoungkyu Song and Eli Tilevich 発表者: 石尾 隆(大阪大学)
アクセス修飾子過剰性の変遷に着目したJavaプログラム部品の分析
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
メソッド名とその周辺の識別子の 相関ルールに基づくメソッド名変更支援手法
コンポーネントランクを用いた ソフトウェアのクラス設計に関する 分析手法の提案
川口真司 松下誠 井上克郎 大阪大学大学院情報科学研究科
Java ソフトウェア部品検索システム SPARS-J のための リポジトリ自動更新機能の実現
プログラム実行履歴を用いたトランザクションファンクション抽出手法
静的情報と動的情報を用いた プログラムスライス計算法
Javaソフトウェア部品 解析・検索システムSPARS-Jの構築
Javaクラスの利用関係を用いた ソフトウェア部品のカテゴリ階層構築法
コードクローンに含まれるメソッド呼び出しの 変更度合の分析
コードクローンに含まれるメソッド呼び出しの 変更度合の調査
識別子の命名支援を目的とした動詞-目的語関係の辞書構築
関数の変更履歴と呼出し関係に基づいた開発履歴理解支援システムの実現
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
Javaソースコード蓄積・ 検索システムSPARS-Jの概要
暗黙的に型付けされる構造体の Java言語への導入
動的依存グラフの3-gramを用いた 実行トレースの比較手法
オブジェクト指向プログラムにおける エイリアス解析手法の提案と実現
オブジェクト指向プログラムにおける エイリアス解析について
動的情報を利用したソフトウェア 部品評価手法
動的スライスを用いたバグ修正前後の実行系列の差分検出手法
利用関係に基づく類似度を用いたJavaコンポーネント分類ツールの作成
Javaプログラムの変更を支援する 影響波及解析システム
コードクローン検出ツールを用いた ソースコード分析システムの試作と プログラミング演習への適用
利用実績に基づくソフトウェア部品検索システムSPARS-J
プログラム動作理解支援を目的とした オブジェクトの振舞いの同値分割手法
Javaを対象としたソフトウェア部品 検索システムSPARS-Jの実験的評価
動的データ依存関係解析を用いた Javaプログラムスライス手法
ソースコードの特徴量を用いた機械学習による メソッド抽出リファクタリング推薦手法
オープンソース開発支援のための リビジョン情報と電子メールの検索システム
コードクローンの動作を比較するためのコードクローン周辺コードの解析
ソースコードの静的特性を用いた Javaプログラム間類似度測定ツールの試作
コードクローン検出に基づくデザイン パターン適用支援手法の提案と実現
Webコミュニティ概念を用いた Webマイニングについての研究 A study on Web Mining Based on Web Communities 清水 洋志.
不確実データベースからの 負の相関ルールの抽出
バイトコードを単位とするJavaスライスシステムの試作
Javaソフトウェア部品検索システムSPARS-Jの実験的評価
○ 後藤 祥1,吉田 則裕2 ,井岡 正和1 ,井上 克郎1 1大阪大学 2奈良先端科学技術大学院大学
コードクローンの理解支援を目的としたコードクローン周辺コードの解析
類似度メトリクスを用いた Javaソースコード間類似度測定ツールの試作
コードクローン分類の詳細化に基づく 集約パターンの提案と評価
コーディングパターンの あいまい検索の提案と実装
JAVAバイトコードにおける データ依存解析手法の提案と実装
JavaScriptを含んだHTML文書に対する データフロー解析を用いた構文検証手法の提案
オブジェクトの協調動作を用いた オブジェクト指向プログラム実行履歴分割手法
ソフトウェア工学 知能情報学部 新田直也.
プログラムスライスを用いた凝集度メトリクスに基づく 類似メソッド集約候補の順位付け手法
設計情報の再利用を目的とした UML図の自動推薦ツール
保守請負時を対象とした 労力見積のためのメトリクスの提案
クローン検出ツールを用いた ソフトウェアシステムの類似度調査
オープンソースソフトウェアに対する コーディングパターン分析の適用
メソッドの同時更新履歴を用いたクラスの機能別分類法
開発作業の形式化に基づく プロセス評価 松下誠 大阪大学.
欠陥検出を目的とした類似コード検索法 吉田則裕,石尾隆,松下誠,井上克郎 大阪大学 大学院情報科学研究科
ソフトウェア理解支援を目的とした 辞書の作成法
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
ソフトウェア工学 知能情報学部 新田直也.
コードクローン解析に基づく デザインパターン適用候補の検出手法
関数の変更履歴と呼び出し関係に 基づいた開発履歴理解支援システム
動的情報を利用したソフトウェア 部品重要度評価手法の提案と評価
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
識別子の読解を目的とした名詞辞書の作成方法の一試案
プログラム依存グラフを用いた ソースコードのパターン違反検出法
Presentation transcript:

メソッド間の依存関係を利用した プログラム理解支援手法の提案と実現 大阪大学大学院情報科学研究科 井上研究室  小堀一雄 修士論文発表

背景 Javaソフトウェア部品検索システム SPARS-J 目的 特徴 プログラム理解や再利用の支援 大規模資産からの高速な検索 利用実績と,キーワード出現頻度を考慮した検索結果の順位付け 検索結果の部品詳細情報を提供 修士論文発表

部品詳細表示 詳細情報を読んで利用するかどうか判断 パッケージブラウザ メソッド一覧 メソッド定義行へ移動 サブパッケージ一覧 クラス一覧 修士論文発表

問題点 既存の検索システムは、検索結果として、単一の部品に関する情報しか提示しない。 支援情報と必要情報の間にギャップが発生 一方、機能が単独の部品で実現されていることは稀であり、多くの場合は複数の部品に渡って実現されている 修士論文発表

ギャップによって生じる問題 検索 検索 検索 public void class C{ public int age; public int c(){ return age } 検索 検索 public void class B{ public int B (){ } public void b(int p){ return p +C.c(); 検索 public void class A{ public int x; public int a ( int p ){ B b = new B(); x = b.b(p); return x; } public void aa(){ x = x +1 修士論文発表

ギャップによって生じる問題 開発者は,検索結果のメソッドを起点とする一連の処理が新しい部品を呼び出さなくなるまで繰り返し検索しないと,以下の2点を知ることができない。 どこまで繋がっているか?(総規模) どこを見るべきか?(重要な処理) 開発者にとって大きな作業コスト 修士論文発表

研究の目的 ある部品から始まる一連の処理を理解するのに必要な、全ての依存部品を収集,分析して開発者に提示する 依存部品の総規模を調べる どこまで繋がっているか? 依存部品内で、特に重要な部品を解析する どこを見るべきか? 修士論文発表

提案する手法 メソッドが依存している部品群を収集,分析して表示するシステム“E-Zone” 入力 メソッド 出力 依存部品群 利用部品群 メソッド  出力 依存部品群 総規模に関するメトリクス表示,依存関係ツリー表示 “どこまで繋がっているか?” メトリクス計算により、自動的に重要部品を表示 “どこを見るべきか?” 利用部品群 再利用の具体的例として表示 修士論文発表

4 システムの構成 部品登録部 部品登録部 データベース 依存関係探索部 メトリクス計算部 データ表示部 構文解析 依存関係解析 登録時の流れ 4 検索時の流れ 部品登録部 部品登録部 構文解析 依存関係解析 ユーザ Javaファイル データベース SPARS-J 対象メソッド 依存関係探索部 システム構成は,図のようになります. 大きく分けて,部品登録部,部品検索部といった処理部と,データベースから構成されます. 青い矢印は部品登録時の流れを,赤い矢印は検索時のデータの流れを表します. 部品登録部は入力に与えられたJavaソースコードを解析し,データベースに格納します. 検索時には,ユーザがWebインタフェースを通じて入力したクエリを部品検索部が受け取って, クエリからキーワードと検索対象とするトークン種類を抽出し,データベースを検索します. 検索結果は部品検索部で順位付けされた後,表示されます. メトリクス計算部 データ表示部 修士論文発表

部品登録部 ファイル * クラス 利用関係 クラス * メソッド 利用関係 メソッド A.java public void class A{ public int x; public int a ( int p ){ B b = new B(); x = b.b(p); return x; } public void aa(){ x = x +1 1 * クラス 利用関係 クラス 1 * メソッド 利用関係 メソッド 修士論文発表

依存部品グラフ :メソッド :呼び出し関係 修士論文発表

4 システムの構成 部品登録部 部品登録部 データベース データベース 入力 依存関係探索部 依存関係探索部 メトリクス計算部 データ表示部 登録時の流れ 4 検索時の流れ 部品登録部 部品登録部 構文解析 依存関係解析 ユーザ Javaファイル データベース データベース SPARS-J 入力 対象メソッド 依存関係探索部 依存関係探索部 システム構成は,図のようになります. 大きく分けて,部品登録部,部品検索部といった処理部と,データベースから構成されます. 青い矢印は部品登録時の流れを,赤い矢印は検索時のデータの流れを表します. 部品登録部は入力に与えられたJavaソースコードを解析し,データベースに格納します. 検索時には,ユーザがWebインタフェースを通じて入力したクエリを部品検索部が受け取って, クエリからキーワードと検索対象とするトークン種類を抽出し,データベースを検索します. 検索結果は部品検索部で順位付けされた後,表示されます. メトリクス計算部 データ表示部 修士論文発表

依存部品探索部 :メソッド :起点メソッド :依存メソッド :利用メソッド 修士論文発表

4 システムの構成 部品登録部 データベース データベース 依存関係探索部 依存関係探索部 メトリクス計算部 メトリクス計算部 データ表示部 登録時の流れ 4 検索時の流れ 部品登録部 構文解析 依存関係解析 ユーザ Javaファイル データベース データベース SPARS-J 対象メソッド 依存関係探索部 依存関係探索部 システム構成は,図のようになります. 大きく分けて,部品登録部,部品検索部といった処理部と,データベースから構成されます. 青い矢印は部品登録時の流れを,赤い矢印は検索時のデータの流れを表します. 部品登録部は入力に与えられたJavaソースコードを解析し,データベースに格納します. 検索時には,ユーザがWebインタフェースを通じて入力したクエリを部品検索部が受け取って, クエリからキーワードと検索対象とするトークン種類を抽出し,データベースを検索します. 検索結果は部品検索部で順位付けされた後,表示されます. メトリクス計算部 メトリクス計算部 データ表示部 修士論文発表

メトリクス計算部 メトリクスの説明 LOC(行数) CYC(サイクロマチック数) CR(Component Rank) 規模を表すメトリクス 複雑さを表すメトリクス CR(Component Rank) 呼び出される頻度を表すメトリクス 修士論文発表

メトリクスを用いた評価 “重要部品”の解析 繰り返し呼ばれ、処理が複雑な部品は、主要な機能に強く関連している可能性が高い 閾値 高CR 繰り返し呼ばれている 高LOC/CYC 処理が複雑 赤色でハイライト 閾値 高CR:CRが上位30%以内 高LOC/CYC:CYCが3以上で,1CYC当りのLOCが3以上 修士論文発表

4 システムの構成 部品登録部 データベース データベース 依存関係探索部 メトリクス計算部 メトリクス計算部 データ表示部 データ表示部 登録時の流れ 4 検索時の流れ 部品登録部 構文解析 依存関係解析 ユーザ Javaファイル データベース データベース SPARS-J 対象メソッド 依存関係探索部 システム構成は,図のようになります. 大きく分けて,部品登録部,部品検索部といった処理部と,データベースから構成されます. 青い矢印は部品登録時の流れを,赤い矢印は検索時のデータの流れを表します. 部品登録部は入力に与えられたJavaソースコードを解析し,データベースに格納します. 検索時には,ユーザがWebインタフェースを通じて入力したクエリを部品検索部が受け取って, クエリからキーワードと検索対象とするトークン種類を抽出し,データベースを検索します. 検索結果は部品検索部で順位付けされた後,表示されます. メトリクス計算部 メトリクス計算部 データ表示部 データ表示部 修士論文発表

データ表示部 利用部品群 依存部品群 総規模 依存ツリー メトリクス ソースコード ダウンロード 修士論文発表

E-Zone 以上のような依存部品解析システムE-Zoneを構築し,SPARS-Jの一部として実現した 本システムに対して,2例のケーススタディと適用実験を行った結果を考察する 修士論文発表

利用例1 “どこまで繋がっているか?” 前提条件 総規模や依存ツリーを用いて支援する ソートを行うプログラムを作成するために,SPARS-Jに“quicksort”という検索クエリを与えて、再利用部品候補として2つのメソッドを得た。このとき、どちらが理解し易いか判断したいとする 修士論文発表

対象となる部品 部品1 org.apache.turbine.util.QuickSort.quickSort(Object, int, int, Comparable) LOC 74,CYC 11 部品2 cz.dhl.io.CoSort.QuickSort(CoFile, int, int) LOC 47,CYC 12 修士論文発表

部品群全体の規模 シンプルなquicksort 独自のデータ構造が入り込んでいる 再利用部品として理解し易いのは部品1 部品1 単 [ loc:74, cyc:11 ] 全 [ loc:76, cyc:12 ] 部品2 単 [ loc:47, cyc:12 ] 全 [ loc:94, cyc:31 ] シンプルなquicksort 独自のデータ構造が入り込んでいる 再利用部品として理解し易いのは部品1 修士論文発表

利用例2 “どこを見るべきか?” 前提条件 重要部品の表示によって支援する C++,C,Java等のソースコードを整形,再構成するソフトウェア“AStyle”のmainメソッドを起点メソッドとして、本システムに適用した。 修士論文発表

重要部品 システムに”重要部品“と判定されたメソッドが 5つあった。 詳細を以下に示す 重要メソッド名 機能 LOC CYC CR ASBeautifire.beautify ソースを整形する 918 292 20 AStyle.parseOption プログラム言語を設定 163 41 14 ASFormatter. isOneLineBlockReached ブロックが1行に収まるか判定する 52 16 ASBeautifier. getNextProgramCharDistnce 次の文字までの空白数を調べる 32 8 27 peekNextChar 次の文字を読み込む 18 5 26 修士論文発表

ツリー構造の理解 重要部品周りのツリー構造を読みとることで 重要処理の流れを理解することができる beautifyはmainメソッドから直接見えていない AStyle.main → ASFormatter.nextLine → ASBeautifier.beautify 1行ずつbeautifyを繰り返し呼び出して整形している 修士論文発表

評価実験 メトリクス評価によってシステムが自動的に判定した“重要部品”(高CR&高LOC/CYC)が、本当にソフトウェアの重要な機能を実装しているかどうかを評価する 対象 無作為に選んだ10個のソフトウェアのmainメソッド 本当に重要かどうかの判断 ソースコードやドキュメントコメントを読んで判断 mainメソッドの主要な機能=ソフトウェアの機能 修士論文発表

ソフトウェア名 依存部品数 重要部品数 (システム) (人間) 適合率 1 JEdit 237 16 10 0.625 2 JeditLogger 7 1.000 3 JGraph 49 4 Astyle 92 5 0.800 Tidy 35 6 VncViewer 102 11 0.636 GanttProject 163 12 0.917 8 FontChooser 0.000 9 Parser 94 14 0.786 ClassFinder 計 790 64 48 0.750 0.9586 修士論文発表

適合率の考察 適合率は0.750と高い数値を示した 規模の小さなソフトウェアにおいては低い適合率になった プログラムの機能を大まかに理解するには、本システムが提示する重要メソッドを見れば良い 規模の小さなソフトウェアにおいては低い適合率になった 単純な構造下では、CRが意味を持たないため 小規模の場合は,別の判断基準を用いるのが良いと考えられる 修士論文発表

まとめと今後の課題 まとめ メソッド間の依存関係を解析し,あるメソッドに対する依存部品群を表示するシステム“E-Zone”を提案し,SPARS-Jの一部として実現した 適用実験を通じて,本システムのケーススタディーを行うとともに、その有効性を検証した 今後の課題 より多くのデータを用いた有効性の検証 修士論文発表

おわり 修士論文発表

問題点2 依存解析の単位 既存の支援システムでは、クラスを単位に採用 クラスは,ある概念を象徴する物 コールグラフなど 機能の集合である場合が多い ある機能に関する依存解析としては冗長となる可能性が高い 修士論文発表

利用関係解析 public void Class Man{ public int age; 1:メソッド呼び出し 2:インスタンス化 3:変数参照 4:継承 public void Class Man{ public int age; public int last ( int now ){ Life a = new Life(); age = a.limit() - now; return age; } public void next(){ age = age +1 利用メソッド名 利用種類 被利用メソッド名 Man.last(int) 2 Life メソッド利用関係 Man.last(int) 1 Life.limit() 修士論文発表

ソースコード構文解析 public void Class Man{ ファイル public int age; 名前 ファイルパス Man.java ファイル public void Class Man{ public int age; public int last ( int now ){ Life a = new Life(); age = a.limit() - now; return age; } public void next(){ age = age +1 1 * 名前 修飾子 型 開始行 終了行 クラス 1 1 * * 変数 メソッド 名前 修飾子 型 引数 開始行 終了行 サイクロマチック数 * 1 名前 修飾子 型 修士論文発表

利用部品の解析 SPARS-Jでは、依存関係の単位としてクラスが 使われている クラス 修士論文発表

利用部品の解析 メソッドが処理を依存をしている部品は一部だけ  =クラスによる依存解析範囲は冗長となる クラス メソッド 修士論文発表

探索の範囲 探索はrootパッケージ名が変わった時点で止める 異なるrootパッケージの利用はライブラリ的利用 java. lang.* io.* org. apache. soap. server. ServiceManager * org.apacheにはたくさんのプロジェクトが紐づいているので どこまでがプロジェクト名で、どこからがソフトウェアのディレクトリ構造名かの判断かしたい。 そこで、プロジェクト名一覧を別の設定ファイルに書き出すなどして、探索を止める範囲をカスタムする必要があると考えています。 とりあえず、現状ではrootパッケージ名が変わったら止めるという仕様としています。 io.* javax. servlet.* xml. parsers.* 修士論文発表

利用関係に基づく順位付け Component Rank(CR)法 利用関係から部品重要度を評価し,順位付けする 多くの部品から利用されている部品は重要 重要な部品から利用されている部品もまた重要 5 1 1 1 A B C D 修士論文発表

CR値算出方法 部品群グラフをもとにした繰り返し計算 C1 C2 C3 C1 C2 C3 C1 C2 C3 C1 C2 C3 C1 C2 各頂点に総和を1として適当な重みを与える 頂点の重みを,出ていく辺で分配する 入ってくる辺の重みの総和を,その頂点の重みとして再定義 頂点の重みが収束するまで,2.3.を繰り返し計算 収束した重みが部品群のCR値 C1 0.334 C2 0.333 C3 C1 0.334 C2 0.333 C3 v1×50% v2×100% v3×100% C1 C2 C3 0.167 0.333 C1 0.333 C2 0.167 C3 0.500 C1 C2 C3 0.1665 0.167 0.500 C1 0.500 C2 0.1665 C3 0.3335 C1 0.400 C2 0.200 C3 われわれの研究グループが提案する、利用実績に基づく再利用性評価手法(Component Rank法)では、先に説明しました利用関係に着目し、その関係を抽出してグラフを作成します。 そして、各関係に重み付けし評価を行います。そのときの評価の方法として、非利用数が多い部品は重要である、また、重要な部品から利用されている部品も重要であるという方針で計算を行います。 修士論文発表