(57)【特許請求の範囲】
【請求項１】
複数のソースコードの関係を可視化するためのソースコード類似関係可視化装置において、
前記複数のソースコード間の類似度を解析するソースコード解析情報を生成するソースコード解析情報生成手段と、
前記ソースコード解析情報に基づいて複数のソースコード間のソースコード間類似度を算出する類似度分析手段と、
前記複数のソースコードそれぞれをノードとし、前記ソースコードから前記類似度分析手段により算出された類似度が所定の類似度閾値以上を有するソースコードを抽出し、抽出されたソースコードを接続することで、ソースコード間類似度が前記類似度閾値以上となる類似関係をエッジとする無向グラフ構造を生成するグラフ構造生成手段と、
前記無向グラフ構造を表示する表示手段とを有し、
前記ソースコード解析情報生成手段は、前記複数のソースコードそれぞれに関するソースコード行数を出力し、
前記表示手段は、前記ソースコード行数に基づいて、前記複数のソースコードそれぞれを示すノードのサイズを設定し、
前記グラフ構造生成手段は、前記グラフ構造に基づいて連結グラフを構成するソースコードを同一グループとする連結グループ情報を出力する連結グラフ分析手段を有し、
前記表示手段は、前記連結グループ情報に基づいて、同一グループに属するソースコードを示すノードを同色で表示するソースコード配色手段を有することを特徴とするソースコード類似関係可視化装置。
【請求項２】
複数のソースコードの関係を可視化するためのソースコード類似関係可視化装置において、
前記複数のソースコード間の類似度を解析するソースコード解析情報を生成するソースコード解析情報生成手段と、
前記ソースコード解析情報に基づいて複数のソースコード間のソースコード間類似度を算出する類似度分析手段と、
前記複数のソースコードそれぞれをノードとし、前記ソースコードから前記類似度分析手段により算出された類似度が所定の類似度閾値以上を有するソースコードを抽出し、抽出されたソースコードを接続することで、ソースコード間類似度が前記類似度閾値以上となる類似関係をエッジとする無向グラフ構造を生成するグラフ構造生成手段と、
前記無向グラフ構造を表示する表示手段とを有し、
前記ソースコード解析情報生成手段は、前記複数のソースコードそれぞれに関するソースコード行数を出力し、
前記表示手段は、前記ソースコード行数に基づいて、前記複数のソースコードそれぞれを示すノードのサイズを設定し、
前記グラフ構造生成手段は、前記グラフ構造に基づいて完全グラフを構成するソースコードを同一グループとする完全グループ情報を出力する完全グラフ分析手段を有し、
前記表示手段は、前記完全グループ情報に基づいて、同一グループに属するソースコードを示すノードを同色で表示するソースコード配色手段を有することを特徴とするソースコード類似関係可視化装置。
【請求項３】
前記ソースコード配色手段は、前記連結グループ情報に基づいて、他のソースコードとの類似関係にない独立したソースコード群を同色で表示する独立ソースコード配色手段を有することを特徴とする請求項１記載のソースコード類似関係可視化装置。
【請求項４】
当該ソースコード類似関係可視化装置のユーザが前記類似度閾値を設定する類似度閾値設定手段を更に有することを特徴とする請求項１乃至３のいずれかに記載のソースコード類似関係可視化装置。
【請求項５】
前記グラフ構造生成手段は、前記類似度閾値設定手段により閾値が変更された際には、当該変更に応じて前記無向グラフ構造を再生成することを特徴とする請求項４記載のソースコード類似関係可視化装置。
【請求項６】
前記類似度閾値設定手段は、設定閾値の最小値を類似度0%、最大値を類似度100%とするスライダであることを特徴とする請求項４または５のいずれかに記載のソースコード類似関係可視化装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、複数のソフトウエア、その中でも特にソースコード間の類似関係を可視化するための技術に関するものである。
【背景技術】
【０００２】
ソフトウェアの適用範囲の拡大に伴って、レガシーソフトウェアと呼ばれるソフトウェアが拡大している。レガシーソフトウェアとは、システムへの新たな要求に対する機能追加や修正が繰り返された結果、ソフトウェアの規模や複雑さが増大し、保守が難しくなっているソフトウェアである。
【０００３】
レガシーソフトウェアの保守コスト増大の原因の一つとして、コードクローンと呼ばれる、類似ソースコードが挙げられている。コードクローンとは、ソースコード中の類似したコード列のことであり、主にソースコードの流用を行うことにより生成される。多数のコードクローンを含むソフトウェアでは、システム全体のコードサイズが増大することに加え、類似する多数のコード列の一つに変更を加える際に、他のすべての類似箇所にも同様の変更を行わなければならないことが多く、保守コストを増大させる原因となる。
【０００４】
このようなレガシーソフトウェアの保守を行うためには、保守対象となるソフトウェアにおいて、ソースコード間の類似関係を理解することが重要となる。レガシーソフトウェアでは数千ファイル、数百万行規模で構成されるシステムも多い。このような大規模システムにおけるソースコードの類似関係理解を支援することが必要不可欠である。
【０００５】
特に、保守性が低下したレガシーソフトウェアの構造を改良するためには、類似したソースコード群を特定し、その類似部分を共通ソースコードとして共通化することが重要となる。本発明はレガシーソフトウェアの構造改良を支援するため、複数ソースコードで構成されるシステムにおける類似ソースコード群の分布をユーザが容易に理解できる、ソースコード類似関係可視化装置を提供することを目的とする。
【０００６】
下記非特許文献１には、一般に「diff」と呼ばれるソースコード分析装置の例が示されている。第一のソースコードと第二のソースコードとを比較し、共通する行と差分となる行とを明示する。
【０００７】
下記特許文献１には、それぞれが複数のソースコードで構成される二つのシステム間の類似を計測するソースコード類似度計測装置の例が示されている。二つのシステム間の共通部分と差分とを分析するとともに、システム間の類似度を評価する。また、システム間の類似度に基づいて樹形図を表示する表示手段を備えている。
【０００８】
下記非特許文献２には、複数のソースコード間における類似箇所を抽出するコードクローン解析装置の例が示されている。ソースコードをトークンと呼ばれる単位に分解するとともに、システム内で類似している箇所を抽出している。また、マトリクス形式で類似箇所の分布を表示する表示手段を備えている。
【０００９】
下記非特許文献３には、複数システム間の類似度に基づいてグラフ構造を用いて表示する複数システム間類似関係可視化装置の例が示されている。複数システム間の類似度を計測したうえで、あるシステムから最も類似したシステムに対してエッジを張り、類似システムの派生関係を表示するものである。
【００１０】
下記非特許文献４には、ネットワーク（グラフ構造）の可視化装置の例が示されている。ノードとエッジで構成されるグラフ構造に対する可視化技術を開示したものである。
【先行技術文献】
【特許文献】
【００１１】
【特許文献１】特開２００３−２１６４２５号公報
【非特許文献】
【００１２】
【非特許文献１】J. W. Hunt and M. D. McIlroy, An algorithm for differential file comparison, Bell Telephone Laboratories CSTR #41, 1976.
【非特許文献２】Kamiya, T.  Kusumoto, S.  Inoue, K. CCFinder: a multilinguistic token-based code clone detection system for large scale source code, IEEE Transactions on Software Engineering, Vol. 28, No.7, pp.654-670, 2002.
【非特許文献３】Eytan Adar and Miryung Kim. 2007. SoftGUESS: Visualization and Exploration of Code Clones in Context. In Proceedings of the 29th international conference on Software Engineering (ICSE '07), pp762-766、2007.
【非特許文献４】三末和男、ネットワークの可視化技術、電子情報通信学会誌、Vol.92、No.2、pp.112-117、2009。
【発明の概要】
【発明が解決しようとする課題】
【００１３】
上記非特許文献１に記載された技術では、数千ファイルで構成されるレガシーソフトウェアに適用すると、分析結果がファイル数の二乗で増加するため、類似関係の理解に多大な時間を要するという課題がある。
【００１４】
上記特許文献１に記載された技術では、最も類似したシステム間での樹形図として表示されるため、複数ソースコードで構成されるシステム内部での類似ソースコード分布を分析するという目的には適用できない。また、ソースコードを特許文献１における分析単位として適用すると、数千の構成要素の持つ樹形図となり、可読性が大幅に低下するという課題がある。
【００１５】
上記非特許文献２に記載された技術では、複数ソースコード内部における類似箇所を表示しているものであり、類似したソースコード群の抽出という目的には十分ではない。特に、ソースコードをさらに分解したトークンを単位として可視化を行っているため、数百万行規模のシステムを可視化した場合、マトリクスが大規模となり、可読性が大幅に低下するという課題がある。
【００１６】
上記非特許文献３に記載された技術は、複数システムの派生関係の可視化を目的としたものであるため、最も類似したシステム間でエッジを張りグラフするという特徴を持っているため、類似ソースコード群を抽出するという目的には十分ではない。一例として、「お互いに80%以上類似しているソースコード群を抽出する」という目的には適用できないという課題がある。
【００１７】
上記非特許文献４には一般のグラフ構造可視化装置、特に無向グラフにおけるノードの配置に関する技術が開示されている。しかしながら、類似ソースコード群の抽出という目的に際してどのようにグラフ構造を生成するかという、ソースコード解析分野特有の課題については触れられていないため、そのままではソースコード類似関係の可視化には適用できないという課題がある。
【課題を解決するための手段】
【００１８】
上記の課題を解決するために、本発明では、表示対象となる複数ソフトウエア(例えばソースコード)のそれぞれをノードとし、これらのうち所定の類似度以上を有するものを抽出して、これらを接続することで、ソースコード間類似度が所定の類似度閾値以上となる類似関係をエッジとする無向グラフ構造を生成してソースコード類似関係を表示するものである。なお、所定の類似度については、ユーザが類似度閾値を設定可能とする構成としてもよい。
【発明の効果】
【００１９】
本発明によれば、複数ソースコード(ソフトウエア)で構成されるシステム内におけるソースコードの類似関係を図示することが出来る。
【図面の簡単な説明】
【００２０】
【図１】本発明の一実施の形態に係るソースコード類似関係可視化装置１０の構成図である。
【図２】ソースコード類似関係可視化装置１０の処理を示す図である。
【図３】ソースコード類似関係を示す図である。
【図４】類似度分析部１２の処理の流れを示す図である。
【図５】類似度計算処理ステップＳ１２３の処理の流れを示す図である。
【図６】重み付き隣接行列Ｓ１２１を示す図である。
【図７】グラフ構造生成部１５の処理を示す図である。
【図８】隣接行列Ａ１５２を示す図である。
【図９】ファイル情報生成部１１の構成を示す図である。
【図１０】ファイル情報１１５を示す図である。
【図１１】出力結果５１を示す図である。
【発明を実施するための形態】
【００２１】
図１は、本発明の一実施の形態に係るソースコード類似関係可視化装置１０の構成図である。ソースコード類似関係可視化装置１０は、メモリ１と、分析対象であるソースコードを格納するファイルデータベース２と、演算処理を実行するプロセッサ３と、ユーザの入力を受け付ける入力部４と、ユーザに対して分析結果を表示する出力部５と、データのやり取りを行うバス６とを備える。また、ネットワーク７を経由して、外部のファイルデータベース８から分析対象であるソースコードを取得してもよい。なお、下記で示す各部（類似度分析部１２等）で実行するフローチャートは、上記プロセッサ３が図示しないプログラムに従って演算するものである。
【００２２】
メモリ１には、ソースコード類似関係可視化処理を実行するための、ファイル情報生成部１１と、類似度分析部１２と、類度閾値設定部１３と、グラフ構造生成部１５と、表示情報生成部１４とを備える。
【００２３】
図２は、ソースコード類似関係可視化装置１０の処理の流れを示す図である。分析対象はソースコードが記述されている任意のN個のファイル２１である。ファイル２１はデータベース２、外部データベース８から取得する。類似度分析部１２は、ファイル２１に基づいて、ファイル間の類似度を要素とするN行N列の重み付き隣接行列を生成する。ユーザは入力部４を用いてソースコード類似関係可視化装置１０を操作し、類似度閾値設定部１３より類似度閾値を設定する。類似度閾値は類似度閾値設定部１３に記憶される。グラフ構造生成部１５は、重み付き隣接行列と閾値に基づいて、閾値未満の要素を0に、閾値以上の要素を1に変換したN行N列の隣接行列を生成する。ファイル情報生成部１１は、ファイル２１と隣接行列とに基づいて、Nファイル分のファイル情報を生成する。表示情報生成部１４は、隣接行列とファイル情報に基づいて図式化を行い、出力部５に表示する。
【００２４】
図３は、本実施の形態で分析対象とするソースコード類似関係を示す図である。ここでは、任意の二つのファイルｉ（ｆｉ）２１１とファイルｊ（ｆｊ）２１２との間の類似関係を例とする。ファイルｉ２１１の行数をＬ（ｆｉ）、ファイルｊ２１２の行数をＬ（ｆｊ）とする。Ｓ１２３２でファイルｉ２１１とファイルｊ２１２との差分を分析する。Ｓ１２３２の処理内容については、非特許文献１に記載されているため、詳細は省く。Ｓ１２３２の結果、ファイルｉｊ間差分２１３が出力される。各行一桁目が差分の内容を示しており、「＜」はファイルｉ２１１にのみ含まれていることを、「＞」はファイルｊ２１２にのみ含まれていることをそれぞれ示す。ファイルｉｊ間差分２１３の行数を、Ｌ（Ｄｉｊ）とする。
【００２５】
ファイルｉ２１１とファイルｊ２１２との間の類似度Ｓｉｊの計算式を以下に示す。類似度Ｓｉｊは、ファイルｉ，ｊ間での共通行数Ｌ（ｆｉ∧ｆｊ）と、独立行数Ｌ（ｆｉ∨ｆｊ）により求める。
Ｓｉｊ＝Ｌ（ｆｉ∧ｆｊ）／Ｌ（ｆｉ∨ｆｊ）  （数１）
共通行数Ｌ（ｆｉ∧ｆｊ）は、以下の式により求める。
Ｌ（ｆｉ∧ｆｊ）＝（Ｌ（ｆｉ）＋Ｌ（ｆｊ）−Ｌ（Ｄｉｊ））／２  （数２）
独立行数Ｌ（ｆｉ∨ｆｊ）は以下の式により求める。
Ｌ（ｆｉ∨ｆｊ）＝Ｌ（ｆｉ）＋Ｌ（ｆｊ）−Ｌ（ｆｉ∧ｆｊ）  （数３）
図４は、類似度分析部１２の処理の流れを示すフローチャートである。ステップＳ１２１から処理を開始する。ステップＳ１２２でファイルＩＤを示す変数ｉとｊに１を代入して初期化し、ステップＳ１２３に進む。ステップＳ１２３ではファイルｉとｊとの間における類似度計算処理を行い、ＳｉｊおよびＳｊｉに代入する。なお、ＳｉｊとＳｊｉとは等しいため、Ｓｉｊの計算結果をＳｊｉにも代入する。その後、ステップＳ１２４に進み、ｊがファイル数Ｎ未満であるか否かをチェックし、Ｎ未満であればステップＳ１２５に進み、Ｎ以上であればステップＳ１２６に進む。ステップＳ１２５ではｊに１を加算し、ステップＳ１２３に進む。ステップＳ１２６ではｉがファイル数Ｎ未満であるか否かを判定し、Ｎ未満であればステップＳ１２７に進み、Ｎ以上であればステップＳ１２８に進む。ステップＳ１２７ではｉに１を加算したのち、ｊにｉを加算し、ステップＳ１２３に進む。ステップＳ１２８で処理を終了する。
【００２６】
図５は、類似度計算処理ステップＳ１２３の処理の流れを示すフローチャートである。ファイルｉとファイルｊ、二つのソースファイル２１３を入力とする。ステップＳ１２３１ではファイルｉとファイルｊそれぞれの行数Ｌ（ｆｉ）、Ｌ（ｆｊ）を計測する。ステップＳ１２３２では、ファイルｉとファイルｊとの差分Ｄｉｊを分析する。ステップＳ１２３３では、差分Ｄｉｊの行数を計測する。ステップＳ１２３４では、（数２）に基づいて、共通行数を計算する。ステップＳ１２３５では、（数１）（数３）に基づいて、ファイル間類似度Ｓｉｊを計算する。  
【００２７】
図６は、類似時計算の結果得られる重み付き隣接行列Ｓ１２１を示したものである。Ｎファイル×Ｎファイルの類似度計算結果で構成されている。たとえば、ファイルＦ０１とファイルＦ０５との類似度は０．０１であり、ファイルＦ０３とファイルＦ０４との類似度は０．９３である。
【００２８】
図７は、グラフ構造生成部１５の詳細な処理を示すフローチャートである。ステップＳ１５０から処理を開始する。ステップＳ１５１でファイルＩＤを示す変数ｉとｊに１を代入して初期化し、ステップＳ１５２に進む。ステップＳ１５２では類似度Ｓｉｊが類似度閾値Ｔ以上か否かを判定し、閾値以上であればステップＳ１５３に進み、閾値未満であればステップＳ１５４に進む。ステップＳ１５３では隣接行列Ａの要素であるＡｉｊとＡｊｉに１を代入し、ステップＳ１５５に進む。ステップＳ１５４では隣接行列Ａの要素であるＡｉｊとＡｊｉに０を代入し、ステップＳ１５５に進む。
【００２９】
ステップＳ１５５ではｊがファイル数Ｎ未満であるか否かをチェックし、Ｎ未満であればステップＳ１５６に進み、Ｎ以上であればステップＳ１５７に進む。ステップＳ１５６ではｊに１を加算し、ステップＳ１５２に進む。ステップＳ１５７ではｉがファイル数Ｎ未満であるか否かを判定し、Ｎ未満であればステップＳ１５８に進み、Ｎ以上であればステップＳ１５９に進む。ステップＳ１５８ではｉに１を加算したのち、ｊにｉを加算し、ステップＳ１５２に進む。ステップＳ１５９で処理を終了する。
【００３０】
図８は、隣接行列Ａ１５２を示す図である。図６に示した重み付隣接行列Ｓに対して、類似度判定閾値Ｔを0.9とした場合の変換結果である。類似度Ｓｉｊが０．９未満の要素は０となり、０．９以上の要素は１となる。
【００３１】
図９は、ファイル情報生成部１１の構成を示す図である。ファイル情報生成部１１は、ファイルの行数を計測するファイル行数計測部１１１と、隣接行列Ａ１５２に基づいて連結グラフ成分を抽出する連結グラフ解析部１１２と、隣接行列Ａ１５２に基づいて完全グラフ成分を抽出する完全グラフ解析部１１３と、連結グラフに属していないファイルを判定する独立ファイル判定部１１４とで構成される。連結グラフ解析部１１２および完全グラフ解析部１１３の処理内容は、一般的な無向グラフにおける連結成分解析およびクリーク解析と同様であり、たとえばｉＧｒａｐｈ等のオープンソースライブラリによって実装されているので、処理内容の説明は省略する。
【００３２】
図１０は、ファイル情報生成部１１の出力結果であるファイル情報１１５を示す図である。ファイル情報としてＩＤ、ファイル名、ソースコード行数であるサイズ、連結グラフＩＤ、完全グラフＩＤ、そして類似関係において独立したファイルか否かを示す独立判定が出力される。
【００３３】
図１１は、ソースコードの類似関係を可視化して表示した出力結果５１を示す図である。出力結果５１は、類似関係グラフ５１１と、類似度閾値設定部５１２とで構成される。
類似関係グラフ５１１はソースコード間の類似関係を無向グラフで表示する。ノードは各ファイルであり、エッジの有無はファイル間類似度Ｓｉｊが閾値を超えたか否かで決定する。なお、描画時には計算処理軽減のため、隣接行列Ａを参照する。ノードの面積は、ファイル情報１１５におけるサイズに対応して決定する。なお、図への記載は省略するが、同一の連結グラフＩＤを持つノードは同色で描画する。その後、同一の完全グラフＩＤを持つノードは同色で描画する。ただし、視認性のため、連結グラフＩＤおよび完全グラフＩＤ間ではそれぞれ描画色を異なる色とする。また、独立ファイル成分に判定されたノードは、上記連結グラフＩＤおよび完全グラフＩＤに割り当てられた色とは異なる無彩色にて描画する。
【００３４】
類似度閾値設定部５１２は、最小を０％、最大を１００％とするスライダであり、ユーザの操作に応じて類似度閾値Ｔを任意に設定される。
＜まとめ＞
以上のように、本実施の形態においてソースコード類似関係可視化装置１０は、ユーザが類似度閾値を設定するための類似度閾値設定部１３を有する。ソースコードをノードとし、ソースコード間類似度が前記類似度閾値以上となる類似関係をエッジとする無向グラフ構造を生成するグラフ構造生成手段１５を有する。これにより、ソースコード間の類似関係を、ユーザが理解しやすい形式で図示することができる。
【符号の説明】
【００３５】
４：入力部、２１：ソースコードファイル、１１：ファイル情報生成部、１２：類似度分析部、１３：類似度閾値設定部、１４：表示情報生成部、１５：グラフ構造生成部、５：出力部
【図１】
0005789537.tif 000002
【図２】
0005789537.tif 000003
【図３】
0005789537.tif 000004
【図４】
0005789537.tif 000005
【図５】
0005789537.tif 000006
【図６】
0005789537.tif 000007
【図７】
0005789537.tif 000008
【図８】
0005789537.tif 000009
【図９】
0005789537.tif 000010
【図１０】
0005789537.tif 000011
【図１１】
0005789537.tif 000012