380 likes | 449 Views
メソッド間の依存関係を利用した プログラム理解支援手法の提案と実現. 大阪大学大学院情報科学研究科 井上研究室 小堀一雄. 背景. Java ソフトウェア部品検索システム SPARS-J 目的 プログラム理解や再利用の支援 特徴 大規模資産からの高速な検索 利用実績と,キーワード出現頻度を考慮した検索結果の順位付け 検索結果の部品詳細情報を提供. 部品詳細表示. パッケージブラウザ サブパッケージ一覧 クラス一覧. メソッド一覧 メソッド定義行へ移動. 詳細情報を読んで利用するかどうか判断. 問題点.
E N D
メソッド間の依存関係を利用したプログラム理解支援手法の提案と実現メソッド間の依存関係を利用したプログラム理解支援手法の提案と実現 大阪大学大学院情報科学研究科 井上研究室 小堀一雄 修士論文発表
背景 • Javaソフトウェア部品検索システム SPARS-J • 目的 • プログラム理解や再利用の支援 • 特徴 • 大規模資産からの高速な検索 • 利用実績と,キーワード出現頻度を考慮した検索結果の順位付け • 検索結果の部品詳細情報を提供 修士論文発表
部品詳細表示 パッケージブラウザ サブパッケージ一覧クラス一覧 メソッド一覧メソッド定義行へ移動 詳細情報を読んで利用するかどうか判断 修士論文発表
問題点 • 既存の検索システムは、検索結果として、単一の部品に関する情報しか提示しない。 支援情報と必要情報の間にギャップが発生 • 一方、機能が単独の部品で実現されていることは稀であり、多くの場合は複数の部品に渡って実現されている 修士論文発表
検索 検索 public void class B{ public int B (){ } public void b(int p){ return p +C.c(); } public void class C{ public int age; public int c(){ return age } ギャップによって生じる問題 検索 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 検索時の流れ 部品登録部 部品登録部 構文解析 依存関係解析 Javaファイル データベース SPARS-J 対象メソッド 依存関係探索部 メトリクス計算部 データ表示部 修士論文発表
部品登録部 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 検索時の流れ 部品登録部 部品登録部 構文解析 依存関係解析 Javaファイル データベース データベース SPARS-J 入力 対象メソッド 依存関係探索部 依存関係探索部 メトリクス計算部 データ表示部 修士論文発表
:起点メソッド :依存メソッド :利用メソッド 依存部品探索部 :メソッド 修士論文発表
ユーザ システムの構成 登録時の流れ 4 検索時の流れ 部品登録部 構文解析 依存関係解析 Javaファイル データベース データベース SPARS-J 対象メソッド 依存関係探索部 依存関係探索部 メトリクス計算部 メトリクス計算部 データ表示部 修士論文発表
メトリクス計算部 • メトリクスの説明 • LOC(行数) • 規模を表すメトリクス • CYC(サイクロマチック数) • 複雑さを表すメトリクス • CR(ComponentRank) • 呼び出される頻度を表すメトリクス 修士論文発表
メトリクスを用いた評価 • “重要部品”の解析 • 繰り返し呼ばれ、処理が複雑な部品は、主要な機能に強く関連している可能性が高い • 高CR • 繰り返し呼ばれている • 高LOC/CYC • 処理が複雑 • 赤色でハイライト • 閾値 • 高CR:CRが上位30%以内 • 高LOC/CYC:CYCが3以上で,1CYC当りのLOCが3以上 修士論文発表
ユーザ システムの構成 登録時の流れ 4 検索時の流れ 部品登録部 構文解析 依存関係解析 Javaファイル データベース データベース SPARS-J 対象メソッド 依存関係探索部 メトリクス計算部 メトリクス計算部 データ表示部 データ表示部 修士論文発表
データ表示部 利用部品群 • 依存部品群 • 総規模 • 依存ツリー • メトリクス ソースコード ダウンロード 修士論文発表
E-Zone • 以上のような依存部品解析システムE-Zoneを構築し,SPARS-Jの一部として実現した • 本システムに対して,2例のケーススタディと適用実験を行った結果を考察する 修士論文発表
利用例1 • “どこまで繋がっているか?” • 総規模や依存ツリーを用いて支援する • 前提条件 • ソートを行うプログラムを作成するために,SPARS-Jに“quicksort”という検索クエリを与えて、再利用部品候補として2つのメソッドを得た。このとき、どちらが理解し易いか判断したいとする 修士論文発表
対象となる部品 • 部品1 • org.apache.turbine.util.QuickSort.quickSort(Object, int, int, Comparable) • LOC74,CYC11 • 部品2 • cz.dhl.io.CoSort.QuickSort(CoFile, int, int) • LOC47,CYC12 修士論文発表
部品群全体の規模 部品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つあった。 詳細を以下に示す 修士論文発表
ツリー構造の理解 • beautifyはmainメソッドから直接見えていない • AStyle.main → ASFormatter.nextLine → ASBeautifier.beautify • 1行ずつbeautifyを繰り返し呼び出して整形している 重要部品周りのツリー構造を読みとることで 重要処理の流れを理解することができる 修士論文発表
評価実験 • メトリクス評価によってシステムが自動的に判定した“重要部品”(高CR&高LOC/CYC)が、本当にソフトウェアの重要な機能を実装しているかどうかを評価する • 対象 • 無作為に選んだ10個のソフトウェアのmainメソッド • 本当に重要かどうかの判断 • ソースコードやドキュメントコメントを読んで判断 修士論文発表
適合率の考察 • 適合率は0.750と高い数値を示した • プログラムの機能を大まかに理解するには、本システムが提示する重要メソッドを見れば良い • 規模の小さなソフトウェアにおいては低い適合率になった • 単純な構造下では、CRが意味を持たないため • 小規模の場合は,別の判断基準を用いるのが良いと考えられる 修士論文発表
まとめと今後の課題 • まとめ • メソッド間の依存関係を解析し,あるメソッドに対する依存部品群を表示するシステム“E-Zone”を提案し,SPARS-Jの一部として実現した • 適用実験を通じて,本システムのケーススタディーを行うとともに、その有効性を検証した • 今後の課題 • より多くのデータを用いた有効性の検証 修士論文発表
おわり 修士論文発表
問題点2 • 依存解析の単位 • 既存の支援システムでは、クラスを単位に採用 • コールグラフなど • クラスは,ある概念を象徴する物 • 機能の集合である場合が多い • ある機能に関する依存解析としては冗長となる可能性が高い 修士論文発表
利用関係解析 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() 修士論文発表
ソースコード構文解析 名前 ファイルパス 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 * io.* javax. servlet.* xml. parsers.* 修士論文発表
利用関係に基づく順位付け • Component Rank(CR)法 • 利用関係から部品重要度を評価し,順位付けする • 多くの部品から利用されている部品は重要 • 重要な部品から利用されている部品もまた重要 5 1 1 1 A B C D 修士論文発表
C1 0.333 C1 0.334 C1 0.334 C1 C2 0.333 C2 0.333 C2 0.167 C2 0.167 v1×50% v1×50% 0.167 C1 0.500 C1 C2 0.1665 C2 0.333 v3×100% 0.1665 v2×100% 0.333 C3 0.500 C3 0.333 C3 0.333 C3 C1 0.400 C2 0.200 0.1665 0.200 0.500 0.167 0.200 C3 C3 0.3335 0.400 0.200 C3 0.400 CR値算出方法 • 部品群グラフをもとにした繰り返し計算 • 各頂点に総和を1として適当な重みを与える • 頂点の重みを,出ていく辺で分配する • 入ってくる辺の重みの総和を,その頂点の重みとして再定義 • 頂点の重みが収束するまで,2.3.を繰り返し計算 • 収束した重みが部品群のCR値 修士論文発表