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

38
修修修修修修 1 メメメメメメメメメメメメメメメ メメメメメメメメメメメメメメメ メメメメメメメメメメメメメメメメメ メメメメメメメメメメメメメメメメメ 修修修修修修修修修修修修修修 修修修修修修修修修修修修修修 修修修修修 修修修修修 修修 修修

Upload: nelle-garcia

Post on 01-Jan-2016

23 views

Category:

Documents


2 download

DESCRIPTION

メソッド間の依存関係を利用した プログラム理解支援手法の提案と実現. 大阪大学大学院情報科学研究科 井上研究室  小堀一雄. 背景. Java ソフトウェア部品検索システム           SPARS-J 目的 プログラム理解や再利用の支援 特徴 大規模資産からの高速な検索 利用実績と,キーワード出現頻度を考慮した検索結果の順位付け 検索結果の部品詳細情報を提供. 部品詳細表示. パッケージブラウザ サブパッケージ一覧 クラス一覧. メソッド一覧 メソッド定義行へ移動. 詳細情報を読んで利用するかどうか判断. 問題点. - PowerPoint PPT Presentation

TRANSCRIPT

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

修士論文発表 1

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

現現

大阪大学大学院情報科学研究科大阪大学大学院情報科学研究科井上研究室井上研究室 小堀一雄 小堀一雄

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

2修士論文発表

背景背景 JavaJava ソフトウェア部品検索システム   ソフトウェア部品検索システム   

                SPARS-JSPARS-J

目的目的 プログラム理解や再利用の支援プログラム理解や再利用の支援

特徴特徴 大規模資産からの高速な検索大規模資産からの高速な検索 利用実績と,キーワード出現頻度を考慮した検利用実績と,キーワード出現頻度を考慮した検

索結果の順位付け索結果の順位付け 検索結果の部品詳細情報を提供検索結果の部品詳細情報を提供

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

3修士論文発表

部品詳細表示部品詳細表示

メソッド一覧メソッド定義行へ移動

パッケージブラウザサブパッケージ一覧クラス一覧

詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳

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

4修士論文発表

問題点問題点 既存の検索システムは、検索結果として、既存の検索システムは、検索結果として、

単一の部品に関する情報しか提示しない。単一の部品に関する情報しか提示しない。

一方、機能が単独の部品で実現されてい一方、機能が単独の部品で実現されていることは稀であり、多くの場合は複数のることは稀であり、多くの場合は複数の部品に渡って実現されている部品に渡って実現されている

支援情報と必要情報の間にギャップが発生支援情報と必要情報の間にギャップが発生

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

5修士論文発表

ギャップによって生じる問題ギャップによって生じる問題

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 }

検索検索

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 }

検索検索

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

6修士論文発表

ギャップによって生じる問題ギャップによって生じる問題 開発者は,検索結果のメソッドを起点と開発者は,検索結果のメソッドを起点と

する一連の処理が新しい部品を呼び出さする一連の処理が新しい部品を呼び出さなくなるまで繰り返し検索しないと,以なくなるまで繰り返し検索しないと,以下の下の 22 点を知ることができない。点を知ることができない。 どこまで繋がっているか?(総規模)どこまで繋がっているか?(総規模) どこを見るべきか?(重要な処理)どこを見るべきか?(重要な処理)

詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳

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

7修士論文発表

研究の目的研究の目的 ある部品から始まる一連の処理を理解すある部品から始まる一連の処理を理解す

るのに必要な、全ての依存部品を収集,るのに必要な、全ての依存部品を収集,分析して開発者に提示する分析して開発者に提示する 依存部品の総規模を調べる依存部品の総規模を調べる

どこまで繋がっているか?どこまで繋がっているか? 依存部品内で、特に重要な部品を解析する依存部品内で、特に重要な部品を解析する

どこを見るべきか?どこを見るべきか?

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

8修士論文発表

提案する手法提案する手法 メソッドが依存している部品群を収集,メソッドが依存している部品群を収集,

分析して表示するシステム“分析して表示するシステム“ E-ZoneE-Zone”” 入力入力

メソッド メソッド  出力出力

依存部品群依存部品群 総規模に関するメトリクス表示,依存関係ツリー表示総規模に関するメトリクス表示,依存関係ツリー表示

““ どこまで繋がっているか?”どこまで繋がっているか?” メトリクス計算により、自動的に重要部品を表示メトリクス計算により、自動的に重要部品を表示

““ どこを見るべきか?”どこを見るべきか?” 利用部品群利用部品群

再利用の具体的例として表示再利用の具体的例として表示

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

9修士論文発表

依存関係探索部

データベース

部品登録部

システムの構成システムの構成

SPARS-J

ユーザ

Java ファイル

登録時の流れ

検索時の流れ

詳詳

対象メソッド

メトリクス計算部 データ表示部

構文解析構文解析依存関係解析依存関係解析

部品登録部

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

10修士論文発表

部品登録部部品登録部

メソッド利用関係

クラス

メソッド

ファイル

クラス利用関係

*

*

1

1

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 }

A.javaA.java

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

11修士論文発表

依存部品グラフ依存部品グラフ:メソッド:呼び出し関係

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

12修士論文発表

依存関係探索部

データベース

部品登録部

システムの構成システムの構成

SPARS-J

データベース

ユーザ

Java ファイル

登録時の流れ

検索時の流れ

詳詳

依存関係探索部 対象メソッド

メトリクス計算部 データ表示部

構文解析構文解析依存関係解析依存関係解析

部品登録部

入力入力

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

13修士論文発表

依存部品探索部依存部品探索部:メソッド

:依存メソッド:利用メソッド

:起点メソッド

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

14修士論文発表

依存関係探索部

データベース

部品登録部

システムの構成システムの構成

SPARS-J

データベース

ユーザ

Java ファイル

登録時の流れ

検索時の流れ

詳詳

依存関係探索部 対象メソッド

メトリクス計算部 データ表示部

構文解析構文解析依存関係解析依存関係解析

メトリクス計算部

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

15修士論文発表

メトリクス計算部メトリクス計算部 メトリクスの説明メトリクスの説明

LOCLOC (行数)(行数) 規模を表すメトリクス規模を表すメトリクス

CYCCYC (サイクロマチック数)(サイクロマチック数) 複雑さを表すメトリクス複雑さを表すメトリクス

CRCR (( ComponentComponent    RankRank )) 呼び出される頻度を表すメトリクス呼び出される頻度を表すメトリクス

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

16修士論文発表

メトリクスを用いた評価メトリクスを用いた評価 ““ 重要部品”の解析重要部品”の解析

繰り返し呼ばれ、処理が複雑な部品は、主要な機能繰り返し呼ばれ、処理が複雑な部品は、主要な機能に強く関連している可能性が高いに強く関連している可能性が高い

高高 CRCR 繰り返し呼ばれている繰り返し呼ばれている

高高 LOC/CYCLOC/CYC 処理が複雑処理が複雑

赤色でハイライト赤色でハイライト

閾値閾値 高高 CRCR :: CRCR が上位が上位 30%30% 以内以内 高高 LOC/CYCLOC/CYC :: CYCCYC がが 33 以上で,以上で, 1CYC1CYC 当りの当りの LOCLOC がが 33

以上以上

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

17修士論文発表

依存関係探索部

データベース

部品登録部

システムの構成システムの構成

SPARS-J

データベース

ユーザ

Java ファイル

登録時の流れ

検索時の流れ

詳詳

対象メソッド

メトリクス計算部 データ表示部

構文解析構文解析依存関係解析依存関係解析

メトリクス計算部 データ表示部

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

18修士論文発表

詳詳詳詳詳詳詳詳詳詳

データ表示部データ表示部

詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳

詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳

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

19修士論文発表

E-ZoneE-Zone

以上のような依存部品解析システム以上のような依存部品解析システム E-E-ZoneZone を構築し,を構築し, SPARS-JSPARS-J の一部としての一部として実現した実現した

本システムに対して,本システムに対して, 22 例のケーススタ例のケーススタディと適用実験を行った結果を考察するディと適用実験を行った結果を考察する

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

20修士論文発表

利用例1利用例1 ““ どこまで繋がっているか?”どこまで繋がっているか?”

総規模や依存ツリーを用いて支援する総規模や依存ツリーを用いて支援する

前提条件前提条件 ソートを行うプログラムを作成するために,ソートを行うプログラムを作成するために,

SPARS-JSPARS-J に“に“ quicksort”quicksort” という検索クエリをという検索クエリを与えて、再利用部品候補として与えて、再利用部品候補として 22 つのメソッつのメソッドを得た。このとき、どちらが理解し易いかドを得た。このとき、どちらが理解し易いか判断したいとする判断したいとする

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

21修士論文発表

対象となる部品対象となる部品 部品部品 11

org.apache.turbine.util.QuickSort.quickSort(Oorg.apache.turbine.util.QuickSort.quickSort(Object, int, int, Comparable)bject, int, int, Comparable)

LOCLOC    7474 ,, CYCCYC    1111

部品部品 22 cz.dhl.io.CoSort.QuickSort(CoFile, int, int)cz.dhl.io.CoSort.QuickSort(CoFile, int, int) LOCLOC    4747 ,, CYCCYC    1212

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

22修士論文発表

部品部品 22単 単 [ loc:47, cyc:12 ][ loc:47, cyc:12 ]全 全 [ loc:94, cyc:31 ][ loc:94, cyc:31 ]

部品部品 1 1 単 単 [ loc:74, cyc:11 ][ loc:74, cyc:11 ]全 全 [ loc:76, cyc:12 ][ loc:76, cyc:12 ]

詳詳詳詳詳詳詳詳詳詳 quicksortquicksort 詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳入り込んで入り込んでいるいる

再利用部品として理解し易いのは部品再利用部品として理解し易いのは部品11

部品群全体の規模部品群全体の規模

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

23修士論文発表

利用例2利用例2 ““ どこを見るべきか?”どこを見るべきか?”

重要部品の表示によって支援する重要部品の表示によって支援する

前提条件前提条件 C++,C,JavaC++,C,Java 等のソースコードを整形,再構等のソースコードを整形,再構

成するソフトウェア“成するソフトウェア“ AStyleAStyle”” のの mainmain メソッメソッドを起点メソッドとして、本システムに適用ドを起点メソッドとして、本システムに適用した。した。

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

24修士論文発表

重要部品重要部品

重要メソッド名重要メソッド名 機能機能 LOCLOC CYCYCC

CRCR

ASBeautifire.beautifyASBeautifire.beautify ソースを整形するソースを整形する 918918 292292 2020

AStyle.parseOptionAStyle.parseOption プログラム言語を設定プログラム言語を設定 163163 4141 1414

ASFormatter.ASFormatter.

isOneLineBlockReachedisOneLineBlockReachedブロックがブロックが 11 行に収ま行に収まるか判定するるか判定する

5252 1414 1616

ASBeautifier.ASBeautifier.

getNextProgramCharDistncegetNextProgramCharDistnce次の文字までの空白数次の文字までの空白数を調べるを調べる

3232 88 2727

ASFormatter.ASFormatter.

peekNextCharpeekNextChar次の文字を読み込む次の文字を読み込む 1818 55 2626

システムに”重要部品“と判定されたメソッドがシステムに”重要部品“と判定されたメソッドが55 つあった。つあった。

詳細を以下に示す詳細を以下に示す

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

25修士論文発表

ツリー構造の理解ツリー構造の理解

重要部品周りのツリー構造を読みとるこ重要部品周りのツリー構造を読みとることでとで重要処理の流れを理解することができる重要処理の流れを理解することができる

beautifybeautify はは mainmain メソッドから直接見えていないメソッドから直接見えていない AStyle.main → ASFormatter.nextLine → ASBeautifier.beautifyAStyle.main → ASFormatter.nextLine → ASBeautifier.beautify 11 行ずつ行ずつ beautifybeautify を繰り返し呼び出して整形しているを繰り返し呼び出して整形している

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

26修士論文発表

評価実験評価実験 メトリクス評価によってシステムが自動的に判メトリクス評価によってシステムが自動的に判

定した定した“重要部品”(高 CR&高 LOC/CYC)が、が、本当にソフトウェアの重要な機能を実装してい本当にソフトウェアの重要な機能を実装しているかどうかを評価するるかどうかを評価する

対象対象 無作為に選んだ無作為に選んだ 1010個のソフトウェアの個のソフトウェアの mainmain メソッメソッ

ドド 本当に重要かどうかの判断本当に重要かどうかの判断

ソースコードやドキュメントコメントを読んで判断ソースコードやドキュメントコメントを読んで判断

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

27修士論文発表

ソフトウェア名ソフトウェア名 依存部品数依存部品数 重要部品数重要部品数(システ(システム)ム)

重要部品数重要部品数(人間)(人間)

適合率適合率

1 JEditJEdit 237237 1616 1010 0.6250.625

22 JeditLoggerJeditLogger 77 11 11 1.0001.000

33 JGraphJGraph 4949 11 11 1.0001.000

44 AstyleAstyle 9292 55 44 0.8000.800

55 TidyTidy 3535 22 22 1.0001.000

66 VncViewerVncViewer 102102 1111 77 0.6360.636

77 GanttProjectGanttProject 163163 1212 1111 0.9170.917

88 FontChooserFontChooser 33 11 00 0.0000.000

99 ParserParser 9494 1414 1111 0.7860.786

1010 ClassFinderClassFinder 88 11 11 1.0001.000

計計 790790 6464 4848 0.7500.750

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

28修士論文発表

適合率の考察適合率の考察 適合率は適合率は 0.7500.750 と高い数値を示したと高い数値を示した

プログラムの機能を大まかに理解するには、本プログラムの機能を大まかに理解するには、本システムが提示する重要メソッドを見れば良いシステムが提示する重要メソッドを見れば良い

規模の小さなソフトウェアにおいては低い規模の小さなソフトウェアにおいては低い適合率になった適合率になった 単純な構造下では、単純な構造下では、 CRCR が意味を持たないためが意味を持たないため 小規模の場合は,別の判断基準を用いるのが良小規模の場合は,別の判断基準を用いるのが良

いと考えられるいと考えられる

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

29修士論文発表

まとめと今後の課題まとめと今後の課題 まとめまとめ

メソッド間の依存関係を解析し,あるメソッドメソッド間の依存関係を解析し,あるメソッドに対する依存部品群を表示するシステム“に対する依存部品群を表示するシステム“ E-E-ZoneZone”” を提案し,を提案し, SPARS-JSPARS-J の一部として一部として実現実現したした

適用実験を通じて,本システムのケーススタデ適用実験を通じて,本システムのケーススタディーを行うとともに、その有効性を検証したィーを行うとともに、その有効性を検証した

今後の課題今後の課題 より多くのデータを用いた有効性の検証より多くのデータを用いた有効性の検証

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

30修士論文発表

おわりおわり

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

31修士論文発表

問題点2問題点2 依存解析の単位依存解析の単位

既存の支援システムでは、クラスを単位に採既存の支援システムでは、クラスを単位に採用用コールグラフなどコールグラフなど

クラスは,ある概念を象徴する物クラスは,ある概念を象徴する物 機能の集合である場合が多い機能の集合である場合が多い ある機能に関する依存解析としては冗長となる可ある機能に関する依存解析としては冗長となる可

能性が高い能性が高い

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

32修士論文発表

Man.last(int)2Life

Man.last(int)1Life.limit()

利用関係解析利用関係解析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 :メソッド呼び出し2: インスタンス化3:変数参照4:継承

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

33修士論文発表

ソースコード構文解析ソースコード構文解析

クラス

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

Man.java

名前修飾子型

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

34修士論文発表

利用部品の解析利用部品の解析

詳詳詳詳詳詳

SPARS-JSPARS-J 詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳

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

35修士論文発表

利用部品の解析利用部品の解析

詳詳詳詳詳詳

詳詳詳詳詳詳詳詳

詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳  詳  詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳詳

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

36修士論文発表

探索の範囲探索の範囲 探索は探索は rootroot パッケージ名が変わった時点で止めパッケージ名が変わった時点で止め

るる 異なる異なる rootroot パッケージの利用はライブラリ的利用パッケージの利用はライブラリ的利用java.java. lang.*lang.*

io.*io.*

org.org. apache.apache.

io.*io.*

soap.soap. serverserver..

javax.javax. servlet.*servlet.*

xml.xml. parsers.*parsers.*

ServiceManagerServiceManager

**

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

37修士論文発表

利用関係に基づく順位付け利用関係に基づく順位付け Component Rank(CR)Component Rank(CR) 法法

利用関係から部品重要度を評価し,順位付け利用関係から部品重要度を評価し,順位付けするする 多くの部品から利用されている部品は重要多くの部品から利用されている部品は重要 重要な部品から利用されている部品もまた重要重要な部品から利用されている部品もまた重要

AA BB CC DD55 11 11 11

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

38修士論文発表

部品群グラフをもとにした繰り返し計算部品群グラフをもとにした繰り返し計算1.1. 各頂点に各頂点に総和を総和を 11 としてとして適当な重みを与える適当な重みを与える2.2. 頂点の重みを,出ていく辺で分配する頂点の重みを,出ていく辺で分配する3.3. 入ってくる辺の重みの総和を,その頂点の重みとして入ってくる辺の重みの総和を,その頂点の重みとして

再定義再定義4.4. 頂点の重みが収束するまで,頂点の重みが収束するまで, 2.3.2.3. を繰り返し計算を繰り返し計算5.5. 収束した重みが部品群の収束した重みが部品群の CRCR 値値

C10.334

C20.333

C30.333

C10.334

C20.333

C30.333

v1×50%

v1×50%

v2×100%v3×100%

C1 C2

C3

0.167

0.167

0.3330.333

C10.333

C20.167

C30.500

C1 C2

C3

0.1665

0.1665

0.1670.500

C10.500

C20.1665

C30.3335

C10.400

C20.200

C30.400

0.200

0.200

0.2000.400

CRCR 値算出方法値算出方法