(57)【要約】【課題】クローンの系統を正確に表示することを目的とする。【解決手段】プログラム解析装置は、記述形式が異なるが、同一の関数とみなせる関数を登録した関数辞書と、関数で使用されている変数の種類を登録したメモリアクセス辞書と、を記憶部に記憶しており、解析対象である複数のプログラムコードをトークンに分解する字句解析を行い、テンプレートと、字句解析の結果と、関数辞書と、メモリアクセス辞書と、を参照し、同一の関数とみなされたトークンの出現位置にプロットを行ったクローン解析図を作成し（Ｓ２）、クローン解析図を基に、テンプレートおよびプログラムコード間の親子関係を導出し（Ｓ３）、親子関係を導出されたテンプレートおよびプログラムコード間を線で接続した系統図を表示部に表示させる（Ｓ４）ことを特徴とする。【選択図】図２
2011096082.tif 000002
【特許請求の範囲】
【請求項１】
プログラムコードおよび前記プログラムコードから任意のトークンを抽出したテンプレートにおいて、元のプログラムコードまたはテンプレートを親、親のプログラムまたはテンプレートに対するトークンの編集を行ったプログラムコードを子とした親子関係を導出および表示するプログラム解析装置によるプログラム解析方法であって、
前記プログラム解析装置は、
記述形式が異なるが、同一のトークンとみなせるトークンを登録したトークン辞書と、
前記トークンで使用されている変数の種類を登録したメモリアクセス辞書と、
を記憶部に記憶しており、
前記プログラム解析装置が、
（ａ１）解析対象である複数のプログラムコードを、トークンに分解する字句解析を行い、
（ａ２）前記テンプレートと、前記字句解析の結果と、前記トークン辞書と、を参照し、記述形式が異なるが前記トークン辞書において同一のトークンとみなせるトークンを同一のトークンとし、
（ａ３）前記テンプレートと、前記字句解析の結果と、前記メモリアクセス辞書と、を参照し、形式が同一のトークンであるが、異なる種類の変数を用いているトークンを異なるトークンとして、前記同一のトークンを絞り込み、
（ａ４）前記複数のプログラムコードのうち、２つのプログラムコードについて、一方のプログラムコードのトークンの出現位置を縦軸にとり、他方のプログラムコードのトークンの出現位置を横軸にとり、絞り込んだ同一のトークンが前記２つのプログラムコードに出現するとき、前記同一のトークンの出現位置に対応する横軸の座標をｘ、前記同一のトークンの出現位置に対応する縦軸の座標をｙとし、（ｘ，ｙ）の点にプロットを行ったクローン解析図を作成し、
（ａ５）前記クローン解析図を基に、前記テンプレートおよびプログラムコード間の親子関係を導出し、
（ａ６）前記（ａ４）および（ａ５）の処理を、解析対象となっているテンプレートおよびプログラムコードの各対に対して行い、
（ａ７）前記親子関係を導出されたテンプレートおよびプログラムコード間を線で接続した系統図を表示部に表示させる
ことを特徴とするプログラム解析方法。
【請求項２】
前記クローン解析図におけるプロットが連続している線をクローン片とし、
前記プログラム解析装置が、
すべての前記クローン片が水平右方向または垂直下方向に対し、一定の方向にずれた状態で不連続となっているとき、
すべての不連続部分が水平右方向にずれている状態のとき、前記クローン解析図の縦軸が示すテンプレートおよびプログラムコードを親とし、前記クローン解析図の横軸が示すプログラムコードを子とし、
すべての不連続部分が垂直下方向にずれている状態のとき、前記クローン解析図の横軸が示すテンプレートおよびプログラムコードを親とし、前記クローン解析図の縦軸が示すプログラムコードを子とする
ことを特徴とする請求項１に記載のプログラム解析方法。
【請求項３】
前記クローン解析図におけるプロットが連続している線をクローン片とし、
前記プログラム解析装置が、
以下の式（１）に基づく派生率を算出し、
前記派生率が近い２つのプログラムコードを、前記系統図において並列に位置づけ、
前記並列に位置づけられているプログラムコードの親を、共通の親とする
ことを特徴とする請求項１に記載のプログラム解析方法。
派生率＝（Ｔ１＋Ｔ２＋・・・＋ＴＮ）／Ｎ・・・（１）
ただし、Ｎはクローンコード片の数であり、Ｔｎはｎ個目のクローンコード片の長さである。
【請求項４】
前記プログラム解析装置は、
複数のプログラムコードで使用されているトークンに重み付けを対応させているテンプレートを、さらに記憶部に記憶しており、
前記プログラム解析装置が、
処理の対象となっているプログラムコードにおいて、前記テンプレートに記述されているトークンと一致するトークンの重み付けを加算することによって、類似度を算出する
ことを特徴とする請求項１に記載のプログラム解析方法。
【請求項５】
前記プログラム解析装置は、
前記類似度が、所定の値未満であるプログラムコードの組については、前記（ａ２）〜（ａ５）の処理対象から除外する
ことを特徴とする請求項１に記載のプログラム解析方法。
【請求項６】
前記変数の種類は、グローバル変数、ローカル変数および複数のグローバル変数である複数グローバル変数群である
ことを特徴とする請求項１に記載のプログラム解析方法。
【請求項７】
前記プログラム解析装置は、
複数のプログラムコードから構成されるプログラムコード群が複数入力され、
前記入力された複数のプログラムコード群を構成する一部のプログラムコードは、互いに共通であり、
前記プログラムコード群ごとに前記（ａ１）〜（ａ７）の処理を行うことにより、前記プログラムコード群ごとの系統図を複数作成し、
前記作成された複数の系統図を１つにまとめる
ことを特徴とする請求項１に記載のプログラム解析方法。
【請求項８】
請求項１から請求項７に記載のプログラム解析方法をコンピュータに実行させることを特徴とするプログラム解析プログラム。
【請求項９】
プログラムコードおよび前記プログラムコードから任意のトークンを抽出したテンプレートにおいて、元のプログラムコードまたはテンプレートを親、親のプログラムまたはテンプレートに対するトークンの編集を行ったプログラムコードを子とした親子関係を導出および表示するプログラム解析装置であって、
情報を処理する制御部と、情報を記憶する記憶部と、を有し、
前記記憶部には、
記述形式が異なるが、同一のトークンとみなせるトークンを登録したトークン辞書と、
前記トークンで使用されている変数の種類を登録したメモリアクセス辞書と、
が記憶されており、
前記制御部が、
（ａ１）解析対象である複数のプログラムコードを、トークンに分解する字句解析を行い、
（ａ２）前記テンプレートと、前記字句解析の結果と、前記トークン辞書と、を参照し、記述形式が異なるが前記トークン辞書において同一のトークンとみなせるトークンを同一のトークンとし、
（ａ３）前記テンプレートと、前記字句解析の結果と、前記メモリアクセス辞書と、を参照し、形式が同一のトークンであるが、異なる種類の変数を用いているトークンを異なるトークンとして、前記同一のトークンを絞り込み、
（ａ４）前記複数のプログラムコードのうち、２つのプログラムコードについて、一方のプログラムコードのトークンの出現位置を縦軸にとり、他方のプログラムコードのトークンの出現位置を横軸にとり、絞り込んだ同一のトークンが前記２つのプログラムコードに出現するとき、前記同一のトークンの出現位置に対応する横軸の座標をｘ、前記同一のトークンの出現位置に対応する縦軸の座標をｙとし、（ｘ，ｙ）の点にプロットを行ったクローン解析図を作成し、
（ａ５）前記クローン解析図を基に、前記テンプレートおよびプログラムコード間の親子関係を導出し、
（ａ６）前記（ａ４）および（ａ５）の処理を、解析対象となっているテンプレートおよびプログラムコードの各対に対して行い、
（ａ７）前記親子関係を導出されたテンプレートおよびプログラムコード間を線で接続した系統図を表示部に表示させる
ことを特徴とするプログラム解析装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラム解析方法、プログラム解析プログラムおよびプログラム解析装置の技術に関する。
【背景技術】
【０００２】
大量のプログラムコードから構成される大規模なプログラムシステムでは、制御対象設備の増減、さらには、ユーザからの要求事項実現のために、過去の信頼性の高いプログラムシステムを流用し、このプログラムシステムのプログラムコードに若干の改造、加筆修正などを施すことで、新しいプログラムシステムを開発するケースが多い。この開発手法を採用することは、実績あるプログラムシステムＡを流用し、プログラムシステムＢを新たに開発することになる。このような場合、これら２つのプログラムシステムは巨大なクローンとなる。
【０００３】
また、大規模なプログラムシステムＡ中でも、プログラムコード中に何度もあらわれる類似したプログラムコードが存在する場合が多い。このような、１つのプログラムシステムに現れるプログラムコードもクローンと呼ばれる。これは、プログラムコードを複製（コピー）、貼り付け（ペースト）することによって生じるものである。このような開発手法にて実現された大規模なプログラムシステムは、類似したプログラムコード（クローン）が多数存在し理解・解読性を著しく悪化させる原因となる。
例えば、専用のプログラムを搭載しているハードウェアが旧式となったため、新しいハードウェアと交換する場合、搭載されているプログラムも旧式であるため、新しいアーキテクチャのプログラムを開発する必要がある。このような場合、旧式のプログラムを流用して、新しいプログラムを開発することが、しばしば行われるが、グローバル変数の扱いの違いなどが原因でバグが生じたりすることがある。
【０００４】
プログラムの維持・保守においては、プログラムコード中のある箇所に不具合が発見され修正された場合、その箇所と類似している箇所についても同様の修正が必要であるかどうかの検討が必要となる。しかし、多くの場合はそれらプログラムコードに対して、大なり小なり修正が施されており、単純な文字列検索などでは、大量のプログラムコード中のどこにどれくらいそうした箇所が存在するのかを網羅的に把握することは困難である。
【０００５】
さらに、多くの社会インフラを支える制御システムは絶対品質を要求されるため、ハードウェアは耐寿命・耐環境・信頼性の高い装置から構成される場合が多い。このため、このようなハードウェアに搭載されているプログラムシステムについても、１０年以上保守・改造が行われているプログラムシステムも数多く存在する。しかし近年、特殊なハードウェアにおいて１０年以上稼動しているプログラムシステムも、半導体・ハードディスクなどの交換部品の調達が困難となりつつあるため、オープン系ハードウェアへ移行する開発を要求される場合が多くなっている。この場合においても、プログラムコード中に何度もあらわれる類似したコードは、前記した理由で開発効率・信頼性を阻害する要因となり問題となる。
また、プログラムシステムを他のシステムに移行する場合においては、レガシシステムの開発順番のとおりの更新順番となる保証がないため、どちらがクローンであるかが不明となってしまうケースもある。
このような場合は、更新システムを構成するプログラムコードだけを対象にプログラムコードのクローン解析を行うのではなく、過去のプログラムシステムにおける開発経緯や、履歴や、変遷を明らかにした上でのクローン関係を明らかにしなければ、やはり、開発効率や、信頼性を阻害する要因を引き起こし問題となる。
【０００６】
このような、既存のプログラムコードクローンを解析するソフトウェアとして、ＣＣＦｉｎｄｅｒが開示されている（例えば、非特許文献１参照）。ＣＣＦｉｎｄｅｒでは、プログラムコードにおいて字句解析を実施して、トークン列化し特定の文字列に変更する処理を実施した上で照合が実施されるもので、プログラムコードで変数名・呼び出しする関数（サブルーチン）名を変更してもプログラムコードの類似度を検出することが可能である。
また、特許文献１には、プログラムコードを標準化して、それぞれトークン列を作成し、各トークンから相関マトリックスを作成し相関マトリックスを２値化された画像と見なしテクスチャ量を算出し、さらにその相関マトリックスに対応する各参照ベクトル間の距離を算出することでプログラムコード間の類似度を算出する類似度評価プログラム、類似度評価装置および類似度評価方法が開示されている。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２００８−４６６９５号公報
【非特許文献】
【０００８】
【非特許文献１】神谷年洋、ＣＣＦｉｎｄｅｒホームページ、[online]、［平成２１年１０月２日検索］、インターネット<URL:http://www.ccfinder.net/ccfinderx-j.html>
【発明の概要】
【発明が解決しようとする課題】
【０００９】
非特許文献１に記載のプログラムコードクローン検出ツール（ＣＣＦｉｎｄｅｒ）、および特許文献１に記載の技術は、字句解析を実施し、予め定義されたルールに従い計算処理によりプログラムコードクローンを解析する方法である。この方法では、クローンを抽出することが可能であるが、大規模なプログラムシステムでは無数のクローンが解析されてしまうため、例えば、使用している変数が異なるため、違う関数として分類したい場合など、本当に必要であるクローンの情報を選び出すことが困難になる場合が多く、要求を十分に満たすものとはいえなかった。
さらに、非特許文献１に記載のプログラムコードクローン検出ツールは、あるプログラムを字句解析し、プログラム構文の類似度を直接比較するため、プログラムの中から参照するメモリ領域が異なることにより処理上では意味が違うと判断すべきである場合でもクローンと判別してしまう問題がある。つまり、同じ文字列が使用されている変数でも、例えば一方はグローバル変数であり、他方がローカル変数である場合、これらの変数を使用している関数は、本質的に異なる機能をもつものであるにも拘わらず、同じ関数とみなされてしまう。
このような問題は、特許文献１においても解決されていない。
【００１０】
このような背景に鑑みて本発明がなされたのであり、本発明は、クローンの系統を正確に表示することを目的とする。
【課題を解決するための手段】
【００１１】
前記課題を解決するため、本発明は、プログラムコードおよび前記プログラムコードから任意のトークンを抽出したテンプレートにおいて、元のプログラムコードまたはテンプレートを親、親のプログラムまたはテンプレートに対するトークンの編集を行ったプログラムコードを子とした親子関係を導出および表示するプログラム解析装置によるプログラム解析方法であって、前記プログラム解析装置は、記述形式が異なるが、同一のトークンとみなせるトークンを登録したトークン辞書と、前記トークンで使用されている変数の種類を登録したメモリアクセス辞書と、を記憶部に記憶しており、前記プログラム解析装置が、（ａ１）解析対象である複数のプログラムコードを、トークンに分解する字句解析を行い、（ａ２）前記テンプレートと、前記字句解析の結果と、前記トークン辞書と、を参照し、記述形式が異なるが前記トークン辞書において同一のトークンとみなせるトークンを同一のトークンとし、（ａ３）前記テンプレートと、前記字句解析の結果と、前記メモリアクセス辞書と、を参照し、形式が同一のトークンであるが、異なる種類の変数を用いているトークンを異なるトークンとして、前記同一のトークンを絞り込み、（ａ４）前記複数のプログラムコードのうち、２つのプログラムコードについて、一方のプログラムコードのトークンの出現位置を縦軸にとり、他方のプログラムコードのトークンの出現位置を横軸にとり、絞り込んだ同一のトークンが前記２つのプログラムコードに出現するとき、前記同一のトークンの出現位置に対応する横軸の座標をｘ、前記同一のトークンの出現位置に対応する縦軸の座標をｙとしたとき、（ｘ，ｙ）の点にプロットを行ったクローン解析図を作成し、（ａ５）前記クローン解析図を基に、前記テンプレートおよびプログラムコード間の親子関係を導出し、（ａ６）前記（ａ４）および（ａ５）の処理を、解析対象となっているテンプレートおよびプログラムコードの各対に対して行い、（ａ７）前記親子関係を導出されたテンプレートおよびプログラムコード間を線で接続した系統図を表示部に表示させることを特徴とする。
その他の解決手段については、実施形態中に記載する。
【発明の効果】
【００１２】
本発明によれば、クローンの系統を正確に表示することができる。
【図面の簡単な説明】
【００１３】
【図１】本実施形態に係るプログラム解析装置の構成例を示す機能ブロック図である。
【図２】本実施形態に係るプログラム解析処理の概要を示す図である。
【図３】本実施形態に係るプログラム解析処理の手順を示すフローチャートである。
【図４】ステップＳ１０２における字句解析処理を説明するための図である。
【図５】ステップＳ１０４におけるテンプレート作成処理を説明するための図である。
【図６】ステップＳ１０５における関数辞書作成処理を説明するための図である。
【図７】ステップＳ１０６におけるメモリアクセス辞書作成処理を説明するための図である。
【図８】ステップＳ１０７における類似度算出処理を説明するための図である。
【図９】ステップＳ１１０における分類結果作成処理を説明するための図である（その１）。
【図１０】ステップＳ１１０における分類結果作成処理を説明するための図である（その１）。
【図１１】ステップＳ１１１におけるクローン解析処理を説明するためのクローン解析図である。
【図１２】ステップＳ１１２の親子関係導出・派生率算出処理のうち、親子関係導出処理の部分を説明するための図である。
【図１３】クローン解析処理が終了した後、結果表示部に表示されるクローン解析図の例である。
【図１４】ステップＳ１１４における系統図作成処理を説明するための系統図の例を示す図である。
【図１５】テンプレート、関数辞書、メモリアクセス辞書の具体例を示す図である。
【図１６】テンプレートと、プログラムコードとの具体例を示す図である。
【図１７】プログラムコード群αを構成する各プログラムコードのテンプレートａに対する類似度結果を示す図である。
【図１８】プログラムコード群α，βの系統図を示す図である（その１）。
【図１９】プログラムコード群α，βの系統図を示す図である（その２）。
【発明を実施するための形態】
【００１４】
次に、本発明を実施するための形態（「実施形態」という）について、適宜図面を参照しながら詳細に説明する。以下の説明において、プログラムコード群とは、複数のプログラムコードが集合することにより機能するプログラムのことである。例えば、１つのプログラムをプログラムコード群とすれば、プログラムコードはメイン関数や、サブ関数となる。あるいは、プロセスがプログラムコードとなる場合もある。
なお、本実施形態の各図において、同様の構成要素には同一の符号を付し、説明を省略する。
【００１５】
《装置構成》
図１は、本実施形態に係るプログラム解析装置の構成例を示す機能ブロック図である。
プログラム解析装置１は、装置の動作を制御する制御部１００と、情報を記憶する記憶部２００と、ディスプレイなどの結果表示部（表示部）３００と、キーボードやマウスなどのユーザインタフェース部４００とを有してなる。
制御部１００は、解析対象プログラムコード群登録部１０１と、字句解析部１０２と、テンプレート作成部１０３と、関数辞書作成部１０４と、メモリアクセス辞書作成部１０５と、類似度算出部１０６と、類似度解析結果作成部１０７と、分類結果作成部１０８と、クローン解析部１０９と、系統図作成部１１０と、を有してなる。
【００１６】
解析対象プログラムコード群登録部１０１は、解析対象となる複数のプログラムコードからなるプログラムコード群２０１をユーザインタフェース部４００を介して登録する処理を行う機能を有する。
字句解析部１０２は、登録されたプログラムコードをトークンに分解する字句解析処理を行う機能を有する。なお、トークンとは、関数などプログラムコードを構成する単語や記号の最小単位のことである。
テンプレート作成部１０３は、字句解析の結果（字句解析結果２０５）や、ユーザインタフェース部４００から入力された情報などを基にテンプレート２０２を作成する処理を行う機能を有する。テンプレート２０２の詳細は後記して説明する。
関数辞書作成部１０４は、テンプレート２０２や、字句解析結果２０５や、ユーザインタフェース部４００から入力された情報などを基に、関数の変形例などを登録した関数辞書（トークン辞書）２０３を作成する機能を有する。関数辞書２０３の詳細は後記して説明する。
メモリアクセス辞書作成部１０５は、テンプレート２０２や、ユーザインタフェース部４００から入力された情報などを基に、関数で参照される変数の種類を登録したメモリアクセス辞書２０４を作成する機能を有する。メモリアクセス辞書２０４の詳細は後記して説明する。
【００１７】
類似度算出部１０６は、テンプレート２０２におけるプログラムコードの構造と、登録されているプログラムコードの構造とを比較して類似度を算出する機能を有する。
類似度結果作成部１０７は、類似度算出部１０６が出力した結果を結果表示部３００に表示させる機能を有する。
分類結果作成部１０８は、テンプレート２０２毎に作成した類似度結果を分類結果として結果表示部３００に表示させる機能を有する。
クローン解析部１０９は、字句解析結果２０５と、関数辞書２０３と、メモリアクセス辞書２０４とを基に、クローン解析を行い、このクローン解析の結果を結果表示部３００に表示させる機能を有する。
系統図作成部１１０は、クローン解析の結果を基にプログラムコード間の親子関係を送出し、プログラムコード間の親子関係を系統図として結果表示部３００に表示させる機能を有する。
なお、制御部１００および各部１０１〜１１０は、図示しないＲＯＭ（Read Only Memory）や、ＨＤ（Hard Disk）に格納されたプログラム解析プログラムが、ＲＡＭ（Random Access Memory）に展開され、ＣＰＵ（Central Processing Unit）によって実行されることによって具現化する。
【００１８】
記憶部２００には、登録されたプログラムコード群２０１、字句解析結果２０５、テンプレート２０２、関数辞書２０３、メモリアクセス辞書２０４、トークン登録判別表２０６の各情報が格納される。前記したように字句解析結果２０５、テンプレート２０２、関数辞書２０３、メモリアクセス辞書２０４、トークン登録判別表２０６については後記して説明する。
【００１９】
《処理内容の概略》
図２は、本実施形態に係るプログラム解析処理の概要を示す図である。
まず、プログラムコード群αとして、プログラムコードａ１，ａ２，ａ３，ａ４が登録され、プログラムコード群βとして、プログラムコードｂ１，ｂ２，ｂ３が登録されたとする。
まず、プログラム解析装置１は、テンプレート２０２、関数辞書２０３、メモリアクセス辞書２０４などを使用して、各プログラムコード群２０１内におけるプログラムコード間の類似度を算出する。すなわち、プログラムコードａ１，ａ２，ａ３，ａ４間の類似度を算出し、プログラムコードｂ１，ｂ２，ｂ３の類似度を算出する（Ｓ１）。
次に、プログラム解析装置１はクローン解析処理を行い（Ｓ２）、作成されたクローン解析図を基に派生率の算出と、プログラムコード間の親子関係の導出を行う（Ｓ３）。
そして、プログラム解析装置１はプログラムコード間の親子関係を系統図として結果表示部３００に表示する（Ｓ４）。ここで、親子関係とは、元のプログラムコードを親とし、親プログラムコードにトークンを追加、修正などの編集を行ったものを子とする。
なお、図２の系統図における「ａ」はテンプレート２０２である。
【００２０】
《処理手順》
次に、図１を参照しつつ、図３〜図１９を参照して本実施形態に係るプログラム解析処理の手順を説明する。
まず、図３のフローチャートにおいて、処理手順の流れを説明し、図４〜図１９を参照して各処理の詳細を説明することとする。
図３は、本実施形態に係るプログラム解析処理の手順を示すフローチャートである。
まず、ユーザインタフェース部４００を介して、複数の解析対象プログラムコードが記憶部２００に入力される。その後、ユーザインタフェース部４００を介して、記憶部２００に入力されたプログラムコードの中から、解析対象となるプログラムコードが選択・登録される解析対象プログラムコード登録処理が行われる（Ｓ１０１）。
次に、字句解析処理は、ステップＳ１０１で選択されたプログラムコードのうち、１つを選択し、このプログラムコードからコメント部のような直接的には関係のない情報を除去し、トークン単位で分割する字句解析処理を行う（Ｓ１０２）。
そして、制御部１００は、ステップＳ１０１で選択されたすべてのプログラムコードについて、字句解析処理が完了したか否かを判定する（Ｓ１０３）。
ステップＳ１０３の結果、すべてのプログラムコードについて字句解析処理が完了していない場合（Ｓ１０３→Ｎｏ）、制御部１００はステップＳ１０２の処理へ戻り、字句解析処理が行われていないプログラムコードについて字句解析処理を行う。
【００２１】
ステップＳ１０３の結果、すべてのプログラムコードについて字句解析処理が完了している場合（Ｓ１０３→Ｙｅｓ）、テンプレート作成部１０３が字句解析結果２０５と、ユーザインタフェース部４００を介して入力された情報とを基にトークンに重み付けを行ったテンプレート２０２を作成するテンプレート作成処理を行う（Ｓ１０４）。
そして、関数辞書作成部１０４が、字句解析結果２０５と、テンプレート２０２と、ユーザインタフェース部４００を介して入力された情報などを基に関数辞書２０３を作成する関数辞書作成処理を行う（Ｓ１０５）。
次に、メモリアクセス辞書作成部１０５が、テンプレート２０２と、ユーザインタフェース部４００を介して入力された情報などを基にメモリアクセス辞書２０４を作成するメモリアクセス辞書作成処理を行う（Ｓ１０６）。
なお、異なるタイプのテンプレート２０２を複数作製してもよい。テンプレート２０２を複数作成するときはステップＳ１０４〜Ｓ１０６の処理を繰り返す。
【００２２】
そして、類似度算出部１０６が、テンプレート２０２や、テンプレート２０２から作成されるトークン登録判別表２０６を基に類似度を算出する類似度算出処理を行う（Ｓ１０７）。
次に、制御部１００がテンプレート２０２に対するすべてのプログラムコードにおいて、類似度算出処理が完了したか否かを判定する（Ｓ１０８）。
ステップＳ１０８の結果、すべてのプログラムコードについて類似度算出処理が完了していない場合（Ｓ１０８→Ｎｏ）、制御部１００はステップＳ１０７へ処理を戻し、類似度算出部１０６が類似度を算出していないプログラムコードについて類似度を算出する。
【００２３】
ステップＳ１０８の結果、すべてのプログラムコードについて類似度算出処理が完了している場合（Ｓ１０８→Ｙｅｓ）、類似度結果作成部１０７が類似度算出処理の結果を結果表示部３００に表示させる類似度結果表示処理を行う（Ｓ１０９）。
次に、分類結果作成部１０８が、閾値以下の類似度を有するプログラムコードを処理の対象から除外し、テンプレート２０２毎にプログラムコードを分類する分類結果作成処理を行う（Ｓ１１０）。
そして、クローン解析部１０９が、テンプレート２０２、字句解析結果２０５、関数辞書２０３およびメモリアクセス辞書２０４を基に、テンプレート２０２およびプログラムコードの各組み合わせについてクローン解析を行い、その結果を結果表示部３００に表示するクローン解析処理を行う（Ｓ１１１）。
【００２４】
次に、系統図作成部１１０が、クローン解析結果を基に、テンプレートやプログラムコード間の親子関係を導出したり、派生率を算出する親子関係導出・派生率算出処理を行う（Ｓ１１２）。
そして、制御部１００がすべてのプログラムコードの組み合わせについて親子関係導出・派生率算出処理が完了したか否かを判定する（Ｓ１１３）。
ステップＳ１１３の結果、すべての組み合わせについて親子関係導出・派生率算出処理が完了していない場合（Ｓ１１３→Ｎｏ）、制御部１００はステップＳ１１２の処理へ戻り、系統図作成部１１０は派生率を算出していないプログラムコードの組み合わせについて親子関係導出・派生率算出処理を行う。
ステップＳ１１３の結果、すべての組み合わせについて親子関係導出・派生率算出処理が完了している場合（Ｓ１１３→Ｙｅｓ）、プログラムコード間の親子関係を示した系統図を作成し、結果表示部３００に表示させる系統図作成処理を行う（Ｓ１１４）。
【００２５】
（Ｓ１０２：字句解析処理）
以下、図１および図３を参照しつつ、図４〜図１４に沿って主な処理の詳細な説明を行う。
図４は、ステップＳ１０２における字句解析処理を説明するための図である。
ここで、字句解析とは、プログラムコードから、コメント部のような直接的には類似度の比較に必要のない情報を除去し、さらにプログラムコードをトークン単位で分割する処理をいう。まず、字句解析部１０２が、ステップＳ１０１で選択・登録されたプログラムコードを読み込むと、以下のような字句解析処理を行う。
例えば、プログラムコードがＣ言語で記述されている場合、読み込んだプログラムコード内の「／／」に続く文字列や「／＊」と「＊／」で囲まれたコメント文を削除する。さらにコメントを削除したプログラムコードをトークン毎に分割する処理を行う。
上記手順により字句解析されるプログラムコード及び字句解析されたトークン列の具体例が図４に示されている。
【００２６】
プログラムコード４０１を字句解析した結果が字句解析されたプログラムコード４０２であり、プログラムコード４１１を字句解析した結果が字句解析されたプログラムコード４１２である。一見して相互の類似度が低く見えるようなプログラムコード間であっても、このように、プログラムコードを字句解析することにより、それらの類似度を的確に算出することが可能となる。
なお、字句解析処理は公知の技術である。
【００２７】
（Ｓ１０４：テンプレート作成処理）
図５は、ステップＳ１０４におけるテンプレート作成処理を説明するための図である。
テンプレート２０２は、ステップＳ１０２で字句解析された結果が結果表示部３００に表示され、ユーザが表示された字句解析結果２０５（図１）を参照して、ユーザインタフェース４００を介して情報を入力することにより作成される。
例えば、図５に示すプログラムコード５０１からテンプレート２０２が作成される。
図５に示すように、テンプレート２０２には、プログラムコードで処理順に記載される関数、システムコール等を用いてプログラムコードの構造がトークン毎に記述されている。例えば、プログラムコード５０１がＣ言語であるなら、「ｉｆ」文、「ｅｌｓｅ」文、「ｆｏｒ」文、共通関数、システムコールなどのトークンがテンプレート２０２に登録される。
ここで、テンプレート２０２に登録されるトークンは、プログラムコードにおけるすべてのトークンではなく、プログラムコードに特徴的なトークンが登録されていればよい。
【００２８】
さらに、図５に示すように、ユーザは、テンプレート２０２に登録した各々のトークンに対し重み付けを行うことが可能である。つまり、テンプレート２０２内で特に重要なトークンに対して強い重み付けをすることで、テンプレート２０２の特徴的な構造を定義することが可能である。
なお、例えば、プログラムコードＡを基に作成したテンプレート２０２、プログラムコードＢを基に作成したテンプレート２０２などというように、テンプレート２０２を複数作成することができる。例えば、プログラムコードＡを基に作成したテンプレート２０２を用いることで、プログラムコードＡに近いか否かを判定することができ、プログラムコードＢを基に作成したテンプレート２０２を用いることで、プログラムコードＢに近いか否かを判定することができる。
【００２９】
図６で後記する関数辞書２０３を作成することで、複数の異なる関数を共通の定義として扱うことが可能である。つまり、関数辞書２０３で同種の関数であると定義されている関数（またはトークン）は同種の関数であるとして、類似度を上げることができる。また、代入文やメモリのコピーを行っているトークンに関しては、図７で後記するメモリアクセス辞書２０４でコピー先の変数の属性を登録することができ、コピー先がグローバル変数、または、ローカル変数であることを定義することが可能である。
【００３０】
（Ｓ１０５：関数辞書作成処理）
図６は、ステップＳ１０５における関数辞書作成処理を説明するための図である。
ユーザは、テンプレート２０２と、結果表示部３００に表示されている字句解析結果２０５（図１）を参照して、ユーザインタフェース４００を介して情報を入力することにより関数辞書２０３を作成する。
図６に示すように、例えば、ほぼ同義の共通関数（つまり、コピーなどを利用して作成された関数）「ｓｕｂ＿Ａ１（）」および「ｓｕｂ＿Ａ２（）」をテンプレート２０２における「ｆｕｎｃＡ（）」と同グループの関数として関数辞書２０３を定義する。
このようにすることで、後記する類似度算出時に、コールしている共通関数のみ異なるプログラムコードを類似していることを判別することができる。つまり、異なる関数であっても、関数辞書２０３で同グループの関数として登録されている関数は同じ関数とすることができる。
また、関数辞書２０３に登録されている関数は、テンプレート２０２に登録されている関数でもよい。
【００３１】
（Ｓ１０６：メモリアクセス辞書作成処理）
図７は、ステップＳ１０６におけるメモリアクセス辞書作成処理を説明するための図である。
図７に示すように、ユーザは、テンプレート２０２に定義したトークンで使用している変数毎に、その変数がグローバル変数、ローカル変数、または複数のグローバル変数である複数グローバル変数群であるか否かといった変数の種類を、ユーザインタフェース４００を介して入力することによりメモリアクセス辞書２０４を作成する。
このようにすることで、後記する類似度算出時に、同じ形式であるが参照している変数がグローバル変数と、ローカル変数であるなど、異なる種類の変数を参照している関数を異なる関数として判別することができる。
なお、メモリアクセス辞書２０４は、結果表示部３００に表示されているテンプレート２０２や、字句解析結果２０５を参照しながら、ユーザによって作成されるものである。
【００３２】
テンプレート２０２、関数辞書２０３、メモリアクセス辞書２０４の記述内容は任意であるが、抽出したいクローンコードの特徴的な構造を定義することが望ましい。また、これらは一度作成した後、記憶部２００に保存することが可能であり、何度でも読み込み・編集することが可能である。
また、テンプレート２０２、関数辞書２０３、メモリアクセス辞書２０４は、図２の処理が始まる前に予め作成されていてもよい。
【００３３】
（Ｓ１０７：類似度算出処理）
図８は、ステップＳ１０７における類似度算出処理を説明するための図である。
まず、類似度算出部１０６は、図８に示すようなトークン登録判別表２０６をプログラムコード毎に作成する。
まず、類似度算出部１０６は、ステップＳ１０４で作成したテンプレート２０２をコピーし、ステップＳ１０２で作成した字句解析結果２０５と比較することにより、処理対象となっているプログラムコードにおいて、テンプレート２０２に登録されているトークンがあるか否かを判定し、あれば該当する登録判別の欄に「○」を登録し、なければ「×」を登録する。
このとき、類似度算出部１０６は、関数辞書２０３や、メモリアクセス辞書２０４を参照して、異なる形式のトークンがあっても関数辞書２０３に登録されていれば、トークン登録判別表２０６の登録判別欄に「○」を登録し、同じ形式のトークンがあってもメモリアクセス辞書２０４において異なる変数を参照している場合はトークン登録判別表２０６の登録判別欄に「×」を登録する。
【００３４】
このトークン登録判別表２０６は、プログラムコード毎に作成される。例えば、テンプレートＡとテンプレートＢがあり、プログラムコードＡ〜プログラムコードＤがあれば、テンプレートＡを基にしたプログラムコードＡ〜プログラムコードＤのトークン登録判別表２０６を作成し、これとは別にテンプレートＢを基にしたプログラムコードＡ〜プログラムコードＤのトークン登録判別表２０６を作成する。
【００３５】
次に、類似度算出部１０６は、各プログラムコードのトークン登録判別表２０６において「○」が登録されているトークンの重みを加算し、加算した結果を、すべての重みを加算した値（最大スコア）で除算し、さらに１００を乗算することにより類似度を算出する。
すなわち、類似度算出部１０６は以下の式（１）より類似度を算出する。
【００３６】
類似度（％）＝プログラムコードスコア÷最大スコア×１００  ・・・  （１）
【００３７】
例えば、図８に示すプログラムコードＤのトークン登録判別表２０６から求められる類似度は（１＋２＋１）÷（１＋１＋２＋１＋１）×１００＝６６（％）となる。
類似度算出部１０６は、類似度を作成されているテンプレート２０２に対するすべてのプログラムコードについて算出する。
【００３８】
なお、類似度算出の処理対象となるテンプレート２０２および閾値は、ユーザによって指定されてもよい。指定のタイミングは、類似度算出処理の前であればいつでもよい。
【００３９】
（Ｓ１１０：分類結果作成処理）
図９および図１０は、ステップＳ１１０における分類結果作成処理を説明するための図である。
分類結果作成部１０８は、予め設定してある閾値以上の類似度を有するプログラムコードをグループとして登録する。
図９の例では、閾値を「３０」と設定しているため、類似度が「２０（％）」のプログラムコードＣはグループから除外されている。
【００４０】
また、前記したようにテンプレート２０２は複数作成することも可能であるため、図１０に示すように異なるテンプレート２０２によるグループ化も可能である。
図１０の例では、テンプレートＡを基にグループ化されたプログラムコードＡ、Ｂ，Ｄと、テンプレートＢを基にグループ化されたプログラムコードＡ，Ｃ、Ｄとの２つのグループが作成されている。
【００４１】
分類結果作成部１０８は、図９や図１０に示すようなプログラムコードのグループを結果表示部３００に表示させる。
【００４２】
（Ｓ１１１：クローン解析処理）
図１１は、ステップＳ１１１におけるクローン解析処理を説明するためのクローン解析図である。
クローン解析部１０９が以下の手順でプログラムコードに対するクローン解析を行う。
まず、クローン解析部１０９は、図９に示すようなグループ化されたプログラムコードから、テンプレート２０２とプログラムコードの対、プログラムコードとプログラムコードの対を選択し、縦軸が一方のテンプレート２０２またはプログラムコードのトークン出現位置、横軸が他方のテンプレート２０２またはプログラムコードのトークン出現位置としたクローン解析図１１０１を作成する。
クローン解析部１０９は、比較対象となっているテンプレート２０２およびプログラムコードの字句解析結果２０５を基に、クローン解析図１１０１上において同じトークンが記述されている箇所にプロットする。
すなわち、クローン解析部１０９は、２つのプログラムコードについて、一方のプログラムコードのトークンの出現位置を縦軸にとり、他方のプログラムコードのトークンの出現位置を横軸にとり、絞り込んだ同一のトークンが前記２つのプログラムコードに出現するとき、前記同一のトークンの出現位置に対応する横軸の座標をｘ、前記同一のトークンの出現位置に対応する縦軸の座標をｙとし、（ｘ，ｙ）の点にプロットを行うことによりクローン解析図を作成する。
このとき、クローン解析部１０９は、形式が異なっても関数辞書２０３に登録されている関数や、メモリアクセス辞書２０４で同じ種類の変数を参照している関数を、同じトークンとしてクローン解析図１１０１にプロットする。逆に、クローン解析部１０９は、形式が同じでも、メモリアクセス辞書２０４において異なる変数を参照している関数は異なる関数とし、プロットを行わない。
【００４３】
図１１に示すように、クローン解析図１１０１では、同じであると判定されたトークン列間のプロット部分のうち、長い直線となっている部分が各プログラムコード間の共通トークン部分である。この直線となっている部分をクローン片と称することとする。仮に、２つのプログラムコードが同一である場合は、原点から右下にかけて連続した直線がプロットされることとなる。
なお、クローン解析図１１０１において、水平方向および垂直方向に複数プロットされている箇所、つまり一方のトークン出現位置に対し、複数の他方のトークン出現位置が対応している箇所は、関数辞書２０３や、メモリアクセス辞書２０４によって一方のプログラムコードにおける１つのトークンに対し、他方のプログラムコードにおける複数のトークンが同一であると判定されたものである。
【００４４】
（Ｓ１１２：親子関係導出処理）
図１２は、ステップＳ１１２の親子関係導出・派生率算出処理のうち、親子関係導出処理の部分を説明するための図である。
また、図１２では、プログラムコードＡの途中に条件文が挿入された場合、クローン解析図１２０１に不連続部分（破線矢印）が生じることを示している。このように、クローン解析図１２０１において、クローン片が不連続となっている場合、その行にはプログラムコード特有の処理が記述されているものと考えられる。
すなわち、元のプログラムコードをプログラムコードＡ、プログラムコードＡに条件文を追加挿入したものをプログラムコードＡ１とすると、図１２のクローン解析図１２０１において、条件文が追加挿入されたところで、クローン片が水平右方向にずれた状態で不連続となっている。このように、クローン片が水平右方向にずれていれば、横軸のトークン出現位置が示すプログラムコード（ここでは、プログラムコードＡ１）は、縦軸のトークン出現位置が示すプログラムコード（ここでは、プログラムコードＡ）にトークンが追加挿入されたものであることがわかる。
なお、逆にプログラムコードＡ１にトークンが追加挿入されたものがプログラムコードＡだとすると、クローン解析図では垂直下方向にクローン片がずれた状態の不連続部分が生じることとなる。
【００４５】
（Ｓ１１２：親子関係導出・派生率算出処理）
図１３は、クローン解析処理が終了した後、結果表示部に表示されるクローン解析図の例である。
図１３では、テンプレートＡ‐プログラムコードＡ（クローン解析図１３０１）、テンプレートＡ‐プログラムコードＢ（クローン解析図１３０２）、テンプレートＡ‐プログラムコードＤ（クローン解析図１３０３）、プログラムコードＡ‐プログラムコードＢ（クローン解析図１３０４）、プログラムコードＡ‐プログラムコードＤ（クローン解析図１３０５）、プログラムコードＢ‐プログラムコードＤ（クローン解析図１３０６）、・・・の組み合わせに対するクローン解析図が表示されている。ここで、プログラムコードＣを含んだ組み合わせがないのは、図９に示すようにプログラムコードＣの類似度が閾値以下であるため、グループから除外された例を示しているためである。
【００４６】
ここで、テンプレートＡは、プログラムコードＡを基に作成したテンプレート２０２（図１）である。プログラムコードＡを基にしているが、完全に同じわけではないため、テンプレートＡ−プログラムコードＡのクローン解析図には不連続部分が生じている。なお、図１３において、不連続部分は破線矢印で示している。
また、プログラムコードＡはオリジナルのプログラムコードであり、プログラムコードＢはプログラムコードＡに対して処理を追加したプログラムコードとする。そして、プログラムコードＤはプログラムコードＡに対して処理を修正したプログラムコードとする。
【００４７】
図１２で、説明したようにあるプログラムコードにトークンが追加挿入されている場合、クローン片は水平右方向あるいは垂直下方向にずれた状態で不連続となっている。
従って、あるプログラムコードに対し、単純にトークンが追加されているだけであれば、水平右方向あるいは垂直下方向に対し、すべての不連続部分が一定の方向にずれた状態となる。そのため、すべての不連続部分が水平右方向もしくは垂直下方向にずれている場合、そのプログラムコードは元のプログラムコードに対し、単純にトークンが追加されているだけなので、元のプログラムコードを親、トークンが追加されたプログラムコードを子とみなすことができる。
【００４８】
なお、水平右方向にずれていれば、クローン解析図の縦軸が示すプログラムコード（テンプレート）が親となり、横軸が示すプログラムコード（テンプレート）がトークンを追加された子となる。また、垂直下方向にずれていれば、クローン解析図の横軸が示すプログラムコード（テンプレート）が親となり、縦軸が示すプログラムコード（テンプレート）がトークンを追加された子となる。図１３の例では、クローン解析図１３０１，１３０２，１３０４の不連続部分１３１１がこれらの例に相当する。
【００４９】
例えば、図１３のクローン解析図１３０１では、プログラムコードＡは、テンプレートＡに対しトークンが追加されているだけなので、テンプレートＡ＞プログラムコードＡであることがわかる。なお、「＞」は「親＞子」であることを示す。
同様に、クローン解析図１３０２では、テンプレートＡ＞プログラムコードＢ、クローン解析図１３０４からプログラムコードＡ＞プログラムコードＢであることがわかる。従って、系統図作成部１１０は、クローン解析図１３０１，１３０２，１３０４からテンプレートＡ＞プログラムコードＡ＞プログラムコードＢという親子関係を導出する。
【００５０】
さらに、トークンが修正されたり、異なるトークンに置換えられたりした部分は、クローン解析図１３０５の符号１３２１に示すように、クローン片が完全に断裂した状態となっている。これを断裂部分と称することとする。
このような断裂部分や、クローン解析図１３０５の符号１３２２のように、斜め方向にクローン片がずれている不連続部分が存在する場合、クローン解析図１３０１，１３０２，１３０４のようにクローン解析図の形状から親子関係を導出することができない。
図１３では、クローン解析図１３０３，１３０５，１３０６が、このようなクローン解析図に該当する。
【００５１】
図１３におけるクローン解析図１３０３，１３０５，１３０６のように、クローン解析図の形状から親子関係を導出することができない場合、系統図作成部１１０は、式（２）で算出される派生率を用いて各々のプログラムコード間のクローンコード片の平均長が一番長いものを構造が近いものと判断し、この派生率を基に親子関係を導出する。
【００５２】
派生率＝（Ｔ１＋Ｔ２＋・・・＋ＴＮ）／Ｎ・・・（２）
【００５３】
式（２）における、Ｎはクローンコード片の数であり、Ｔｎはｎ個目のクローンコード片の長さである。
系統図作成部１１０は、図１３のクローン解析図１３０５（プログラムコードＡ‐プログラムコードＤ）、およびクローン解析図１３０６（プログラムコードＢ‐プログラムコードＤ）のそれぞれに対し、式（２）を計算し、クローンコード片の平均長（派生率）を求める。なお、テンプレートＡは、すべてのプログラムコードと親子関係をもつものであるため、系統図作成部１１０は派生率の算出対象からクローン解析図１３０３を外す。
【００５４】
派生率の算出結果、プログラムコードＡ−プログラムコードＤの派生率＞プログラムコードＢ‐プログラムコードＤの派生率であったとすると、系統図作成部１１０が、プログラムコードＤは、プログラムコードＢよりプログラムコードＡに近い構造を有すると判別する。そして、系統図作成部１１０は、プログラムコードＤの系統図における位置を、プログラムコードＡと並列に位置付け、プログラムコードＡの親であるテンプレートＡの子とする。なお、プログラムコードＢ−プログラムコードＤの派生率＞プログラムコードＡ‐プログラムコードＤの派生率であった場合、系統図作成部１１０は、系統図におけるプログラムコードＤの位置をプログラムコードＢと並列に位置付け、プログラムコードＤをプログラムコードＢの親であるプログラムコードＡの子とする。
【００５５】
以上、系統図作成部１１０による親子関係の導出手順を整理すると、
１．系統図作成部１１０は、クローン解析図において、すべての不連続部分が水平右方向あるいは垂直下方向に対し、一定の方向でずれているものがあるか否かを判定し、あれば、クローン片がずれている方向から親子関係を導出する（図１３のクローン解析図１３０１，１３０２，１３０４）。
２．系統図作成部１１０は、クローン片が一定方向にずれていないクローン解析図（クローン解析図１３０３，１３０５，１３０６）からテンプレート２０２を有するクローン解析図を派生率の算出対象から除外する（クローン解析図１３０３）。
３．派生率の算出対象から除外されなかったクローン解析図から派生率を算出し、親子関係を導出する。
【００５６】
なお、系統図作成部１１０は、ユーザによって登録されたシステムの開発順番を参照し、以前に作成されたプログラムコードが必ず親になるように派生関係を決定してもよい。
このようにして、系統図作成部１１０は、プログラムコード間の派生関係を求め、系統図を作成し、結果表示部３００に作成した系統図を表示する。
【００５７】
（Ｓ１１４：系統図作成処理）
図１４は、ステップＳ１１４における系統図作成処理を説明するための系統図の例を示す図である。
図１３で説明した処理により、系統図作成部１１０は、テンプレートＡの子としてプログラムコードＡおよびプログラムコードＤ、プログラムコードＡの子（テンプレートＡの孫）としてプログラムコードＢという関係を導出し、結果表示部３００に系統図１４０１を表示する。
【００５８】
《具体例》
次に、図１５〜図１９を参照して、本実施形態に係る系統図の作成手順を具体例を用いて説明する。
本実施形態において、系統図の算出対象となるソースプログラムの使用言語はＣ言語とした。ここでは、ある１つのテンプレート２０２に対して、２つの解析対象プログラムコード群α，βから類似したプログラムコードを算出し、系統図を算出するものとする。
まず、ユーザは類似度算出に先立ち、解析対象としてプログラムコード群α、およびプログラムコード群αをベースとして作成されたプログラムコード群βを解析対象プログラムコードとして登録する。
【００５９】
なお、ここで、プログラムコード群２０１とは、共通のプログラムコードを使用して構成されている別のプログラムコード群２０１である。例えば、バージョンが異なるプログラムなどがプログラムコード群α、βに該当する。登録されたプログラムコードは、図３のステップＳ１０２による字句解析が行われ、さらにステップＳ１０４〜Ｓ１０６の処理が行われ、テンプレート２０２、関数辞書２０３、メモリアクセス辞書２０４が作成される。
【００６０】
図１５は、テンプレート、関数辞書、メモリアクセス辞書の具体例を示す図である。
図１５の例では、テンプレート２０２の「共通関数（・・・）」には、関数辞書２０３により「ｓｕｂ＿Ａ（）、ｓｕｂ＿Ｂ（）」が該当しており、メモリアクセス辞書２０４により関数ｍｅｍｃｐｙが参照する「ｐＤａｔａ」はグローバル変数であることがわかる。
このように解析対象プログラムコード群２０１内で使用されている意味のあるトークンを組み合わせて定義する。ここで、意味のあるトークンと互いにはコピー関係にあるトークンのことである。例えば、図１５に示すように、ｍｅｍｓｅｔ関数、ｉｆ−ｅｌｓｅ文、共通関数、ｍｅｍｃｐｙ関数を使用した構造をテンプレート２０２として定義する。なお、図１５のテンプレート２０２では、「共通関数」と「ｍｅｍｃｐｙ」の関数が重要な意味を持つとし、「共通関数」、「ｍｅｍｃｐｙ」の重みを「２」とし、その他のトークンの重みを「１」としている。
【００６１】
図１６は、テンプレートと、プログラムコードとの具体例を示す図である。
図１６におけるテンプレートａは、図１６のプログラムコードａ１を基に作成されたものである。さらに、プログラムコードｃは、プログラムコードａ１を基に、修正を加えて作成されたプログラムコードである。
テンプレートａにおいて登録されているトークン数は５つであり、図１５の重みに従えば最大スコアは７である。
プログラムコードａ１では、テンプレートａで定義されているトークンのすべてがテンプレートａに登録した順に出現している（ドット部分）。そして、「ｍｅｍｃｐｙ」の「＆ｐＲｔｎ」がグローバル変数であるとするならば、テンプレートａに対するプログラムコードａ１の類似度は１００％となる。関数内で使用している変数がグローバル変数であるか、ローカル変数であるかなどは、宣言文の形式から判定できる。
また、プログラムコードｃでも、テンプレートａに登録したすべてのトークンが出現しているが、「Ｓｕｂ＿Ｂ」の後に「ｉｆ」が出現するなど、テンプレートａとは出現の順番が異なるため、プログラムコードｃにおける「ｉｆ−ｅｌｓｅ」文は、テンプレートａのクローンコードと判定せず、「ｍｅｍｓｅｔ」、「Ｓｕｂ＿Ｂ」、「ｍｅｍｃｐｙ」のみがテンプレートａと合致したと判定する（ドット部分）。その結果、テンプレートａに対するプログラムコードｃの類似度はおよそ７１％となる。
【００６２】
つまり、
プログラムコードａ１の類似度＝（１＋１＋２＋２＋１）／（１＋１＋２＋２＋１）×１００＝１００（％）
プログラムコードｃの類似度＝（１＋２＋２）／（１＋１＋２＋２＋１）×１００≒７１（％）
である。
【００６３】
以上のように、プログラム解析装置１はプログラムコード群α、βにおける各々のプログラムコードについて類似度を算出する。
【００６４】
図１７は、プログラムコード群αを構成する各プログラムコードのテンプレートａに対する類似度結果を示す図である。
ここで、「ａ１」、「ｃ」、「ｃ１」、「ｄ」、「ｅ」、「ｅ１」、「ｈ」、「ｊ」はそれぞれプログラムコード群αを構成するプログラムコードの名称である。
ここでは、閾値を４０％とし、類似度が４０％以上であるプログラムコードのみを表示している。
【００６５】
図１８および図１９は、プログラムコード群α，βの系統図を示す図である。なお、図１８および図１９において、「ａ」のみがテンプレート２０２であり、その他はプログラムコードである。
これらはプログラムコード群αおよびプログラムコード群βに対し、個別に図３に示す処理を行った結果である。
【００６６】
さらに、図１９に示すように、系統図作成処理は図１８の結果を統合させて結果表示部３００に表示させてもよい。
これは、例えばユーザがユーザインタフェース部４００を介して、プログラムコード群αをベースにプログラムコード群βが作成された旨の入力などを行うことによって作成されてもよい。
【００６７】
本実施形態は、複数のプログラムコードを有するプログラムシステムであれば、記述されている言語がＣ言語に限ることなく、他のプログラム言語でも利用することができる。
【００６８】
《まとめ》
本実施形態によれば、形式が異なっていても同じ関数とみなせる関数を登録した関数辞書２０３や、関数内で使用している変数の種類を登録したメモリアクセス辞書２０４を用いることによって、形式上は異なっていても実質的に同じトークンであるとしたり、形式上は同一でも、参照している変数が異なれば異なるトークン（関数）であるとしたりすることにより、プログラムコードの単純比較では抽出することのできないトークンの種類を抽出することができ、精度の高いプログラム解析を行うことができる。さらに、トークンの種類を考慮した系統図を作成することにより、精度の高いプログラムコード間の親子関係を導出することができる。
【符号の説明】
【００６９】
１      プログラム解析装置
１００  制御部
１０１  解析対象プログラムコード群登録部
１０２  字句解析部
１０３  テンプレート作成部
１０４  関数辞書作成部
１０５  メモリアクセス辞書作成部
１０６  類似度算出部
１０７  類似度解析結果作成部
１０８  分類結果作成部
１０９  クローン解析部
１１０  系統図作成部
２００  記憶部
２０１  プログラムコード群
２０２  テンプレート
２０３  関数辞書（トークン辞書）
２０４  メモリアクセス辞書
２０５  字句解析結果
２０６  トークン登録判別表
３００  結果表示部（表示部）
１１０１，１２０１，１３０１〜１３０６  クローン解析図
１４０１  系統図
【図１】
2011096082.tif 000003
【図２】
2011096082.tif 000004
【図３】
2011096082.tif 000005
【図４】
2011096082.tif 000006
【図５】
2011096082.tif 000007
【図６】
2011096082.tif 000008
【図７】
2011096082.tif 000009
【図８】
2011096082.tif 000010
【図９】
2011096082.tif 000011
【図１０】
2011096082.tif 000012
【図１１】
2011096082.tif 000013
【図１２】
2011096082.tif 000014
【図１３】
2011096082.tif 000015
【図１４】
2011096082.tif 000016
【図１５】
2011096082.tif 000017
【図１６】
2011096082.tif 000018
【図１７】
2011096082.tif 000019
【図１８】
2011096082.tif 000020
【図１９】
2011096082.tif 000021