Presentation is loading. Please wait.

Presentation is loading. Please wait.

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

Similar presentations


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

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

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

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

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

5 ギャップによって生じる問題 検索 検索 検索 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 修士論文発表

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

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

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

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

10 部品登録部 ファイル * クラス 利用関係 クラス * メソッド 利用関係 メソッド 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 * メソッド 利用関係 メソッド 修士論文発表

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

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

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

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

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

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

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

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

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

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

21 対象となる部品 部品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 修士論文発表

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

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

24 重要部品 システムに”重要部品“と判定されたメソッドが 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 修士論文発表

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

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

27 ソフトウェア名 依存部品数 重要部品数 (システム) (人間) 適合率 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 修士論文発表

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

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

30 おわり 修士論文発表

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

32 利用関係解析 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() 修士論文発表

33 ソースコード構文解析 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 名前 修飾子 修士論文発表

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

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

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

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

38 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法)では、先に説明しました利用関係に着目し、その関係を抽出してグラフを作成します。 そして、各関係に重み付けし評価を行います。そのときの評価の方法として、非利用数が多い部品は重要である、また、重要な部品から利用されている部品も重要であるという方針で計算を行います。 修士論文発表


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

Similar presentations


Ads by Google