(57)【特許請求の範囲】
【請求項１】
コンピュータが、
互いに類似する複数のコードそれぞれにおいて共通の箇所に記述され互いに相違する複数の単語を抽出し、前記複数の単語の間で相違する相違文字の位置を検出し、
前記複数の単語それぞれのうち、前記位置の前方に連なる１以上の文字および前記位置の後方に連なる１以上の文字の両方または何れか一方と前記相違文字とを含む文字列を、パラメータ化の対象部分とする置換文字列と決定し、
前記複数のコードそれぞれの前記置換文字列の情報を出力する、
パラメータ化方法。
【請求項２】
前記決定では、前記複数のコードと前記置換文字列の候補とを用いて作成される共通コードに含まれるパラメータの数に基づいて、前記置換文字列を決定する、請求項１記載のパラメータ化方法。
【請求項３】
前記決定では、前記置換文字列の複数の候補のうち前記複数の候補それぞれに応じた共通コードに含まれる前記パラメータの数が少ない候補を優先的に選択することで、前記置換文字列を決定する、請求項２記載のパラメータ化方法。
【請求項４】
前記決定では、更に、前記複数の単語それぞれに含まれる所定の文字または隣接する文字の種類の変化に応じて前記置換文字列を決定する、請求項２または３記載のパラメータ化方法。
【請求項５】
前記複数のコード、および、前記複数のコードそれぞれの前記置換文字列の情報に基づいて、各コードの前記置換文字列をパラメータに置換した共通コードを出力する、請求項１乃至４の何れか１項に記載のパラメータ化方法。
【請求項６】
前記抽出では、前記複数のコードそれぞれにおいて、処理内容を示す予約語の記述が一致し、変数名が相違する箇所から、相違する当該変数名を抽出する、請求項１乃至５の何れか１項に記載のパラメータ化方法。
【請求項７】
互いに類似する複数のコードを記憶する記憶部と、
前記複数のコードそれぞれにおいて共通の箇所に記述され互いに相違する複数の単語を抽出し、前記複数の単語の間で相違する相違文字の位置を検出し、前記複数の単語それぞれのうち、前記位置の前方に連なる１以上の文字および前記位置の後方に連なる１以上の文字の両方または何れか一方と前記相違文字とを含む文字列を、パラメータ化の対象部分とする置換文字列と決定し、前記複数のコードそれぞれの前記置換文字列の情報を出力する演算部と、
を有する情報処理装置。
【請求項８】
コンピュータに、
互いに類似する複数のコードそれぞれにおいて共通の箇所に記述され互いに相違する複数の単語を抽出し、前記複数の単語の間で相違する相違文字の位置を検出し、
前記複数の単語それぞれのうち、前記位置の前方に連なる１以上の文字および前記位置の後方に連なる１以上の文字の両方または何れか一方と前記相違文字とを含む文字列を、パラメータ化の対象部分とする置換文字列と決定し、
前記複数のコードそれぞれの前記置換文字列の情報を出力する、
処理を実行させるパラメータ化プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はパラメータ化方法、情報処理装置およびパラメータ化プログラムに関する。
【背景技術】
【０００２】
ソフトウェア開発では、あるプログラムにおいて他のプログラムと類似の機能を実現するために、他のプログラムの一部の複製を、該当のプログラムに埋め込むことがある。このため、複数のプログラム内に互いに同一または類似のコード片（コードクローンと称することがある）が複数存在し得る。
【０００３】
例えば、ソースコード生成装置が、ソースコードに含まれる互いに類似する複数の部分コードを基に共通コードを生成する提案がある。この提案では、共通コードとともに、共通コードと類似するそれぞれの各部分コードとの差分情報も生成し、ソースコード内の部分コードを、共通コードおよび差分情報を挿入する挿入コードに差し替える。
【０００４】
なお、ソースプログラムの類似部分を解析する解析システムも提案されている。この提案では、解析システムは、ソースプログラムから内容が互いに一致する部分と一致しない部分とを含み、かつ、基準に合致する類似部分を検出する。解析システムは、類似部分を分析し、他の類似部分とどれだけ類似しているかを示す指標を出力する。
【０００５】
また、特定の複数プログラムに対して、複数の条件で類似領域（クローン片）の位置情報を検出するソフトウェアの類似性評価の方法も提案されている。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２０１５−１８４７３５号公報
【特許文献２】特開２０１４−１９９５６９号公報
【特許文献３】特開２０１２−１６４２１１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
複数のソースコードに対し、コードクローンを共通化することが考えられる。例えば、共通化したコード（共通コード）をソースコード外で管理し、各ソースコードでは共通コードを呼び出して利用すれば、コード修正時の作業の局所化や再利用可能性の向上を図れる。この場合、共通コードに対し各ソースコードで用いられる変数名や処理名などの差分をパラメータとして共通コードに設定可能にすることが考えられる。そこで、コードクローンに対し、コード間の差分（パラメータ化する部分）を検出する方法が問題となる。
【０００８】
例えば、互いに類似するコード部分について、単に相違する文字の箇所のみを差分としてパラメータ化し、当該コード部分を共通化することも考えられる。しかし、互いに類似するコード部分を単純に文字列として比較し、相違箇所のみをパラメータ化するだけでは、ソフトウェア開発の効率性の観点からは不十分である。例えば、共通コード内に相違箇所に相当する部分のみをパラメータとして点在させると、個々のパラメータのコード内での意味が明確でなくなったり、パラメータの数が増えたりする。すなわち、可読性や再利用可能性が低い状態でパラメータ化する部分が導出されるおそれがある。
【０００９】
１つの側面では、本発明は、ソフトウェア開発の効率を改善することを目的とする。
【課題を解決するための手段】
【００１０】
１つの態様では、パラメータ化方法が提供される。このパラメータ化方法では、コンピュータが、互いに類似する複数のコードそれぞれにおいて共通の箇所に記述され互いに相違する複数の単語を抽出し、複数の単語の間で相違する相違文字の位置を検出し、複数の単語それぞれのうち、当該位置の前方に連なる１以上の文字および当該位置の後方に連なる１以上の文字の両方または何れか一方と相違文字とを含む文字列を、パラメータ化の対象部分とする置換文字列と決定し、複数のコードそれぞれの置換文字列の情報を出力する。
【発明の効果】
【００１１】
１つの側面では、ソフトウェア開発の効率を改善できる。
【図面の簡単な説明】
【００１２】
【図１】第１の実施の形態の情報処理装置を示す図である。
【図２】第２の実施の形態のサーバのハードウェア例を示す図である。
【図３】コードクローンの抽出例を示す図である。
【図４】コードクローン共通化の単純な方法の例（その１）を示す図である。
【図５】コードクローン共通化の単純な方法の例（その２）を示す図である。
【図６】サーバの機能例を示す図である。
【図７】ソースコードの例を示す図である。
【図８】コードクローン情報の例を示す図である。
【図９】相違単語情報の例を示す図である。
【図１０】相違文字情報の例を示す図である。
【図１１】パラメータ化情報の例（その１）を示す図である。
【図１２】サーバの処理例を示すフローチャートである。
【図１３】コードクローン検出例を示すフローチャートである。
【図１４】コードクローン情報の抽出処理の例を示す図である。
【図１５】相違単語抽出例を示すフローチャートである。
【図１６】相違文字抽出例を示すフローチャートである。
【図１７】相違文字情報の抽出処理の例を示す図である。
【図１８】置換文字列拡大例を示すフローチャートである。
【図１９】相違文字抽出の第１の具体例を示す図である。
【図２０】置換文字列拡大の第１の具体例を示す図である。
【図２１】置換文字列拡大の第１の具体例（続き）を示す図である。
【図２２】相違文字抽出の第２の具体例を示す図である。
【図２３】置換文字列拡大の第２の具体例を示す図である。
【図２４】置換文字列拡大の第２の具体例（続き）を示す図である。
【図２５】コードクローン共通化の例（その１）を示す図である。
【図２６】コードクローン共通化の例（その２）を示す図である。
【図２７】補助情報の例を示す図である。
【図２８】相違文字抽出の第３の具体例を示す図である。
【図２９】置換文字列拡大の第３の具体例を示す図である。
【図３０】相違文字抽出の第４の具体例を示す図である。
【図３１】置換文字列拡大の第４の具体例を示す図である。
【図３２】パラメータ化情報の例（その２）を示す図である。
【図３３】辞書情報の例を示す図である。
【図３４】置換文字列拡大の第５の具体例を示す図である。
【図３５】異なる文字数の相違単語を含むソースコードの例を示す図である。
【図３６】異なる文字数の相違単語を含むコードクローン情報の例を示す図である。
【図３７】異なる文字数の相違単語を含む相違単語情報の例を示す図である。
【図３８】異なる文字数の相違単語を含む相違文字情報の例を示す図である。
【図３９】置換文字列拡大の第６の具体例を示す図である。
【図４０】置換文字列拡大の第６の具体例（続き）を示す図である。
【図４１】パラメータ化情報の例（その３）を示す図である。
【図４２】３つのソースコードの例を示す図である。
【図４３】３つの類似コードに関するコードクローン情報の例を示す図である。
【図４４】３つの類似コードに関する相違単語情報の例を示す図である。
【図４５】３つの類似コードに関する相違文字情報の例を示す図である。
【図４６】置換文字列拡大の第７の具体例を示す図である。
【図４７】置換文字列拡大の第７の具体例（続き）を示す図である。
【図４８】置換文字列拡大の第７の具体例（続き）を示す図である。
【図４９】パラメータ化情報の例（その４）を示す図である。
【図５０】コードクローン共通化の単純な処理の例（比較例）を示す図である。
【発明を実施するための形態】
【００１３】
以下、本実施の形態を図面を参照して説明する。
［第１の実施の形態］
図１は、第１の実施の形態の情報処理装置を示す図である。情報処理装置１は、ユーザによるソフトウェアの開発作業を支援する装置である。ソフトウェア開発の現場では、第１のプログラムに含まれる機能を、第２のプログラムでも実現するために、第１のプログラムに含まれる当該機能のコード部分（コード片）を複製して、第２のプログラムに埋め込むことがある。埋め込み時には、該当のコード部分に含まれる変数名や処理名（例えば、関数名、オブジェクト名、および、サブルーチン名など）は、埋め込み先である第２のプログラムに合わせて変更される。
【００１４】
このような作業が行われることで、複数のソースプログラム内には、共通の機能を実現する類似するコード（処理の記述内容は共通しているが、利用される変数名や処理名などが互いに異なるコード）が含まれ得る。情報処理装置１は、このように複数のソースプログラム内で互いに類似するコード（類似コードあるいはコードクローンと称することがある）を検出し、共通化する機能を提供する。
【００１５】
具体的には、情報処理装置１は、類似コードにおける共通部分と、変数名や処理名などの相違部分とを分けて管理し、相違部分に対してユーザによる事後的な設定を許容する。すると、各ソースプログラム内の該当コードの記述を、共通コードの呼び出し、および、該当のソースプログラムに応じた変数名や処理名の設定の記述に置換できる。情報処理装置１は、こうしてソースプログラム内の類似コードを共通化することで、コードの保守性および再利用可能性を高める。特に、情報処理装置１は、類似コードにおける相違部分の抽出方法を工夫することで、ソフトウェアの開発作業の効率を改善する。具体的には、次の通りである。
【００１６】
情報処理装置１は、記憶部１ａおよび演算部１ｂを有する。記憶部１ａは、ＲＡＭ（Random Access Memory）などの揮発性記憶装置でもよいし、ＨＤＤ（Hard Disk Drive）やフラッシュメモリなどの不揮発性記憶装置でもよい。演算部１ｂは、ＣＰＵ（Central Processing Unit）、ＤＳＰ（Digital Signal Processor）、ＡＳＩＣ（Application Specific Integrated Circuit）、ＦＰＧＡ（Field Programmable Gate Array）などを含み得る。演算部１ｂはプログラムを実行するプロセッサであってもよい。ここでいう「プロセッサ」には、複数のプロセッサの集合（マルチプロセッサ）も含まれ得る。すなわち、情報処理装置１は、記憶部１ａ（メモリ）と演算部１ｂ（プロセッサ）とを含む。情報処理装置１は、コンピュータと呼ばれてもよい。
【００１７】
記憶部１ａは、複数のソースコードを記憶する。複数のソースコードは、ソースコードＰＦ１，ＰＦ２を含む。記憶部１ａは、演算部１ｂによる処理に応じて生成される、類似コードＳＣ１，ＳＣ２、相違単語情報Ｄ１、相違文字情報Ｄ２およびパラメータ化情報Ｄ３を記憶する。ここで、図１において、各コードの左側に付された数値は行番号である。
【００１８】
ソースコードＰＦ１，ＰＦ２は、ユーザによって作成されたプログラムのコードである。ソースコードＰＦ１，ＰＦ２は、所定の命令や変数名および処理名などを示す文字列を含む。命令を示す文字または文字列（例えば、“ＰＥＲＦＯＲＭ”、“ＩＦ”、“＝”（イコール記号）、“ＴＨＥＮ”、“ＥＮＤ−ＩＦ”、“ＭＯＶＥ”など）は、プログラム言語に応じて予め定められた予約語である。プログラム言語に応じた予約語の情報は、記憶部１ａに予め格納されている。
【００１９】
類似コードＳＣ１，ＳＣ２は、ソースコードＰＦ１，ＰＦ２それぞれから検出された類似コードである。相違単語情報Ｄ１は、類似コードＳＣ１，ＳＣ２から抽出された互いに相違する単語（相違単語と称する）の情報である。相違文字情報Ｄ２は、相違単語間における相違する文字（相違文字と称する）の位置の情報である。パラメータ化情報Ｄ３は、各類似コードに含まれるパラメータ化対象の文字列（置換文字列と称する）を示す情報である。置換文字列は、各類似コード内でパラメータ化可能な（ユーザによる設定を許容する）文字列を表している。パラメータ化情報Ｄ３は、各類似コードを共通コード化した場合の共通コードに含まれるパラメータ数の情報も含む。パラメータ数は、類似コードＳＣ１（または、類似コードＳＣ２）においてパラメータ化の対象の文字列部分の数ともいえる。
【００２０】
情報処理装置１が実行する類似コードの共通化の処理において、ソースコードＰＦ１，ＰＦ２が入力であり、パラメータ化情報Ｄ３が出力である。ソフトウェア開発を行うユーザは、例えば、パラメータ化情報Ｄ３の内容を参照することで、複数のソースコード内における置換文字列およびパラメータ数を確認することができる。
【００２１】
演算部１ｂは、ソースコードＰＦ１，ＰＦ２の入力を受け付ける（ただし、入力されるソースコードの数は３以上でもよい）。演算部１ｂは、ソースコードＰＦ１，ＰＦ２を比較して、類似コードＳＣ１，ＳＣ２を検出する（類似コード検出）。例えば、ソースコードＰＦ１，ＰＦ２では、両者とも、２行目から６行目の記述において処理内容を示す予約語の記述が一致し、変数名を表す文字列が相違している。一方、ソースコードＰＦ１，ＰＦ２では、１行目および７行目の記述について、処理内容を示す予約の記述が相違している（処理名を表す文字列も相違している）。このため、演算部１ｂは、ソースコードＰＦ１，ＰＦ２それぞれの２行目から６行目の記述を類似コードとして検出する。すなわち、演算部１ｂは、ソースコードＰＦ１の２行目から６行目の記述に相当する類似コードＳＣ１を検出する。演算部１ｂは、ソースコードＰＦ２の２行目から６行目の記述に相当する類似コードＳＣ２を検出する。
【００２２】
次に、演算部１ｂは、互いに類似する類似コードＳＣ１，ＳＣ２それぞれにおいて共通の箇所に記述され互いに相違する複数の単語（相違単語）を抽出し、当該相違単語の抽出結果を示す相違単語情報Ｄ１を生成する。例えば、類似コードＳＣ１の１行目には、“ＩＦ  カウントフラグ  ＝  “１”  ＴＨＥＮ”という記述がある。また、類似コードＳＣ２の１行目には、“ＩＦ  ラウンドフラグ  ＝  “１”  ＴＨＥＮ”という記述がある。
【００２３】
この場合、共通の処理内容における“ＩＦ”と“＝”との間の共通の箇所に、類似コードＳＣ１では“カウントフラグ”という単語を表す文字列が記述され、類似コードＳＣ２では“ラウンドフラグ”という単語を表す文字列が記述されている。したがって、類似コードＳＣ１の単語“カウントフラグ”および類似コードＳＣ２の単語“ラウンドフラグ”は、類似コードＳＣ１，ＳＣ２それぞれにおいて、共通の箇所に記述され互いに相違する複数の単語である。
【００２４】
同様に、類似コードＳＣ１の単語“カウント出力”および類似コードＳＣ２の単語“ラウンド出力”も、類似コードＳＣ１，ＳＣ２それぞれにおいて、共通の箇所に記述され互いに相違する複数の単語である。このため、演算部１ｂは、“カウントフラグ”と“ラウンドフラグ”との単語ペアｐ１、および、“カウント出力”と“ラウンド出力”との単語ペアｐ２を、類似コードＳＣ１，ＳＣ２から抽出し、相違単語情報Ｄ１を生成する。
【００２５】
次に、演算部１ｂは、各単語ペア（単語ペアに属する複数の単語の間）で相違する文字（相違文字）の位置（相違位置）を検出し、相違位置の検出結果を示す相違文字情報Ｄ２を生成する。ここで、演算部１ｂは、各単語の先頭から後方に向かって、文字の位置を表す番号を“１”、“２”、“３”、・・・と昇順に付与する。
【００２６】
単語ペアｐ１の場合、単語“カウントフラグ”と単語“ラウンドフラグ”とを比較すると、各単語の先頭（位置番号“１”）が“カ”および“ラ”で異なっている。また、各単語の先頭から４番目（位置番号“４”）が“ト”および“ド”で異なっている。このため、演算部１ｂは、単語ペアｐ１に対して、相違位置“１−１，４−４”を検出する。ここで、相違位置の表記において、“１−１”（２つの単語の文字位置をハイフン記号で結んだ表現）は、両単語の１番目の文字列同士が相違していることを示す。同様に“４−４”は、両単語の４番目の文字列同士が相違していることを示す。単語ペアｐ２の場合も、単語ペアｐ１と同様である。したがって、演算部１ｂは、単語ペアｐ１に対して相違位置“１−１，４−４”を、単語ペアｐ２に対して相違位置“１−１，４−４”を検出し、相違文字情報Ｄ２を生成する。
【００２７】
次に、演算部１ｂは、各相違単語について、相違位置の前方に連なる１以上の文字および相違位置の後方に連なる１以上の文字の両方または何れか一方と相違文字とを含む文字列を、パラメータ化の対象部分とする置換文字列と決定する。
【００２８】
例えば、演算部１ｂは、単語ペアｐ１では、相違文字“カ”および“ラ”について、各相違文字の相違位置“１”の後方に連なる１以上の文字を（各文字の並び順を維持して）各相違文字に結合し、置換文字列とする。一例として、演算部１ｂは、単語ペアｐ１について、類似コードＳＣ１では“カウントフラグ”を、類似コードＳＣ２では“ラウンドフラグ”をそれぞれ置換文字列とすることが考えられる。この場合、演算部１ｂは、単語ペアｐ２について、類似コードＳＣ１では“カウント出力”を、類似コードＳＣ２では“ラウンド出力”をそれぞれ置換文字列とする。すると、パラメータ数は２である。
【００２９】
あるいは、演算部１ｂは、類似コードＳＣ１，ＳＣ２と置換文字列の候補とを用いて作成される共通コードに含まれるパラメータの数に基づいて、置換文字列を決定してもよい。例えば、単語ペアｐ１，ｐ２の関係では、類似コードＳＣ１では“カウント”を、類似コードＳＣ２では“ラウンド”を、それぞれ置換文字列とした方がパラメータの数を１に抑えられる。そこで、演算部１ｂは、各相違単語のうち相違位置から１文字ずつ前方または後方に文字列範囲を拡大しながらパラメータの数の増減を確認し、類似コードＳＣ１，ＳＣ２を共通化するときのパラメータの数がより少なくなる置換文字列を特定してもよい。上記の例でいえば、演算部１ｂは、各相違単語の先頭の“カ”および“ラ”から後方に１文字ずつ拡大しながらパラメータの数の増減を確認し、類似コードＳＣ１，ＳＣ２を共通化するときのパラメータの数がより少なくなる置換文字列を特定してもよい。パラメータの数が少ない方が、共通コードの可読性や再利用可能性を高められるからである。
【００３０】
また、演算部１ｂは、相違位置から前方または後方に１文字ずつ検査して、相違単語に含まれる所定の記号（例えば、ハイフン“−”やスラッシュ“／”などの区切り文字）を検出することで、置換文字列とする文字列範囲を決定してもよい。特定の記号によって、変数名や処理名などの意味的な区切りを表すことが多いからである。あるいは、演算部１ｂは、文字の種類が変わる境界（例えば、アルファベット／数字の境界、アルファベットの大文字／小文字の境界、アルファベット／かな文字の境界など）を検出することで、置換文字列とする文字列範囲を決定してもよい。区切り文字などと同様に、文字の種類が変わる位置に、変数名や処理名などの意味的な区切りが存在する可能性が高いからである。
【００３１】
そして、演算部１ｂはパラメータ化情報Ｄ３を出力する。例えば、演算部１ｂは、上記のように類似コードＳＣ１，ＳＣ２におけるパラメータ数がより少なくなるように、パラメータ化を行う。上記の例の場合、演算部１ｂは、類似コードＳＣ１について相違文字“カ”に対し、後方の文字列“ウント”を結合した“カウント”、および、類似コードＳＣ２について相違文字“ラ”に対し、後方の文字列“ウンド”を結合した“ラウンド”を置換文字列とする。なぜなら、次の１文字後方まで置換文字列を拡張すると、“カウントフ”と“ラウンドフ”とに対して１つ目のパラメータを、“カウント出”と“ラウンド出”とに対して２つ目のパラメータを、それぞれ用意することになり、パラメータ数が１から２へ増加するからである。この場合、パラメータ化情報Ｄ３は、類似コードＳＣ１における置換文字列“カウント”、類似コードＳＣ２における置換文字列“ラウンド”の情報、および、パラメータ数“１”の情報を含む。
【００３２】
例えば、ユーザは、パラメータ化情報Ｄ３の内容を参照して、ソースコードＰＦ１，ＰＦ２それぞれの置換文字列およびパラメータを１つ設けることで、ソースコードＰＦ１，ＰＦ２の一部を共通化できることを確認することができる。ユーザは、当該確認に応じて、複数のソースコード間におけるコード片の複製状況や共通化を行うか否かの決定などを行える。演算部１ｂは、共通化の指示を受けて、パラメータ化情報Ｄ３を基に、ソースコードＰＦ１，ＰＦ２の類似コード部分を共通化した共通コードを生成し、ソースコードＰＦ１，ＰＦ２の類似コード部分を共通コードで置換する処理を行ってもよい。
【００３３】
ここで、例えば、互いに類似するコード部分について、単に相違する文字の箇所のみを差分として検出し、当該コード部分を共通化することも考えられる。この場合、上記の例では、“カウントフラグ”の“カ”および“ラウンドフラグ”の“ラ”が１つ目の差分、“カウントフラグ”の“ト”および“ラウンドフラグ”の“ド”が２つ目の差分として検出されることになる。この場合、各相違単語の１番目および４番目の文字をプレースホルダに置き換えてパラメータ化する。例えば、１番目のプレースホルダを“！”（エクスクラメーションマーク）とし、４番目のプレースホルダを“？”（クエスチョンマーク）とする。すると、共通コード内で相違単語に相当する単語を“！ウン？フラグ”と表すことになる。
【００３４】
しかし、このように、互いに類似するコード部分を単純に文字列として比較し、相違箇所のみをパラメータ化するだけでは、ソフトウェア開発の効率性の観点からは不十分である。なぜなら、共通化したコード内に相違箇所のみがパラメータとして点在すると、個々のパラメータのコード内での意味が薄れ、また、パラメータの数が増え、可読性や再利用可能性が低い状態でパラメータ化する部分が導出されるおそれがあるからである。
【００３５】
より具体的には、共通化したコード内に相違箇所（上記“！”や“？”の箇所）のみがパラメータとして点在すると、個々のパラメータのコード内での意味が明確でなくなる。例えば、上記のように“！ウン？フラグ”では、当該変数名が何を表しているかが分かり難く、可読性が低下する。また、上記のように相違箇所（上記“！”や“？”の部分）毎にパラメータ化されてしまうので、パラメータの数が増え、また、置換対象部分にあてはめる文字列の自由度が減り、再利用可能性が低下する。例えば、上記のように共通コード内で、“！ウン？フラグ”のように変数名を表すとすると、該当部分の記述が“エンドフラグ”であるコード片には当該共通コードを再利用できない。
【００３６】
そこで、情報処理装置１は、各類似コードにおける相違単語のうち、互いに相違する文字位置から前方および後方の両方または何れか一方に１文字以上拡大した文字列範囲を、パラメータ化対象の置換文字列とする。これにより、単に相違箇所のみをパラメータ化するよりも、共通コードの可読性、および、再利用可能性を高めることができる。
【００３７】
例えば、上記のように、情報処理装置１は、パラメータ化候補の文字列範囲を１文字ずつ拡大しながらパラメータ数の増減を確認し、共通コードにおけるパラメータ数が少なくなる置換文字列を特定する。すると、プレースホルダを“？”として、“カウントフラグ”や“ラウンドフラグ”を、“？フラグ”のように表すことができ、何らかのフラグを表していることが明確となり、置換文字列の可読性を高められる。また、パラメータ数を少なくすることで、ある程度まとまった文字列範囲をパラメータ化できる。このため、例えば、上記のように該当箇所に“エンドフラグ”を含むコード片にも、“？フラグ”で共通化した共通コードを適用することが可能となり、共通コードの再利用可能性を高められる。
【００３８】
このように、情報処理装置１は、意味のある文字列範囲をパラメータ化対象とすることで、共通コードの可読性、および、再利用可能性を高め、ユーザによるプログラムの作成や保守に伴う作業を省力化できる。その結果、情報処理装置１は、ソフトウェア開発の効率を改善できる。
【００３９】
次に、ユーザによるソフトウェア開発を支援するサーバコンピュータ（単にサーバと称することがある）を例示して、上記の情報処理装置１の機能をより具体的に説明する。
［第２の実施の形態］
図２は、第２の実施の形態のサーバのハードウェア例を示す図である。サーバ１００は、情報処理装置１の一例である。サーバ１００は、プロセッサ１０１、ＲＡＭ１０２、ＨＤＤ１０３、画像信号処理部１０４、入力信号処理部１０５、媒体リーダ１０６および通信インタフェース１０７を有する。各ユニットはサーバ１００のバスに接続されている。
【００４０】
プロセッサ１０１は、サーバ１００の情報処理を制御する。プロセッサ１０１は、マルチプロセッサであってもよい。プロセッサ１０１は、例えばＣＰＵ、ＤＳＰ、ＡＳＩＣまたはＦＰＧＡなどである。プロセッサ１０１は、ＣＰＵ、ＤＳＰ、ＡＳＩＣ、ＦＰＧＡなどのうちの２以上の要素の組み合わせであってもよい。
【００４１】
ＲＡＭ１０２は、サーバ１００の主記憶装置である。ＲＡＭ１０２は、プロセッサ１０１に実行させるＯＳ（Operating System）のプログラムやアプリケーションプログラムの少なくとも一部を一時的に記憶する。また、ＲＡＭ１０２は、プロセッサ１０１による処理に用いる各種データを記憶する。
【００４２】
ＨＤＤ１０３は、サーバ１００の補助記憶装置である。ＨＤＤ１０３は、内蔵した磁気ディスクに対して、磁気的にデータの書き込みおよび読み出しを行う。ＨＤＤ１０３は、ＯＳのプログラム、アプリケーションプログラム、および各種データを記憶する。サーバ１００は、フラッシュメモリやＳＳＤ（Solid State Drive）などの他の種類の補助記憶装置を備えてもよく、複数の補助記憶装置を備えてもよい。
【００４３】
画像信号処理部１０４は、プロセッサ１０１からの命令に従って、サーバ１００に接続されたディスプレイ１１に画像を出力する。ディスプレイ１１としては、ＣＲＴ（Cathode Ray Tube）ディスプレイや液晶ディスプレイなどを用いることができる。
【００４４】
入力信号処理部１０５は、サーバ１００に接続された入力デバイス１２から入力信号を取得し、プロセッサ１０１に出力する。入力デバイス１２としては、例えば、マウスやタッチパネルなどのポインティングデバイス、キーボードなどを用いることができる。
【００４５】
媒体リーダ１０６は、記録媒体１３に記録されたプログラムやデータを読み取る装置である。記録媒体１３として、例えば、フレキシブルディスク（ＦＤ：Flexible Disk）やＨＤＤなどの磁気ディスク、ＣＤ（Compact Disc）やＤＶＤ（Digital Versatile Disc）などの光ディスク、光磁気ディスク（ＭＯ：Magneto-Optical disk）を使用できる。また、記録媒体１３として、例えば、フラッシュメモリカードなどの不揮発性の半導体メモリを使用することもできる。媒体リーダ１０６は、例えば、プロセッサ１０１からの命令に従って、記録媒体１３から読み取ったプログラムやデータをＲＡＭ１０２またはＨＤＤ１０３に格納する。
【００４６】
通信インタフェース１０７は、ネットワーク１０を介して他の装置と通信を行う。通信インタフェース１０７は、有線通信インタフェースでもよいし、無線通信インタフェースでもよい。
【００４７】
ここで、サーバ１００は、複数のソースプログラムに含まれるコードクローンの共通化を支援する機能を提供する。まず、具体的なソースコードの例を挙げ、コードクローンの抽出方法を例示する。
【００４８】
図３は、コードクローンの抽出例を示す図である。ソースコードＰ１，Ｐ２は、ユーザにより作成されたプログラムである。第２の実施の形態では、プログラム言語の一例として、ＣＯＢＯＬを想定する。ただし、プログラム言語は、Ｆｏｒｔｒａｎ、Ｃ、Ｊａｖａ（登録商標）など、種々のものを利用できる。ソースコードＰ１のファイル名は、“ＰＲＯＧ００１．ＣＢＬ”である。ソースコードＰ２のファイル名は、“ＰＲＯＧ００２．ＣＢＬ”である。なお、以下に示す図中、各コードの左側に付された数値は行番号である。
【００４９】
例えば、サーバ１００は、ソースコードＰ１，Ｐ２に含まれる予約語と予約語以外の単語とを区別し、予約語以外の単語を匿名化する。サーバ１００は、予約語以外の単語のうち、引用符（ダブルクォーテーションなど）で囲われた単語を“＄文字列＄”と匿名化し、引用符なしで記述された単語を“＄名前＄”と匿名化する。
【００５０】
コードＰ１ａは、ソースコードＰ１の匿名化処理後のコードである。コードＰ１ａでは、例えば、“ＰＥＲＦＯＲＭ”や“ＩＦ”などの予約語以外の“処理開始”、“Ｓ１１Ａフラグ”、“Ｓ１１Ａ名前”、“エラー処理”および“処理終了”といった文字列が“＄名前＄”と匿名化されている。
【００５１】
コードＰ２ａは、ソースコードＰ２の匿名化処理後のコードである。コードＰ２ａでは、コードＰ１ａと同様に、予約語以外の““開始””および““終了””といった引用符で囲われた文字列が“＄文字列＄”と匿名化されている。また、予約語以外の“Ｓ１２Ａフラグ”、“Ｓ１２Ａ名前”および“エラー処理”といった文字列が“＄名前＄”と匿名化されている。
【００５２】
コードＰ１ａ，Ｐ２ａのうち、２行目から６行目の範囲（コード片ｆｒ１）では、予約語および匿名化部分の記述内容が一致している。このため、サーバ１００は、ソースコードＰ１，Ｐ２のうち、コード片ｆｒ１に対応する部分を、互いに類似するコード部分（コードクローンに相当する部分）として特定する。
【００５３】
次に、コードクローンを共通化するために考えられる単純な方法を例示し、その問題点を説明する。
図４は、コードクローン共通化の単純な方法の例（その１）を示す図である。例えば、コードＣ１１は、ソースコードＰ１のうちのコード片ｆｒ１に対応するコードクローンである。同様に、コードＣ１２は、ソースコードＰ２のうちのコード片ｆｒ１に対応するコードクローンである。これらをコンピュータにより比較させ、コードＣ１１，Ｃ１２の間で相違単語のペアを取得させ、テーブルＴ１に記録させる。この場合、コードＣ１１の単語“Ｓ１１Ａフラグ”およびコードＣ１２の単語“Ｓ１２Ａフラグ”が相違単語の１つ目のペアである。また、コードＣ１１の単語“Ｓ１１Ａ名前”およびコードＣ１２の単語“Ｓ１２Ａ名前”が相違単語の２つ目のペアである。１つ目のペアおよび２つ目のペアの両方とも、相違文字は先頭から３番目の文字である。テーブルＴ１における相違の項目には、両コードの相違文字が登録されている。例えば、相違の項目における“１＜＝＞２”の表記は、コードＣ１１側の文字“１”と、コードＣ１２側の文字“２”とが相違することを表している（以下の説明でも、同様の表現を用いることがある）。
【００５４】
単純に相違文字の部分だけをパラメータ化すると、例えば、プレースホルダを“？”として、コード片ｆｒ１の“＄名前＄”部分を“Ｓ１？Ａフラグ”や“Ｓ１？Ａ名前”のように記述することになる。共通コードＣｎ１は、当該記述を用いたコードクローンの共通化結果である。ここで、共通コードＣｎ１のファイル名を“ＣＯＭＭＯＮ０１．ＣＢＬ”とする。
【００５５】
すると、ソースコードＰ１の該当のコードクローンを、共通コードＣｎ１の呼び出し（コピー）、および、パラメータに相当するプレースホルダへの“１”の設定、を行う記述に置換できる。より具体的には、ソースコードＰ１のコードＣ１１に相当する部分を、“ＣＯＰＹ  ＣＯＭＭＯＮ０１  ＲＥＰＬＡＣＩＮＧ  ＝＝？＝＝  ＢＹ  ＝＝１＝＝”という記述に置換できる。ソースコードＰｒ１は、ソースコードＰ１に対する当該置換後の記述を示す。
【００５６】
同様に、ソースコードＰ２の該当のコードクローンを、共通コードＣｎ１の呼び出し（コピー）、および、パラメータに相当するプレースホルダへの“２”の設定、を行う記述に置換できる。より具体的には、ソースコードＰ２のコードＣ１２に相当する部分を、“ＣＯＰＹ  ＣＯＭＭＯＮ０１  ＲＥＰＬＡＣＩＮＧ  ＝＝？＝＝  ＢＹ  ＝＝２＝＝”という記述に置換できる。ソースコードＰｒ２は、ソースコードＰ２に対する当該置換後の記述を示す。
【００５７】
しかし、上記のように、“＄名前＄”部分を、“Ｓ１？Ａフラグ”や“Ｓ１？Ａ名前”のように相違箇所のみをパラメータ化してしまうと、共通コードＣｎ１の再利用可能性が低下する。例えば、「Ｓ２１Ｂフラグ」の追加時に、共通コードＣｎ１を再利用できないことになる。
【００５８】
図５は、コードクローン共通化の単純な方法の例（その２）を示す図である。次の例として、ソースコードＰ１，Ｐ２とは別の２つのソースコードを考える。当該２つのソースコードに対するコードクローンとして、コードＣ２１，Ｃ２２が検出されたとする。この場合、コードＣ２１の単語“カウントフラグ”およびコードＣ２２の単語“ラウンドフラグ”が相違単語の１つ目のペアである。また、コードＣ２１の単語“カウント出力”およびコードＣ２２の単語“ラウンド出力”が相違単語の２つ目のペアである。１つ目のペアおよび２つ目のペアの両方とも、相違文字は、先頭から１番目の文字、および、先頭から４番目の文字である。テーブルＴ２は、コードＣ２１，Ｃ２２における相違文字を示している。
【００５９】
単純に相違文字の部分だけをパラメータ化することを考える。例えば、１つ目のプレースホルダを“Ｘ”、２つ目のプレースホルダを“Ｙ”とする。この場合、“カウントフラグ”および“ラウンドフラグ”は、“ＸウンＹフラグ”と表される。また、“カウント出力”および“ラウンド出力”は、“ＸウンＹ出力”と表される。共通コードＣｎ２は、当該記述を用いたコードクローンの共通化結果である。ここで、共通コードＣｎ２のファイル名を“ＣＯＭＭＯＮ０２．ＣＢＬ”とする。
【００６０】
すると、元の第１のソースコードのコードＣ２１に相当する部分を、共通コードＣｎ２の呼び出し（コピー）、プレースホルダ“Ｘ”への文字“カ”の設定、および、プレースホルダ“Ｙ”への文字“ト”の設定、を行う記述に置換できる。より具体的には、ソースコードＰｒ３は、当該置換後のコードである。ソースコードＰｒ３における“ＣＯＰＹ  ＣＯＭＭＯＮ０２  ＲＥＰＬＡＣＩＮＧ  ＝＝Ｘ＝＝  ＢＹ  ＝＝カ＝＝  ＝＝Ｙ＝＝  ＢＹ  ＝＝ト＝＝”の記述が置換後の記述である。
【００６１】
同様に、元の第２のソースコードのコードＣ２２に相当する部分を共通コードＣｎ２の呼び出し（コピー）、プレースホルダ“Ｘ”への文字“ラ”の設定、および、プレースホルダ“Ｙ”への文字“ド”の設定、を行う記述に置換できる。より具体的には、ソースコードＰｒ４は、当該置換後のコードである。ソースコードＰｒ４における“ＣＯＰＹ  ＣＯＭＭＯＮ０２  ＲＥＰＬＡＣＩＮＧ  ＝＝Ｘ＝＝  ＢＹ  ＝＝ラ＝＝  ＝＝Ｙ＝＝  ＢＹ  ＝＝ド＝＝”の記述が置換後の記述である。
【００６２】
しかし、上記のように、“ＸウンＹフラグ”や“ＸウンＹ出力”のように相違箇所のみをパラメータ化してしまうと、共通コードＣｎ２の可読性が低下する。例えば、“ＸウンＹフラグ”によって置換される文字の意味が分かりにくい。
【００６３】
このように、可読性および再利用可能性の低い共通コードが作成されてしまうと、ソフトウェアの円滑な開発の妨げとなり、開発作業の効率を低下させる要因になり得る。そこで、サーバ１００は、パラメータ化の方法を工夫し、ソフトウェアの円滑な開発を支援する機能を提供する。
【００６４】
図６は、サーバの機能例を示す図である。サーバ１００は、記憶部１１０、コードクローン検出部１２０、相違単語抽出部１３０、相違文字抽出部１４０および置換文字列決定部１５０を有する。
【００６５】
記憶部１１０は、ＲＡＭ１０２やＨＤＤ１０３に確保された記憶領域を用いて実現できる。コードクローン検出部１２０、相違単語抽出部１３０、相違文字抽出部１４０および置換文字列決定部１５０は、ＲＡＭ１０２に記憶されたプログラムを、プロセッサ１０１が実行することで実現される。コードクローン検出部１２０、相違単語抽出部１３０、相違文字抽出部１４０および置換文字列決定部１５０それぞれをプログラムのモジュールと考えてもよい。
【００６６】
記憶部１１０は、ソースコード群１１１、コードクローン情報１１２、相違単語情報１１３、相違文字情報１１４、補助情報１１５およびパラメータ化情報１１６を記憶する。
ソースコード群１１１は、ユーザによって作成されたソースプログラムの集合である。第２の実施の形態の例では、各ソースコードは、前述のようにＣＯＢＯＬを用いて記述されている。
【００６７】
コードクローン情報１１２は、コードクローン検出部１２０によりソースコード群１１１から検出されたコードクローンの情報である。
相違単語情報１１３は、相違単語抽出部１３０によりコードクローン情報１１２から抽出された相違単語の情報である。
【００６８】
相違文字情報１１４は、相違文字抽出部１４０により相違単語情報１１３から抽出された相違文字の位置の情報である。
補助情報１１５は、置換文字列決定部１５０による置換文字列決定に用いられる補助的な情報（置換文字列を決定するための条件の情報）である。ただし、補助情報１１５を用いなくてもよい。ここで、前半の説明（図２６までの説明）では補助情報１１５を用いない例を説明し、その後、図２７から図３４までの説明において、補助情報１１５を用いる例を説明する。
【００６９】
パラメータ化情報１１６は、置換文字列決定部１５０により出力されるパラメータ化の結果である。なお、記憶部１１０は、プログラム言語に応じた予約語の情報も予め記憶する。
【００７０】
コードクローン検出部１２０は、ソースコード群１１１に含まれる複数のソースコードを比較して、コードクローン（互いに類似するコード片）を検出する。例えば、ユーザは、コードクローン検出部１２０に、比較対象とする２以上のソースコードのファイル名を指定することができる。例えば、コードクローン検出部１２０は、図３で例示したように、指定された各ソースコードに対して匿名化の処理を行う。コードクローン検出部１２０は、匿名化後の各コードを比較することで、コードクローンを検出する。コードクローン検出部１２０は、コードクローンの検出結果であるコードクローン情報１１２を生成し、記憶部１１０に格納する。
【００７１】
相違単語抽出部１３０は、記憶部１１０に記憶されたコードクローン情報１１２に基づいて、各コードクローンから共通の箇所に記述され互いに相違する相違単語を抽出する。相違単語抽出部１３０は、相違単語の抽出結果である相違単語情報１１３を生成し、記憶部１１０に格納する。
【００７２】
相違文字抽出部１４０は、記憶部１１０に記憶された相違単語情報１１３に基づいて、各相違単語における相違文字の位置（相違位置）を抽出する。相違文字抽出部１４０は、相違位置の抽出結果である相違文字情報１１４を生成し、記憶部１１０に格納する。
【００７３】
置換文字列決定部１５０は、記憶部１１０に記憶された相違文字情報１１４に基づいて、各コードクローンでパラメータ化の対象とする置換文字列を決定する。具体的には、置換文字列決定部１５０は、各相違単語において、相違文字情報１１４で示される相違位置から前方および後方に１文字ずつ置換文字列の候補とする文字列範囲を広げていく。置換文字列決定部１５０は、当該文字列範囲を１文字広げるたびに、現在の文字列範囲で示される置換文字列の候補が置換文字列の決定条件に合致するか否かを判定し、置換文字列を決定する。ここで、置換文字列の決定条件とは、「コードクローンを共通化した際の共通コードにおけるパラメータ数が少なくなる置換文字列を優先する」というものである。置換文字列決定部１５０は、各コードクローン（あるいは各ソースコード）に対応する置換文字列およびコードクローン部分を共通化した際のパラメータ数の情報を含むパラメータ化情報１１６を生成し、記憶部１１０に格納する。
【００７４】
図７は、ソースコードの例を示す図である。ソースコード群１１１は、ソースコードＰ１，Ｐ２，Ｐ３，Ｐ４を含む。ソースコードＰ１，Ｐ２は、図２で例示した各ソースコードと同一である。また、ソースコードＰ３のファイル名は“ＰＲＯＧ００３．ＣＢＬ”である。ソースコードＰ４のファイル名は“ＰＲＯＧ００４．ＣＢＬ”である。
【００７５】
図８は、コードクローン情報の例を示す図である。例えば、コードクローン検出部１２０は、ユーザによりソースコードＰ１，Ｐ２のファイル名の入力を受け付けると、記憶部１１０に記憶されたソースコードＰ１，Ｐ２を比較して、コードクローン情報ＣＬ１を生成する。ここで、“コードクローン情報ＣＬ１”の表記のうち、“ＣＬ１”の部分をコードクローン情報の識別名（識別情報）とする。コードクローン情報ＣＬ１は、コードＣ１１，Ｃ１２を含む。
【００７６】
コードＣ１１は、ソースコードＰ１の一部分（コード片）である。コードＣ１１は、コードＣ１２に類似するコードであり、ソースコードＰ１，Ｐ２の比較に応じて検出されたコードクローンである。コードＣ１２は、ソースコードＰ２の一部分である。コードＣ１２は、コードＣ１１に類似するコードであり、ソースコードＰ１，Ｐ２の比較に応じて検出されたコードクローンである。
【００７７】
また、例えば、コードクローン検出部１２０は、ユーザによりソースコードＰ３，Ｐ４のファイル名の入力を受け付けると、記憶部１１０に記憶されたソースコードＰ３，Ｐ４を比較して、コードクローン情報ＣＬ２を生成する。
【００７８】
コードクローン情報ＣＬ２は、コードＣ２１，Ｃ２２を含む。コードＣ２１は、ソースコードＰ３の一部分である。コードＣ２１は、コードＣ２２に類似するコードであり、ソースコードＰ３，Ｐ４の比較に応じて検出されたコードクローンである。コードＣ２２は、ソースコードＰ４の一部分である。コードＣ２２は、コードＣ２１に類似するコードであり、ソースコードＰ３，Ｐ４の比較に応じて検出されたコードクローンである。
【００７９】
図９は、相違単語情報の例を示す図である。相違単語情報１１３は、コードクローン、ペア識別子、第１コードおよび第２コードの項目を含む。
コードクローンの項目には、コードクローン情報の識別名が登録される。ペア識別子の項目には、単語ペア（３以上のコードクローンに対しては３以上の相違単語の組み合わせとなるため、単語セットとなる）の識別子が登録される。第１コードの項目には、１つ目のコードクローンにおける相違単語が登録される。第２コードの項目には、２つ目のコードクローンにおける相違単語が登録される。相違単語情報１１３には、１つのコードクローン情報の識別名に対し、異なるペア識別子が設定された複数のレコードが登録され得る。
【００８０】
また、図８の例では、コードクローン情報ＣＬ１に対して第１コードは、コードＣ１１である。コードクローン情報ＣＬ１に対して第２コードは、コードＣ１２である。同様に、コードクローン情報ＣＬ２に対して第１コードは、コードＣ２１である。コードクローン情報ＣＬ２に対して第２コードは、コードＣ２２である。
【００８１】
例えば、相違単語情報１１３には、コードクローンが“ＣＬ１”、ペア識別子が“単語ペアａ１”、第１コードが“Ｓ１１Ａフラグ”、第２コードが“Ｓ１２Ａフラグ”という情報が登録される。これは、コードクローン情報ＣＬ１において、コードＣ１１における単語“Ｓ１１Ａフラグ”、および、コードＣ１２における単語“Ｓ１２Ａフラグ”それぞれが相違単語として抽出されたことを示す。また、当該相違単語のペアのペア識別子が“単語ペアａ１”であることを示す。
【００８２】
また、相違単語情報１１３には、コードクローンが“ＣＬ１”、ペア識別子が“単語ペアａ２”、第１コードが“Ｓ１１Ａ名前”、第２コードが“Ｓ１２Ａ名前”という情報が登録される。これは、コードクローン情報ＣＬ１において、コードＣ１１における単語“Ｓ１１Ａ名前”、および、コードＣ１２における単語“Ｓ１２Ａ名前”それぞれが相違単語として抽出されたことを示す。また、当該相違単語のペアのペア識別子が“単語ペアａ２”であることを示す。
【００８３】
また、相違単語情報１１３には、コードクローンが“ＣＬ２”、ペア識別子が“単語ペアｂ１”、第１コードが“カウントフラグ”、第２コードが“ラウンドフラグ”という情報が登録される。これは、コードクローン情報ＣＬ２において、コードＣ２１における単語“カウントフラグ”、および、コードＣ２２における単語“ラウンドフラグ”それぞれが相違単語として抽出されたことを示す。また、当該相違単語のペアのペア識別子が“単語ペアｂ１”であることを示す。
【００８４】
更に、相違単語情報１１３には、コードクローンが“ＣＬ２”、ペア識別子が“単語ペアｂ２”、第１コードが“カウント出力”、第２コードが“ラウンド出力”という情報が登録される。これは、コードクローン情報ＣＬ２において、コードＣ２１における単語“カウント出力”、および、コードＣ２２における単語“ラウンド出力”それぞれが相違単語として抽出されたことを示す。また、当該相違単語のペアのペア識別子が“単語ペアｂ２”であることを示す。
【００８５】
図１０は、相違文字情報の例を示す図である。相違文字情報１１４は、コードクローン、ペア識別子、第１コード、第２コードおよび相違位置の項目を含む。ここで、コードクローン、ペア識別子、第１コードおよび第２コードに登録される情報の内容は、図９で例示した相違単語情報１１３の同名の項目に登録される情報の内容と同じである。相違文字情報１１４は、相違位置の項目を更に含む点が、相違単語情報１１３と異なる。
【００８６】
相違位置の項目には、単語ペアに属する各相違単語における文字の相違位置が登録される。ここで、相違文字抽出部１４０および置換文字列決定部１５０は、単語内の各文字の位置を位置番号によって管理する。具体的には、単語の先頭の文字から後方の文字へ向かうに従って１文字ずつ、“１”、“２”、“３”、・・・と昇順の位置番号が付与される。そして、相違文字抽出部１４０は、“３−３”のように位置番号をハイフン記号（“−”）で結合した相違位置の情報を相違文字情報１１４に登録する。相違位置の表記のうち、ハイフン記号の左側の位置番号は第１コードに含まれる相違単語の相違位置に相当する。同様に、ハイフン記号の右側の位置番号は第２コードに含まれる相違単語の相違位置に相当する。
【００８７】
例えば、相違文字情報１１４には、コードクローンが“ＣＬ１”、ペア識別子が“単語ペアａ１”、第１コードが“Ｓ１１Ａフラグ”、第２コードが“Ｓ１２Ａフラグ”、相違位置が“３−３”という情報が登録される。これは、コードクローン情報ＣＬ１におけるコードＣ１１の相違単語“Ｓ１１Ａフラグ”、および、コードＣ１２の相違単語“Ｓ１２Ａフラグ”において、それぞれ先頭から３番目の文字が互いに相違していることを示す。ここで、“Ｓ１１Ａフラグ”の先頭から３番目の文字は“１”である。“Ｓ１２Ａフラグ”の先頭から３番目の文字は“２”である。
【００８８】
また、相違文字情報１１４には、コードクローンが“ＣＬ１”、ペア識別子が“単語ペアａ２”、第１コードが“Ｓ１１Ａ名前”、第２コードが“Ｓ１２Ａ名前”、相違位置が“３−３”という情報が登録される。これは、コードクローン情報ＣＬ１におけるコードＣ１１の相違単語“Ｓ１１Ａ名前”、および、コードＣ１２の相違単語“Ｓ１２Ａ名前”において、それぞれ先頭から３番目の文字が互いに相違していることを示す。ここで、“Ｓ１１Ａ名前”の先頭から３番目の文字は“１”である。“Ｓ１２Ａ名前”の先頭から３番目の文字は“２”である。
【００８９】
また、相違文字情報１１４には、コードクローンが“ＣＬ２”、ペア識別子が“単語ペアｂ１”、第１コードが“カウントフラグ”、第２コードが“ラウンドフラグ”、相違位置が“１−１，４−４”という情報が登録される。これは、コードクローン情報ＣＬ２におけるコードＣ２１の相違単語“カウントフラグ”、および、コードＣ２２の相違単語“ラウンドフラグ”において、それぞれ先頭から１番目の文字が互いに相違していることを示す。同様に、先頭から４番目の文字が互いに相違していることを示す。ここで、“カウントフラグ”の先頭から１番目の文字は“カ”である。“ラウンドフラグ”の先頭から１番目の文字は“ラである。“カウントフラグ”の先頭から４番目の文字は“ト”である。“ラウンドフラグ”の先頭から４番目の文字は“ド”である。
【００９０】
更に、相違文字情報１１４には、コードクローンが“ＣＬ２”、ペア識別子が“単語ペアｂ２”、第１コードが“カウント出力”、第２コードが“ラウンド出力”、相違位置が“１−１，４−４”という情報が登録される。これは、コードクローン情報ＣＬ２におけるコードＣ２１の相違単語“カウント出力”、および、コードＣ２２の相違単語“ラウンド出力”において、それぞれ先頭から１番目の文字が互いに相違していることを示す。同様に、先頭から４番目の文字が互いに相違していることを示す。ここで、“カウント出力”の先頭から１番目の文字は“カ”である。“ラウンド出力”の先頭から１番目の文字は“ラ”である。“カウント出力”の先頭から４番目の文字は“ト”である。“ラウンド出力”の先頭から４番目の文字は“ド”である。
【００９１】
図１１は、パラメータ化情報の例（その１）を示す図である。パラメータ化情報１１６は、コードクローン、パラメータ数、第１コード置換文字列および第２コード置換文字列の項目を含む。
【００９２】
コードクローンの項目には、コードクローンの識別情報が登録される。パラメータ数の項目には、該当のコードクローンを共通化するときの共通コードにおけるパラメータ数が登録される。第１コード置換文字列の項目には、第１コードにおける置換文字列が登録される。第２コード置換文字列の項目には、第２コードにおける置換文字列が登録される。
【００９３】
例えば、パラメータ化情報１１６には、コードクローンが“ＣＬ１”、パラメータ数が“１”、第１コード置換文字列が“Ｓ１１Ａ”、第２コード置換文字列が“Ｓ１２Ａ”という情報が登録される。これは、コードクローン情報ＣＬ１におけるコードＣ１１の置換文字列が“Ｓ１１Ａ”であり、コードＣ１２の置換文字列が“Ｓ１２Ａ”であり、これらをパラメータ化してコードクローン情報ＣＬ１を共通化した場合のパラメータ数が“１”であることを示す。
【００９４】
また、例えば、パラメータ化情報１１６には、コードクローンが“ＣＬ２”、パラメータ数が“１”、第１コード置換文字列が“カウント”、第２コード置換文字列が“ラウンド”という情報が登録される。これは、コードクローン情報ＣＬ２におけるコードＣ２１の置換文字列が“カウント”であり、コードＣ２２の置換文字列が“ラウンド”であり、これらをパラメータ化してコードクローン情報ＣＬ２を共通化した場合のパラメータ数が“１”であることを示す。
【００９５】
次に、以上のような構成を有するサーバ１００の処理手順を説明する。
図１２は、サーバの処理例を示すフローチャートである。以下、図１２に示す処理をステップ番号に沿って説明する。
【００９６】
（Ｓ１）コードクローン検出部１２０は、ユーザによる比較対象とする複数のソースコードのファイル名の入力を受け付ける。コードクローン検出部１２０は、記憶部１１０から該当のファイル名の複数のソースコードを取得し、各ソースコードを比較することで、コードクローンをソースコード毎に検出する。コードクローン検出部１２０は、コードクローンの検出結果であるコードクローン情報１１２を生成し、記憶部１１０に格納する。処理の詳細は、後述される。
【００９７】
（Ｓ２）相違単語抽出部１３０は、記憶部１１０に記憶されたコードクローン情報１１２に基づいて、コードクローン間の相違単語を抽出する。相違単語抽出部１３０は、相違単語の抽出結果である相違単語情報１１３を生成し、記憶部１１０に格納する。処理の詳細は、後述される。
【００９８】
（Ｓ３）相違文字抽出部１４０は、記憶部１１０に記憶された相違単語情報１１３に基づいて、相違単語間での相違文字の位置（相違位置）を検出する。相違文字抽出部１４０は、相違位置の検出結果である相違文字情報１１４を生成し、記憶部１１０に格納する。処理の詳細は、後述される。
【００９９】
（Ｓ４）置換文字列決定部１５０は、記憶部１１０に記憶された相違文字情報１１４に基づいて、相違位置を起点に置換文字列を拡大する。すなわち、置換文字列決定部１５０は、相違単語において、相違位置を起点として、前後に１文字ずつ置換文字列の候補の文字列範囲を拡大し、所定の条件（置換文字列の決定条件）を基に置換文字列を決定する。ここで用いられる条件は、前述のように、「コードクローンを共通化した際に共通コードにおけるパラメータ数が少なくなる置換文字列を優先する」というものである。処理の詳細は、後述される。
【０１００】
図１３は、コードクローン検出例を示すフローチャートである。以下、図１３に示す処理をステップ番号に沿って説明する。以下に示す手順は、図１２のステップＳ１に相当する。
【０１０１】
（Ｓ１１）コードクローン検出部１２０は、記憶部１１０を参照して、比較対象とする複数のソースコードを読み込む。
（Ｓ１２）コードクローン検出部１２０は、読み込んだソースコード内のテキスト情報を単語単位に分割する。ソースコードのテキスト情報では、各単語の間がスペースなどの特定の文字コードにより区切られている。コードクローン検出部１２０は、テキストに含まれるスペースなどを検出することで、当該スペースなどによって区切られた単語を区別することができる。
【０１０２】
（Ｓ１３）コードクローン検出部１２０は、単語の匿名化を行う。具体的には、記憶部１１０は、使用するプログラム言語（第２の実施の形態の例ではＣＯＢＯＬ）に応じた予約語を予め記憶する。コードクローン検出部１２０は、記憶部１１０に記憶された当該プログラム言語の予約語以外の単語について、“＄名前＄”（引用符で囲われていない予約語以外の単語）や“＄文字列＄”（引用符で囲われた予約語以外の単語）といった情報に置換する。
【０１０３】
（Ｓ１４）コードクローン検出部１２０は、各ソースコードの匿名化結果に対して単語列を比較し、同一の部分単語列（コードクローン部分）を検出する。例えば、図３でも示したように、コードクローン検出部１２０は、ソースコードＰ１，Ｐ２に対する匿名化結果であるコードＰ１ａ，Ｐ２ａを比較することで、同一の部分単語列（コード片ｆｒ１に相当）を検出する。
【０１０４】
（Ｓ１５）コードクローン検出部１２０は、ステップＳ１４で検出された単語列に相当するコード片をコードクローン情報１１２に記録する。ステップＳ１４で挙げた例でいえば、コードクローン検出部１２０は、コード片ｆｒ１に対応するソースコードＰ１のコードＣ１１、および、コード片ｆｒ１に対応するソースコードＰ２のコードＣ１２を含むコードクローン情報ＣＬ１を生成する。コードクローン検出部１２０は、コードクローン情報ＣＬ１を記憶部１１０に格納する（コードクローン情報ＣＬ１をコードクローン情報１１２に追加するということもできる）。
【０１０５】
ここで、ステップＳ１４において、コードクローン検出部１２０は、例えば次のようにして、匿名化後のコードＰ１ａ，Ｐ２ａを比較し、同一の部分単語列を検出する。
図１４は、コードクローン情報の抽出処理の例を示す図である。図１４で表される行列において、各行はコードＰ１ａの単語列に含まれる各単語に相当する。また、各列はコードＰ２ａの単語列に含まれる各単語に相当する。コードクローン検出部１２０は、同じ単語の存在する行列位置を記録する。例えば、同じ単語の存在する行列位置に“１”を、同じ単語の存在しない行列位置に“０”を、それぞれ記録する。そして、コードクローン検出部１２０は、行列位置の斜め方向に指定数以上同じである箇所（例えば、図１４中の範囲ｆｒ２に相当する箇所）をコードクローンに相当する部分として検出する。なお、範囲ｆｒ２に相当する箇所は、図３で例示したコード片ｆｒ１に対応する。コードクローン検出部１２０は、こうしてコード片ｆｒ１を検出し、ソースコードＰ１，Ｐ２から当該コード片ｆｒ１に相当する部分を抜き出すことで、コードクローン情報ＣＬ１を生成する。コードクローン検出部１２０は、コードクローン情報ＣＬ２を含む他のコードクローン情報も同様の方法により生成することができる。
【０１０６】
図１５は、相違単語抽出例を示すフローチャートである。以下、図１５に示す処理をステップ番号に沿って説明する。以下に示す手順は、図１２のステップＳ２に相当する。なお、以下の説明では、２つのソースコードを比較する場合を例示しているために「単語ペア」との用語を使用しているが、３以上のソースコードを比較する場合には、「単語ペア」を「単語セット」と読み替えることができる。
【０１０７】
（Ｓ２１）相違単語抽出部１３０は、コードクローン情報１１２に含まれる全ての単語ペアを処理済であるか否か（すなわち、全ての単語ペアについて以降のステップの処理を実行したか否か）を判定する。全ての単語ペアを処理済である場合、処理を終了する。全ての単語ペアを処理済でない場合、処理をステップＳ２２に進める。例えば、今回、ステップＳ１の処理により、コードクローン情報１１２として、コードクローン情報ＣＬ１が生成されている場合を考える。この場合、相違単語抽出部１３０は、コードクローン情報ＣＬ１に含まれるコードＣ１１，Ｃ１２から単語ペアを特定できる。具体的には、コードＣ１１，Ｃ１２それぞれにおいて共通の箇所に記述され互いに相違する２つの単語を単語ペアとする。より具体的には、図１４で示した行列の範囲ｆｒ２に含まれる部分のうち、予約語以外の共通箇所に対応するコードＣ１１の単語およびコードＣ１２の単語が単語ペアである。例えば、図１４の４行４列目の“＄名前＄”に相当する箇所について、コードＣ１１では単語“Ｓ１１Ａフラグ”が対応し、コードＣ１２では単語“Ｓ１２Ａフラグ”が対応する。よって、相違単語抽出部１３０は、単語“Ｓ１１Ａフラグ”および単語“Ｓ１２Ａフラグ”を単語ペアとして特定する。
【０１０８】
（Ｓ２２）相違単語抽出部１３０は、コードクローン情報１１２を参照して、未処理の単語ペアを取得する。例えば、相違単語抽出部１３０は、コードクローン情報ＣＬ１を参照して、ステップＳ２１で例示した、単語“Ｓ１１Ａフラグ”および単語“Ｓ１２Ａフラグ”を今回処理対象とする単語ペアとして取得する。
【０１０９】
（Ｓ２３）相違単語抽出部１３０は、ステップＳ２２で取得した単語ペアの各単語が同じ文字列であるか否かを判定する。同じ文字列である場合、当該単語ペアを相違単語抽出処理に関して処理済として、処理をステップＳ２１に進める。同じ文字列ではない場合、当該単語ペアを相違単語抽出処理に関して処理済として、処理をステップＳ２４に進める。同じ文字列であるか否かの判定は、単語ペアに属する各文字を比較することで行える。文字数、各文字および各文字の並び順の全てが同じであれば同じ文字列であり、何れかが異なれば同じ文字列ではない。単語“Ｓ１１Ａフラグ”および単語“Ｓ１２Ａフラグ”の例では、互いに異なる文字（先頭から３番目の文字が“１”、“２”で互いに異なる）を含むので、同じ文字列ではない。
【０１１０】
（Ｓ２４）相違単語抽出部１３０は、ステップＳ２３で同じ文字列ではない（すなわち、異なる文字列である）と判定された単語ペアを、相違単語情報１１３に記録する。例えば、相違単語抽出部１３０は、当該単語ペアとコードクローン情報１１２の識別情報とペア識別子とを対応付けた相違単語情報１１３（あるいは、相違単語情報１１３のレコードと称してもよい）を生成する。そして、処理をステップＳ２１に進める。
【０１１１】
図１６は、相違文字抽出例を示すフローチャートである。以下、図１６に示す処理をステップ番号に沿って説明する。以下に示す手順は、図１２のステップＳ３に相当する。
（Ｓ３１）相違文字抽出部１４０は、相違単語情報１１３に含まれる全ての単語ペアを処理済であるか否か（すなわち、全ての単語ペアについてステップＳ３２〜Ｓ３４の処理を実行したか否か）を判定する。全ての単語ペアを処理済である場合、処理を終了する。全ての単語ペアを処理済でない場合、処理をステップＳ３２に進める。例えば、今回、ステップＳ２の処理により、コードクローン情報ＣＬ１に対する相違単語情報１１３が生成されている場合を考える。この場合、相違文字抽出部１４０は、相違単語情報１１３に含まれるコードクローン情報ＣＬ１に関するレコードについて、ステップＳ３２〜Ｓ３４の処理を実行することになる。
【０１１２】
（Ｓ３２）相違文字抽出部１４０は、相違単語情報１１３を参照して、未処理の単語ペアを取得する。例えば、相違単語抽出部１３０は、相違単語情報１１３を参照して、ステップＳ３１で例示した、コードクローン情報ＣＬ１に関する相違単語“Ｓ１１Ａフラグ”および相違単語“Ｓ１２Ａフラグ”を今回処理対象とする単語ペアとして取得する。
【０１１３】
（Ｓ３３）相違文字抽出部１４０は、単語ペアの各相違単語を１文字ずつ比較し、相違する文字位置を検出する。相違単語“Ｓ１１Ａフラグ”および相違単語“Ｓ１２Ａフラグ”の例では、それぞれ先頭から３番目の文字が“１”、“２”で互いに異なる。このため、相違文字抽出部１４０は、相違する文字位置（相違位置）を、“３−３”と検出する。
【０１１４】
（Ｓ３４）相違文字抽出部１４０は、ステップＳ３３で検出した相違する文字位置（相違位置）を、相違文字情報１１４に記録する。例えば、相違文字抽出部１４０は、当該相違位置（例えば、“３−３”という情報）とコードクローン情報１１２の識別情報とペア識別子と各相違単語とを対応付けた相違文字情報１１４（あるいは、相違文字情報１１４のレコードと称してもよい）を生成する。相違文字抽出部１４０は、該当の単語ペアを、相違文字抽出処理に関して処理済にして、処理をステップＳ３１に進める。
【０１１５】
図１７は、相違文字情報の抽出処理の例を示す図である。例えば、相違文字抽出部１４０は、既存の方法を用いて、ステップＳ３３における相違文字および相違位置の抽出を行える。
【０１１６】
具体的には、まず、２つの文字列に含まれる各文字を縦、横に並べたグラフを用意する。図１７の例では、縦方向に文字列“ラウンドフラグ”の各文字を並べ、横方向に文字列“カウントフラグ”の各文字を並べている。この場合、グラフの始点は文字列の先頭側（グラフの左上頂点）である。グラフの終点は文字列の終端側（グラフの右下頂点）である。そして、当該グラフにおいて、同じ文字がある箇所に斜線を引く（相違文字抽出部１４０は、グラフを表す行列の該当位置に斜線に相当する情報を設定する）。その上で、相違文字抽出部１４０は、始点から終点に到達する経路の中で、斜線に相当する箇所を最も多く通る経路を探索し、当該経路における斜線以外の部分（図１７中の縦横移動の部分）を相違位置と特定する。
【０１１７】
こうして、相違文字抽出部１４０は、例えば、“カウントフラグ”および“ラウンドフラグ”という２つの文字列に対して、相違位置“１−１”（図１７の１行１列目に相当）、“４−４”（図１７の４行４列目に相当）を取得する。
【０１１８】
なお、図１７で例示した方法は、例えば、あるソフトウェアによるテキストの差分解析（例えば、ＵＮＩＸ（登録商標）などのＯＳで利用可能なｄｉｆｆコマンドなど）でも利用されることがある。
【０１１９】
図１８は、置換文字列拡大例を示すフローチャートである。以下、図１８に示す処理をステップ番号に沿って説明する。以下に示す手順は、図１２のステップＳ４に相当する。
（Ｓ４１）置換文字列決定部１５０は、相違文字情報１１４を参照して、相違文字を置換文字列とする。例えば、今回、コードクローン情報ＣＬ１に対して置換文字列を決定する場合、置換文字列決定部１５０は、相違文字情報１１４から単語ペアａ１，ａ２に関する相違位置“３−３”を取得する。そして、置換文字列決定部１５０は、相違単語“Ｓ１１Ａフラグ”、“Ｓ１２Ａフラグ”、“Ｓ１１Ａ名前”および“Ｓ１２Ａ名前”について、先頭から３番目の文字を相違文字とする。置換文字列決定部１５０は、まずは当該相違文字を置換文字列とする。なお、以後、置換文字列が確定されるまでのステップでいう「置換文字列」は、「置換文字列の候補」であると考えてもよい。
【０１２０】
（Ｓ４２）置換文字列決定部１５０は、置換文字列が単語の先頭を含むか否かを判定する。置換文字列が単語の先頭を含む場合、処理をステップＳ４７に進める。置換文字列が単語の先頭を含まない場合、処理をステップＳ４３に進める。
【０１２１】
（Ｓ４３）置換文字列決定部１５０は、置換文字列を前方に１文字拡大する。すなわち、置換文字列決定部１５０は、置換文字列の候補とする文字列範囲を前方に１文字分だけ広げる。より具体的には、置換文字列決定部１５０は、現在の置換文字列に当該前方の１文字を結合して、当該置換文字列を更新する。なお、拡大の結果、現在拡大している第１の置換文字列が第２の置換文字列と隣接した場合、置換文字列決定部１５０は、第１および第２の置換文字列を結合して１つの置換文字列とする。
【０１２２】
（Ｓ４４）置換文字列決定部１５０は、現在の置換文字列をパラメータ化して共通コードを作成するときのパラメータ数を計算する。置換文字列決定部１５０は、今回計算したパラメータ数を記憶部１１０に格納する。
【０１２３】
（Ｓ４５）置換文字列決定部１５０は、今回計算したパラメータ数が、記憶部１１０に記憶された前回計算したパラメータ数よりも増加したか否かを判定する。増加した場合、処理をステップＳ４６に進める。増加していない場合、処理をステップＳ４２に進める。なお、ステップＳ４５を最初に実行する場合、前回のパラメータ数の計算結果が存在していないので、置換文字列決定部１５０は、パラメータ数が増加していないと判定して、処理をステップＳ４２に進める。
【０１２４】
（Ｓ４６）置換文字列決定部１５０は、ステップＳ４３で拡大した置換文字列を元に戻す。すなわち、置換文字列決定部１５０は、現在の置換文字列の先頭の１文字を除去して、ステップＳ４３で拡大する前の置換文字列に戻す。
【０１２５】
（Ｓ４７）置換文字列決定部１５０は、置換文字列が単語の末尾を含むか否かを判定する。置換文字列が単語の末尾を含む場合、処理をステップＳ５２に進める。置換文字列が単語の末尾を含まない場合、処理をステップＳ４８に進める。ステップＳ４７  Ｙｅｓの場合、パラメータ化対象は、現在の置換文字列で確定される。
【０１２６】
（Ｓ４８）置換文字列決定部１５０は、置換文字列を後方に１文字拡大する。すなわち、置換文字列決定部１５０は、置換文字列の候補とする文字列範囲を後方に１文字分だけ広げる。より具体的には、置換文字列決定部１５０は、現在の置換文字列に当該後方の１文字を結合して、当該置換文字列を更新する。なお、拡大の結果、現在拡大している第１の置換文字列が第２の置換文字列と隣接した場合、置換文字列決定部１５０は、第１および第２の置換文字列を結合して１つの置換文字列とする。
【０１２７】
（Ｓ４９）置換文字列決定部１５０は、現在の置換文字列をパラメータ化して共通コードを作成するときのパラメータ数を計算する。置換文字列決定部１５０は、今回計算したパラメータ数を記憶部１１０に格納する。
【０１２８】
（Ｓ５０）置換文字列決定部１５０は、今回計算したパラメータ数が、記憶部１１０に記憶された前回計算したパラメータ数よりも増加したか否かを判定する。増加した場合、処理をステップＳ５１に進める。増加していない場合、処理をステップＳ４７に進める。なお、ステップＳ４５を実行せずにステップＳ５０を最初に実行する場合、前回のパラメータ数の計算結果が存在していないので、置換文字列決定部１５０は、パラメータ数が増加していないと判定して、処理をステップＳ４７に進める。
【０１２９】
（Ｓ５１）置換文字列決定部１５０は、ステップＳ４８で拡大した置換文字列を元に戻す。すなわち、置換文字列決定部１５０は、現在の置換文字列の末尾の１文字を除去して、ステップＳ４８で拡大する前の置換文字列に戻す。パラメータ化対象は、現在の置換文字列で確定される。
【０１３０】
（Ｓ５２）置換文字列決定部１５０は、パラメータ化対象として確定した置換文字列とパラメータ数とを出力する。具体的には、置換文字列決定部１５０は、コードクローン情報１１２の識別情報と各コードクローンにおける置換文字列とパラメータ数とを対応付けたパラメータ化情報１１６（パラメータ化情報１１６のレコードと称してもよい）を生成する。置換文字列決定部１５０は、生成したパラメータ化情報１１６を記憶部１１０に格納する。置換文字列決定部１５０は、パラメータ化情報１１６の内容をディスプレイ１１を用いて表示してもよいし、パラメータ化情報１１６をネットワーク１０を介して他のコンピュータに送信してもよい。
【０１３１】
上記の手順によれば、置換文字列決定部１５０は、置換文字列の複数の候補のうち複数の候補それぞれに応じた共通コードに含まれるパラメータの数が少ない候補を優先的に選択することで、置換文字列を決定しているということができる。
【０１３２】
特に、置換文字列決定部１５０は、当該決定において、相違位置を起点に１文字ずつ置換文字列の候補に対応する文字列範囲を拡大する。そして、置換文字列決定部１５０は、１文字拡大するたびに共通コードにおけるパラメータの数を計算し、今回のパラメータの数が前回のパラメータの数よりも増えると、前回の文字列範囲を、パラメータ化対象とする置換文字列と決定する。
【０１３３】
次に、コードクローン情報ＣＬ１，ＣＬ２に対するパラメータ化情報の生成例を具体的に説明する。まず、コードクローン情報ＣＬ１に対する例を説明する。
図１９は、相違文字抽出の第１の具体例を示す図である。相違単語抽出部１３０は、コードクローン情報ＣＬ１を参照して、コードＣ１１，Ｃ１２それぞれから相違単語を抽出し、相違単語情報（相違単語情報１１３ａとする）を生成する。具体的には、コードＣ１１の相違単語“Ｓ１１Ａフラグ”とコードＣ１２の相違単語“Ｓ１２Ａフラグ”とが相違単語の単語ペアａ１である。また、コードＣ１１の相違単語“Ｓ１１Ａ名前”とコードＣ１２の相違単語“Ｓ１２Ａ名前”とが相違単語の単語ペアａ２である。
【０１３４】
そして、相違文字抽出部１４０は、相違単語情報１１３ａを参照して、各単語ペアに対する相違位置を検出し、相違文字情報（相違文字情報１１４ａとする）を生成する。具体的には、単語ペアａ１について、“Ｓ１１Ａフラグ”と“Ｓ１２Ａフラグ”とでは先頭から３番目の文字がそれぞれ相違するので、相違文字抽出部１４０は、相違位置“３−３”を検出する。また、単語ペアａ２について、“Ｓ１１Ａフラグ”と“Ｓ１２Ａフラグ”とでは先頭から３番目の文字がそれぞれ相違するので、相違文字抽出部１４０は、相違位置“３−３”を検出する。
【０１３５】
図２０は、置換文字列拡大の第１の具体例を示す図である。置換文字列決定部１５０は、相違文字情報１１４ａに基づいて、パラメータ化の対象とする置換文字列を決定する。まず、置換文字列決定部１５０は、単語ペアａ１，ａ２それぞれにおいて、相違文字情報１１４ａで示される相違位置の相違文字を置換文字列とする（ステップＳＴ１１）。
【０１３６】
具体的には、置換文字列決定部１５０は、単語ペアａ１について、“Ｓ１１Ａフラグ”の先頭から３番目の文字“１”を置換文字列とし、“Ｓ１２Ａフラグ”の先頭から３番目の文字“２”を置換文字列とする。また、置換文字列決定部１５０は、単語ペアａ２について、“Ｓ１１Ａ名前”の先頭から３番目の文字“１”を置換文字列とし、“Ｓ１２Ａ名前”の先頭から３番目の文字“２”を置換文字列とする。この場合、相違単語“Ｓ１１Ａフラグ”および“Ｓ１１Ａ名前”それぞれの置換文字列は“１”である。また、相違単語“Ｓ１２Ａフラグ”および“Ｓ１２Ａ名前”それぞれの置換文字列は“２”である。各置換文字列をパラメータ化した場合のパラメータ数は“１”である。置換文字列“１”および“２”に対して１つパラメータを用意すればよいからである。
【０１３７】
次に、置換文字列決定部１５０は、前方に１文字分、置換文字列の範囲を広げる。すなわち、置換文字列決定部１５０は、現在の置換文字列の先頭に、相違単語の先頭から２番目の文字を結合して置換文字列を更新する（ステップＳＴ１２）。
【０１３８】
ここでは、各相違単語の先頭から２番目の文字は“１”である。したがって、相違単語“Ｓ１１Ａフラグ”および“Ｓ１１Ａ名前”それぞれの置換文字列は“１１”である。また、相違単語“Ｓ１２Ａフラグ”および“Ｓ１２Ａ名前”それぞれの置換文字列は“１２”である。各置換文字列をパラメータ化した場合のパラメータ数は“１”である。置換文字列“１１”および“１２”に対して１つパラメータを用意すればよいからである。
【０１３９】
図２１は、置換文字列拡大の第１の具体例（続き）を示す図である。次に、置換文字列決定部１５０は、前方に１文字分、置換文字列の範囲を広げる。すなわち、置換文字列決定部１５０は、現在の置換文字列の先頭に、相違単語の先頭から１番目の文字を結合して置換文字列を更新する（ステップＳＴ１３）。
【０１４０】
ここでは、各相違単語の先頭から１番目の文字は“Ｓ”である。したがって、相違単語“Ｓ１１Ａフラグ”および“Ｓ１１Ａ名前”それぞれの置換文字列は“Ｓ１１”である。また、相違単語“Ｓ１２Ａフラグ”および“Ｓ１２Ａ名前”それぞれの置換文字列は“Ｓ１２”である。各置換文字列をパラメータ化した場合のパラメータ数は“１”である。置換文字列“Ｓ１１”および“Ｓ１２”に対して１つパラメータを用意すればよいからである。
【０１４１】
この段階で、各置換文字列は、各相違単語の先頭の文字まで拡大済である（先頭の文字を含んでいる）。このため、以後、置換文字列決定部１５０は、置換文字列の起点とした相違位置から後方に置換文字列を拡大する。
【０１４２】
次に、置換文字列決定部１５０は、後方に１文字分、置換文字列の範囲を広げる。すなわち、置換文字列決定部１５０は、現在の置換文字列の末尾に、相違単語の先頭から４番目の文字を結合して置換文字列を更新する（ステップＳＴ１４）。
【０１４３】
ここでは、各相違単語の先頭から４番目の文字は“Ａ”である。したがって、相違単語“Ｓ１１Ａフラグ”および“Ｓ１１Ａ名前”それぞれの置換文字列は“Ｓ１１Ａ”である。また、相違単語“Ｓ１２Ａフラグ”および“Ｓ１２Ａ名前”それぞれの置換文字列は“Ｓ１２Ａ”である。各置換文字列をパラメータ化した場合のパラメータ数は“１”である。置換文字列“Ｓ１１Ａ”および“Ｓ１２Ａ”に対して１つパラメータを用意すればよいからである。
【０１４４】
次に、置換文字列決定部１５０は、後方に１文字分、置換文字列の範囲を広げる。すなわち、置換文字列決定部１５０は、現在の置換文字列の末尾に、相違単語の先頭から５番目の文字を結合して置換文字列を更新する（ステップＳＴ１５）。
【０１４５】
ここでは、相違単語“Ｓ１１Ａフラグ”および“Ｓ１２Ａフラグ”の先頭から５番目の文字は“フ”である。また、相違単語“Ｓ１１Ａ名前”および“Ｓ１２Ａ名前”の先頭から５番目の文字は“名”である。したがって、相違単語“Ｓ１１Ａフラグ”の置換文字列は“Ｓ１１Ａフ”である。相違単語“Ｓ１２Ａフラグ”の置換文字列は“Ｓ１２Ａフ”である。相違単語“Ｓ１１Ａ名前”の置換文字列は“Ｓ１１Ａ名”である。相違単語“Ｓ１２Ａ名前”の置換文字列は“Ｓ１２Ａ名”である。各置換文字列をパラメータ化した場合、“Ｓ１１Ａフ”および“Ｓ１２Ａフ”で１つ目のパラメータ、“Ｓ１１Ａ名”および“Ｓ１２Ａ名”で２つ目のパラメータを用意することになるので、パラメータ数は“２”である。パラメータ数“２”は、ステップＳＴ１４におけるパラメータ数“１”よりも多い。
【０１４６】
このため、置換文字列決定部１５０は、ステップＳＴ１５で特定した置換文字列について１文字分の拡大を元に戻す。すなわち、置換文字列決定部１５０は、ステップＳＴ１４で特定した置換文字列“Ｓ１１Ａ”および“Ｓ１２Ａ”をパラメータ化対象の置換文字列として確定する。置換文字列決定部１５０は、当該置換文字列に関するパラメータ化情報１１６（パラメータ化情報１１６のレコードと称してもよい）を生成し、記憶部１１０に格納する。
【０１４７】
続いて、コードクローン情報ＣＬ２に対するパラメータ化情報の生成例を具体的に説明する。
図２２は、相違文字抽出の第２の具体例を示す図である。相違単語抽出部１３０は、コードクローン情報ＣＬ２を参照して、コードＣ２１，Ｃ２２それぞれから相違単語を抽出し、相違単語情報（相違単語情報１１３ｂとする）を生成する。具体的には、コードＣ２１の相違単語“カウントフラグ”とコードＣ２２の相違単語“ラウンドフラグ”とが相違単語の単語ペアｂ１である。また、コードＣ２１の相違単語“カウント出力”とコードＣ２２の相違単語“ラウンド出力”とが相違単語の単語ペアｂ２である。
【０１４８】
そして、相違文字抽出部１４０は、相違単語情報１１３ｂを参照して、各単語ペアに対する相違位置を検出し、相違文字情報（相違文字情報１１４ｂとする）を生成する。具体的には、単語ペアｂ１について、“カウントフラグ”と“ラウンドフラグ”とでは、先頭から１番目の文字がそれぞれ相違する。このため、相違文字抽出部１４０は、相違位置“１−１”を検出する。また、“カウントフラグ”と“ラウンドフラグ”とでは、先頭から４番目の文字がそれぞれ相違する。このため、相違文字抽出部１４０は、相違位置“４−４”を検出する。
【０１４９】
また、単語ペアｂ２について、“カウント出力”と“ラウンド出力”とでは、先頭から１番目の文字がそれぞれ相違する。このため、相違文字抽出部１４０は、相違位置“１−１”を検出する。また、“カウント出力”と“ラウンド出力”とでは、先頭から４番目の文字がそれぞれ相違する。このため、相違文字抽出部１４０は、相違位置“４−４”を検出する。
【０１５０】
図２３は、置換文字列拡大の第２の具体例を示す図である。置換文字列決定部１５０は、相違文字情報１１４ｂに基づいて、パラメータ化の対象とする置換文字列を決定する。具体的には、まず、置換文字列決定部１５０は、単語ペアｂ１，ｂ２それぞれにおいて、相違文字情報１１４ｂで示される相違位置の相違文字を置換文字列とする（ステップＳＴ２１）。
【０１５１】
具体的には、置換文字列決定部１５０は、単語ペアｂ１について、“カウントフラグ”の先頭から１番目の文字“カ”、および、先頭から４番目の文字“ト”をそれぞれ置換文字列とする。また、置換文字列決定部１５０は、“ラウンドフラグ”の先頭から１番目の文字“ラ”、および、先頭から４番目の文字“ド”をそれぞれ置換文字列とする。この場合、各置換文字列をパラメータ化しようとすると、置換文字列“カ”および“ラ”に対して１つ目のパラメータ、置換文字列“ト”および“ド”に対して２つ目のパラメータを用意することになるので、パラメータ数は“２”である。
【０１５２】
置換文字列決定部１５０は、拡大を行う置換文字列を決定する。ここでは、各相違文字のうち、先頭側にある文字を優先的に拡大対象として選択する（ただし、末尾側にある文字を優先的に拡大対象として選択してもよい）。この場合、置換文字列決定部１５０は、相違文字“カ”および“ラ”に対応する置換文字列の拡大を行うと決定する。ここで、相違文字“カ”および“ラ”は、何れも相違単語の先頭の文字である。これ以上前方へは拡大できないので、置換文字列決定部１５０は、置換文字列を後方へ拡大する。
【０１５３】
置換文字列決定部１５０は、後方に１文字分、置換文字列の範囲を広げる。すなわち、置換文字列決定部１５０は、現在の置換文字列の末尾に、相違単語の先頭から２番目の文字を結合して置換文字列を更新する（ステップＳＴ２２）。
【０１５４】
ここでは、各相違文字の先頭から２番目の文字は“ウ”である。したがって、相違単語“カウントフラグ”および“カウント出力”それぞれの置換文字列は、“カウ”および“ト”である。また、相違単語“ラウンドフラグ”および“ラウンド出力”それぞれの置換文字列は、“ラウ”および“ド”である。各置換文字列をパラメータ化した場合のパラメータ数は“２”である。置換文字列“カウ”および“ラウ”に対して１つ目のパラメータ、置換文字列“ト”および“ド”に対して２つ目のパラメータを用意することになる（合計２つのパラメータを用意する）からである。
【０１５５】
図２４は、置換文字列拡大の第２の具体例（続き）を示す図である。次に、置換文字列決定部１５０は、後方に１文字分、置換文字列の範囲を広げる。すなわち、置換文字列決定部１５０は、現在の置換文字列の末尾に、相違単語の先頭から３番目の文字を結合して置換文字列を更新する（ステップＳＴ２３）。
【０１５６】
ここでは、各相違単語の先頭から３番目の文字は“ン”である。したがって、相違単語“カウントフラグ”および“カウント出力”それぞれの置換文字列は“カウント”である。ここで、置換文字列決定部１５０は、今回の拡大によって作成した置換文字列“カウン”と、“カウン”の直後に後続する置換文字列“ト”とを結合して、１つの置換文字列“カウント”とする。また、相違単語“ラウンドフラグ”および“ラウンド出力”それぞれの置換文字列は“ラウンド”である。ここで、置換文字列決定部１５０は、今回の拡大によって作成した置換文字列“ラウン”と、“ラウン”の直後に後続する置換文字列“ド”とを結合して、１つの置換文字列“ラウンド”とする。各置換文字列をパラメータ化した場合のパラメータ数は“１”である。置換文字列“カウント”および“ラウンド”に対して１つパラメータを用意すればよいからである。
【０１５７】
次に、置換文字列決定部１５０は、後方に１文字分、置換文字列の範囲を広げる。すなわち、置換文字列決定部１５０は、現在の置換文字列の末尾に、相違単語の先頭から５番目の文字を結合して置換文字列を更新する（ステップＳＴ２４）。なお、ステップＳＴ２３で説明したように、先頭から４番目の文字（“ト”または“ド”）は、置換文字列の末尾に既に結合済である。
【０１５８】
ここでは、相違単語“カウントフラグ”および“ラウンドフラグ”の先頭から５番目の文字は“フ”である。また、相違単語“カウント出力”および“ラウンド出力”の先頭から５番目の文字は“出”である。したがって、相違単語“カウントフラグ”の置換文字列は“カウントフ”である。相違単語“ラウンドフラグ”の置換文字列は“ラウンドフ”である。相違単語“カウント出力”の置換文字列は“カウント出”である。相違単語“ラウンド出力”の置換文字列は“ラウンド出”である。各置換文字列をパラメータ化した場合、“カウントフ”および“ラウンドフ”で１つ目のパラメータ、“カウント出”および“ラウンド出”で２つ目のパラメータを用意することになるので、パラメータ数は“２”である。パラメータ数“２”は、ステップＳＴ２３におけるパラメータ数“１”よりも多い。
【０１５９】
このため、置換文字列決定部１５０は、ステップＳＴ２４で特定した置換文字列について１文字分の拡大を元に戻す。すなわち、置換文字列決定部１５０は、ステップＳＴ２３で特定した置換文字列“カウント”および“ラウンド”をパラメータ化対象の置換文字列として確定する。置換文字列決定部１５０は、当該置換文字列に関するパラメータ化情報１１６（パラメータ化情報１１６のレコードと称してもよい）を生成し、記憶部１１０に格納する。
【０１６０】
置換文字列決定部１５０は、パラメータ化情報１１６を参照して、コードクローン情報に含まれる各コード、および、各コードそれぞれの置換文字列に基づいて、各コードの置換文字列をパラメータに置換した共通コードを出力することもできる。
【０１６１】
図２５は、コードクローン共通化の例（その１）を示す図である。例えば、置換文字列決定部１５０は、パラメータ化情報１１６に基づいて、コードＣ１１，Ｃ１２を共通化した共通コードＣ１ａを生成してもよい。ここで、パラメータ化情報１１６ａは、パラメータ化情報１１６のコードクローン情報ＣＬ１に対応する情報の一部を示している。
【０１６２】
パラメータ化情報１１６ａによれば、コードＣ１１の置換文字列は“Ｓ１１Ａ”である。また、コードＣ１２の置換文字列は“Ｓ１２Ａ”である。したがって、置換文字列決定部１５０は、コードＣ１１に含まれる置換文字列“Ｓ１１Ａ”、および、コードＣ１２に含まれる置換文字列“Ｓ１２Ａ”それぞれをプレースホルダ（例えば、“？？？？”）に置換した共通コードＣ１ａを生成する。共通コードＣ１ａのファイル名を“ＣＯＭＭＯＮ１１．ＣＢＬ”とする。
【０１６３】
すると、置換文字列決定部１５０は、ソースコードＰ１，Ｐ２のコードクローンに相当する部分を、共通コードＣ１ａを呼び出す記述に書き換えることができる。例えば、ソースコードＰ１の該当のコードクローン部分を、共通コードＣ１ａの呼び出し（コピー）、および、パラメータに相当するプレースホルダへの文字列“Ｓ１１Ａ”の設定、を行う記述に置換できる。より具体的には、ソースコードＰ１におけるコードＣ１１の部分を、“ＣＯＰＹ  ＣＯＭＭＯＮ１１  ＲＥＰＬＡＣＩＮＧ  ＝＝？？？？＝＝  ＢＹ  ＝＝Ｓ１１Ａ＝＝”という記述に置換できる。ソースコードＰｓ１は、ソースコードＰ１に対する当該置換後の記述を示す。
【０１６４】
同様に、置換文字列決定部１５０は、ソースコードＰ２の該当のコードクローン部分を、共通コードＣ１ａの呼び出し（コピー）、および、パラメータに相当するプレースホルダへの文字列“Ｓ１２Ａ”の設定、を行う記述に置換できる。より具体的には、ソースコードＰ２におけるコードＣ１２の部分を、“ＣＯＰＹ  ＣＯＭＭＯＮ１１  ＲＥＰＬＡＣＩＮＧ  ＝＝？？？？＝＝  ＢＹ  ＝＝Ｓ１２Ａ＝＝”という記述に置換できる。ソースコードＰｓ２は、ソースコードＰ２に対する当該置換後の記述を示す。
【０１６５】
このようにすると、例えば、「Ｓ２１Ｂフラグ」など、“フラグ”の文字列の前方にフラグを修飾するような語が付加された変数名が追加されても、共通コードＣ１ａをそのまま再利用できる。すなわち、共通コードＣ１ａは、相違箇所のみをパラメータ化して作成した共通コードＣｎ１（図４で例示）に比べて、再利用可能性が高い。
【０１６６】
図２６は、コードクローン共通化の例（その２）を示す図である。例えば、置換文字列決定部１５０は、パラメータ化情報１１６に基づいて、コードＣ２１，Ｃ２２を共通化した共通コードＣ２ａを生成してもよい。ここで、パラメータ化情報１１６ｂは、パラメータ化情報１１６のコードクローン情報ＣＬ２に対応する情報の一部を示している。
【０１６７】
パラメータ化情報１１６ｂによれば、コードＣ２１の置換文字列は“カウント”である。また、コードＣ２２の置換文字列は“ラウンド”である。したがって、置換文字列決定部１５０は、コードＣ２１に含まれる置換文字列“カウント”、および、コードＣ２２に含まれる置換文字列“ラウンド”それぞれをプレースホルダ（例えば、“ＸＸＸＸ”）に置換した共通コードＣ２ａを生成する。共通コードＣ２ａのファイル名を“ＣＯＭＭＯＮ１２．ＣＢＬ”とする。
【０１６８】
すると、置換文字列決定部１５０は、ソースコードＰ３，Ｐ４のコードクローンに相当する部分を、共通コードＣ２ａを呼び出す記述に書き換えることができる。例えば、ソースコードＰ３の該当のコードクローン部分を、共通コードＣ２ａの呼び出し、および、パラメータに相当するプレースホルダへの文字列“カウント”の設定、を行う記述に置換できる。より具体的には、ソースコードＰ３におけるコードＣ２１の部分を、“ＣＯＰＹ  ＣＯＭＭＯＮ１２  ＲＥＰＬＡＣＩＮＧ  ＝＝ＸＸＸＸ＝＝  ＢＹ  ＝＝カウント＝＝”という記述に置換できる。ソースコードＰｓ３は、ソースコードＰ３に対する当該置換後の記述を示す。
【０１６９】
同様に、置換文字列決定部１５０は、ソースコードＰ４の該当のコードクローン部分を、共通コードＣ２ａの呼び出し、および、パラメータに相当するプレースホルダへの文字列“ラウンド”の設定、を行う記述に置換できる。より具体的には、ソースコードＰ４におけるコードＣ２２の部分を、“ＣＯＰＹ  ＣＯＭＭＯＮ１２  ＲＥＰＬＡＣＩＮＧ  ＝＝ＸＸＸＸ＝＝  ＢＹ  ＝＝ラウンド＝＝”という記述に置換できる。ソースコードＰｓ４は、ソースコードＰ４に対する当該置換後の記述を示す。
【０１７０】
このように意味のある文字列の単位をパラメータ化することで、ソフトウェア開発を行うユーザにとって、置換される文字の意味が分かりやすい共通コードを提供できる。すなわち、共通コードＣ２ａは、相違箇所のみをパラメータ化して作成した共通コードＣｎ２（図５で例示）に比べて可読性が高い。
【０１７１】
以上のように、サーバ１００によれば、共通コードの可読性、および、再利用可能性を高め、ユーザによるプログラムの作成や保守に伴う作業を省力化できる。こうして、サーバ１００は、ソフトウェア開発の効率を改善することができる。
【０１７２】
ところで、置換文字列決定部１５０は、置換文字列の決定に補助情報１１５を用いてもよい。例えば、補助情報１１５は、ユーザにより記憶部１１０に予め格納される。
図２７は、補助情報の例を示す図である。補助情報１１５は、置換文字列を決定するための補助的な条件を示す情報である。具体的には、補助情報１１５は、置換文字列を決定するための補助的な検出条件として、区切り文字や文字種類の境界という情報を含む。区切り文字とは、例えば、ハイフン記号“−”、スラッシュ記号“／”およびピリオド記号“．”などである。また、文字種類の境界とは、アルファベットの大文字／小文字の変化点、アルファベット／数字の変化点、平仮名／アルファベットの変化点、平仮名／カタカナの変化点、カタカナ／漢字の変化点など、文字の種類が変更される境界である。
【０１７３】
例えば、置換文字列決定部１５０は、図１８のステップＳ４５  Ｎｏの場合、および、同ステップＳ５０  Ｎｏの場合に、補助情報１１５に基づく条件判断を行う。具体的には、ステップＳ４５  Ｎｏ、かつ、今回の置換文字列の拡大により、補助情報１１５で指定された区切り文字に達した場合、置換文字列決定部１５０は、処理をステップＳ４６に進める。一方、ステップＳ４５  Ｎｏ、かつ、今回の置換文字列の拡大により、補助情報１１５で指定された区切り文字に達していない場合、置換文字列決定部１５０は、処理をステップＳ４２に進める。
【０１７４】
また、例えば、ステップＳ５０  Ｎｏ、かつ、今回の置換文字列の拡大により、補助情報１１５で指定された区切り文字に達した場合、置換文字列決定部１５０は、処理をステップＳ５１に進める。一方、ステップＳ５０  Ｎｏ、かつ、今回の置換文字列の拡大により、補助情報１１５で指定された区切り文字に達していない場合、置換文字列決定部１５０は、処理をステップＳ４７に進める。ここで、上記の「区切り文字に達しているか否か」の判定は、今回の置換文字列の拡大により「文字種類の境界を検出したか否か」と読み替えてもよい。
【０１７５】
次に、置換文字列決定部１５０による、補助情報１１５に基づくパラメータ化情報の生成の具体例を説明する。
図２８は、相違文字抽出の第３の具体例を示す図である。ここでは、コードクローン情報ＣＬ３を例示して、パラメータ化情報を生成する処理を説明する。コードクローン情報ＣＬ３は、コードＣ３１，Ｃ３２を含む。コードＣ３１は、変数名を示す単語“Ｓ１１Ａ−フラグ”（１行目）、および、変数名を示す単語“Ｓ１１Ａ−名前”（２行目）を含む。コードＣ３２は、変数名を示す単語“Ｓ１２Ａ−フラグ”（１行目）、および、変数名を示す単語“Ｓ１２Ａ−名前”（２行目）を含む。
【０１７６】
相違単語抽出部１３０は、コードクローン情報ＣＬ３を参照して、コードＣ３１，Ｃ３２それぞれから相違単語を抽出し、相違単語情報（相違単語情報１１３ｃとする）を生成する。具体的には、コードＣ３１の相違単語“Ｓ１１Ａ−フラグ”とコードＣ３２の相違単語“Ｓ１２Ａ−フラグ”とが相違単語の単語ペアｃ１である。また、コードＣ３１の相違単語“Ｓ１１Ａ−名前”とコードＣ３２の相違単語“Ｓ１２Ａ−名前”とが相違単語の単語ペアｃ２である。
【０１７７】
そして、相違文字抽出部１４０は、相違単語情報１１３ｃを参照して、各単語ペアに対する相違位置を検出し、相違文字情報（相違文字情報１１４ｃとする）を生成する。具体的には、単語ペアｃ１について、“Ｓ１１Ａ−フラグ”と“Ｓ１２Ａ−フラグ”とでは先頭から３番目の文字がそれぞれ相違するので、相違文字抽出部１４０は、相違位置“３−３”を検出する。また、単語ペアｃ２について、“Ｓ１１Ａ−名前”と“Ｓ１２Ａ−名前”とでは先頭から３番目の文字がそれぞれ相違するので、相違文字抽出部１４０は、相違位置“３−３”を検出する。
【０１７８】
図２９は、置換文字列拡大の第３の具体例を示す図である。置換文字列決定部１５０は、相違文字情報１１４ｃに基づいて、パラメータ化の対象とする置換文字列を決定する。まず、置換文字列決定部１５０は、単語ペアｃ１，ｃ２それぞれにおいて、相違文字情報１１４ｃで示される相違位置の相違文字を置換文字列とする（ステップＳＴ３１）。
【０１７９】
具体的には、置換文字列決定部１５０は、単語ペアｃ１について、“Ｓ１１Ａ−フラグ”の先頭から３番目の文字“１”を置換文字列とし、“Ｓ１２Ａ−フラグ”の先頭から３番目の文字“２”を置換文字列とする。また、置換文字列決定部１５０は、単語ペアｃ２について、“Ｓ１１Ａ−名前”の先頭から３番目の文字“１”を置換文字列とし、“Ｓ１２Ａ−名前”の先頭から３番目の文字“２”を置換文字列とする。この場合、相違単語“Ｓ１１Ａ−フラグ”および“Ｓ１１Ａ−名前”それぞれの置換文字列は“１”である。また、相違単語“Ｓ１２Ａ−フラグ”および“Ｓ１２Ａ−名前”それぞれの置換文字列は“２”である。各置換文字列をパラメータ化した場合のパラメータ数は“１”である。置換文字列“１”および“２”に対して１つパラメータを用意すればよいからである。
【０１８０】
続いて、置換文字列決定部１５０は、図２０のステップＳＴ１２〜図２１のステップＳＴ１４と同様に、置換文字列を“Ｓ１１Ａ”および“Ｓ１２Ａ”まで拡大する。置換文字列を“Ｓ１１Ａ”および“Ｓ１２Ａ”とした場合のパラメータ数は“１”である。
【０１８１】
次に、置換文字列決定部１５０は、後方に１文字分、置換文字列の範囲を広げる。すなわち、置換文字列決定部１５０は、現在の置換文字列の末尾に、相違単語の先頭から５文字目の文字を結合して置換文字列を更新する。ここで、各相違単語の先頭から５文字目の文字はハイフン“−”である。このため、置換文字列決定部１５０は、補助情報１１５で指定されるハイフンが置換文字列に結合されたことを検出する。なお、更新後の置換文字列でパラメータ化した場合のパラメータ数は“１”であり、更新前と変わらない。
【０１８２】
すると、置換文字列決定部１５０は、置換文字列に対する今回の拡大分を元に戻し、“Ｓ１１Ａ”および“Ｓ１２Ａ”をパラメータ化対象の置換文字列として確定する（ステップＳＴ３２）。置換文字列決定部１５０は、当該置換文字列に関するパラメータ化情報１１６を生成し、記憶部１１０に格納する。
【０１８３】
更に、以下では文字の種類の境界を検出して置換文字列を決定する具体例を説明する。
図３０は、相違文字抽出の第４の具体例を示す図である。ここでは、コードクローン情報ＣＬ４を例示して、パラメータ化情報を生成する処理を説明する。コードクローン情報ＣＬ４は、コードＣ４１，Ｃ４２を含む。コードＣ４１は、変数名を示す単語“ＰＧＸＸ入力フラグ”（１行目）、および、変数名を示す単語“ＰＧＸＸ入力番号”（２行目）を含む。コードＣ４２は、変数名を示す単語“ＰＧＹＸ入力フラグ”（１行目）、および、変数名を示す単語“ＰＧＹＸ入力番号”（２行目）を含む。
【０１８４】
相違単語抽出部１３０は、コードクローン情報ＣＬ４を参照して、コードＣ４１，Ｃ４２それぞれから相違単語を抽出し、相違単語情報（相違単語情報１１３ｄとする）を生成する。具体的には、コードＣ４１の相違単語“ＰＧＸＸ入力フラグ”とコードＣ４２の相違単語“ＰＧＹＸ入力フラグ”とが相違単語の単語ペアｄ１である。また、コードＣ４１の相違単語“ＰＧＸＸ入力番号”とコードＣ４２の相違単語“ＰＧＹＸ入力番号”とが相違単語の単語ペアｄ２である。
【０１８５】
そして、相違文字抽出部１４０は、相違単語情報１１３ｄを参照して、各単語ペアに対する相違位置を検出し、相違文字情報（相違文字情報１１４ｄとする）を生成する。具体的には、単語ペアｄ１について、“ＰＧＸＸ入力フラグ”と“ＰＧＹＸ入力フラグ”とでは先頭から３番目の文字がそれぞれ相違するので、相違文字抽出部１４０は、相違位置“３−３”を検出する。また、単語ペアｄ２について、“ＰＧＸＸ入力番号”と“ＰＧＹＸ入力番号”とでは先頭から３番目の文字がそれぞれ相違するので、相違文字抽出部１４０は、相違位置“３−３”を検出する。
【０１８６】
図３１は、置換文字列拡大の第４の具体例を示す図である。置換文字列決定部１５０は、相違文字情報１１４ｄに基づいて、パラメータ化の対象とする置換文字列を決定する。まず、置換文字列決定部１５０は、単語ペアｄ１，ｄ２それぞれにおいて、相違文字情報１１４ｄで示される相違位置の相違文字を置換文字列とする（ステップＳＴ４１）。
【０１８７】
具体的には、置換文字列決定部１５０は、単語ペアｄ１について、“ＰＧＸＸ入力フラグ”の先頭から３番目の文字“Ｘ”を置換文字列とし、“ＰＧＹＸ入力フラグ”の先頭から３番目の文字“Ｙ”を置換文字列とする。また、置換文字列決定部１５０は、単語ペアｄ２について、“ＰＧＸＸ入力番号”の先頭から３番目の文字“Ｘ”を置換文字列とし、“ＰＧＹＸ入力番号”の先頭から３番目の文字“Ｙ”を置換文字列とする。この場合、相違単語“ＰＧＸＸ入力フラグ”および“ＰＧＸＸ入力番号”それぞれの置換文字列は“Ｘ”である。また、相違単語“ＰＧＹＸ入力番号”および“ＰＧＹＸ入力番号”それぞれの置換文字列は“Ｙ”である。各置換文字列をパラメータ化した場合のパラメータ数は“１”である。置換文字列“Ｘ”および“Ｙ”に対して１つパラメータを用意すればよいからである。
【０１８８】
続いて、置換文字列決定部１５０は、相違位置を起点に前後に置換文字列を拡大することで、置換文字列を“ＰＧＸＸ”および“ＰＧＹＸ”まで拡大する（ステップＳＴ４２）。置換文字列を“ＰＧＸＸ”および“ＰＧＹＸ”とした場合のパラメータ数は“１”である。
【０１８９】
次に、置換文字列決定部１５０は、後方に１文字分、置換文字列の範囲を広げる。すなわち、置換文字列決定部１５０は、現在の置換文字列の末尾に、相違単語の先頭から５文字目の文字を結合して置換文字列を更新する。ここで、各相違単語の先頭から５文字目の文字は“入”である。置換文字列決定部１５０は、補助情報１１５で指定される文字の種類の境界（ここでは、アルファベットから漢字への変更）を検出する。なお、更新後の置換文字列でパラメータ化した場合のパラメータ数は“１”で、更新前と変わらない。
【０１９０】
すると、置換文字列決定部１５０は、置換文字列に対する今回の拡大分を元に戻し、“ＰＧＸＸ”および“ＰＧＹＸ”をパラメータ化対象の置換文字列として確定する（ステップＳＴ４３）。置換文字列決定部１５０は、当該置換文字列に関するパラメータ化情報１１６を生成し、記憶部１１０に格納する。
【０１９１】
図３２は、パラメータ化情報の例（その２）を示す図である。パラメータ化情報１１６ａは、図２９，図３１で例示した手順により生成されたパラメータ化情報を示している。
例えば、置換文字列決定部１５０は、コードクローン情報ＣＬ３に対して、パラメータ数“１”、第１コード（コードＣ３１）の置換文字列“Ｓ１１Ａ”および第２コード（コードＣ３２）の置換文字列“Ｓ１２Ａ”を登録する。
【０１９２】
また、置換文字列決定部１５０は、コードクローン情報ＣＬ４に対して、パラメータ数“１”、第１コード（コードＣ４１）の置換文字列“ＰＧＸＸ”および第２コード（コードＣ４２）の置換文字列“ＰＧＹＸ”を登録する。
【０１９３】
このように、置換文字列決定部１５０は、パラメータ数の条件に加え、複数の相違単語それぞれに含まれる所定の文字または隣接する文字の種類の変化に応じて置換文字列を決定する。より具体的には、置換文字列決定部１５０は、補助情報１１５を用いることで、パラメータ数が増加しない範囲で、区切り文字や文字の種類の境界まで置換文字列に相当する文字列範囲を広げることができる。
【０１９４】
ここで、区切り文字を用いた表記や文字の種類の変更は、変数名や処理名（例えば、関数名、オブジェクト名、または、サブルーチン名）などにおいて、変数名に含まれる各単語の意味的な区切りを表すために用いられることが多い。このため、意味的な区切りのある部分で置換文字列の範囲も区切ることで、ユーザにとって可読性や再利用可能性の高いパラメータ化を実現できる。
【０１９５】
また、置換文字列決定部１５０は、補助情報１１５に代えて、あるいは、補助情報１１５に加えて、辞書情報１１５ａを更に用いてもよい。
図３３は、辞書情報の例を示す図である。例えば、辞書情報１１５ａは、記憶部１１０に予め格納される。辞書情報１１５ａは、変数名や処理名などに使用され得る単語の一覧である。例えば、辞書情報１１５ａは、“フラグ”や“名前”など、ユーザが意味を理解できる複数の単語を含む。次に、前述の単語ペアａ１，ａ２を例に挙げて、辞書情報１１５ａを用いた置換文字列拡大の具体例を説明する。
【０１９６】
図３４は、置換文字列拡大の第５の具体例を示す図である。図２０のステップＳＴ１１と同様に、置換文字列決定部１５０は、相違文字情報１１４ａに基づいて、パラメータ化の対象とする置換文字列を決定する。具体的には、まず、置換文字列決定部１５０は、単語ペアａ１，ａ２それぞれにおいて、相違文字情報１１４ａで示される相違位置の相違文字を置換文字列とする（ステップＳＴ５１）。
【０１９７】
このとき、置換文字列決定部１５０は、記憶部１１０に格納された辞書情報１１５ａを参照して、単語ペアａ１，ａ２それぞれに含まれる文字列の中から、辞書情報１１５ａに含まれる単語を特定する。単語ペアａ１の例では、相違単語“Ｓ１１Ａフラグ”および“Ｓ１２Ａフラグ”は、辞書情報１１５ａに含まれる単語“フラグ”を含む。単語ペアａ２の例では、相違単語“Ｓ１１Ａ名前”および“Ｓ１２Ａ名前”は、辞書情報１１５ａに含まれる単語“名前”を含む。
【０１９８】
したがって、置換文字列決定部１５０は、単語ペアａ１の各相違単語について、“フラグ”の文字列の直前および直後（ただし、“フラグ”は各相違単語の末尾なので直後は考慮しなくてよい）までの文字を、置換文字列の拡大範囲の限界点とする。具体的には、単語ペアａ１について、文字“フ”の直前の文字“Ａ”までが置換文字列の拡大範囲の限界点となる。
【０１９９】
同様に、置換文字列決定部１５０は、単語ペアａ２の各相違単語について、“名前”の文字列の直前および直後（ただし、“名前”は各相違単語の末尾なので直後は考慮しなくてよい）までの文字を、置換文字列の拡大範囲の限界点とする。具体的には、単語ペアａ２について、文字“名”の直前の文字“Ａ”までが置換文字列の拡大範囲の限界点となる。
【０２００】
そして、置換文字列決定部１５０は、図２０のステップＳＴ１２〜図２１のステップＳＴ１４と同様に、置換文字列を“Ｓ１１Ａ”および“Ｓ１２Ａ”まで拡大する。置換文字列を“Ｓ１１Ａ”および“Ｓ１２Ａ”とした場合のパラメータ数は“１”である。
【０２０１】
ここで、置換文字列を“Ｓ１１Ａ”および“Ｓ１２Ａ”の末尾の“Ａ”は、置換文字列の拡大範囲の限界点であるため、置換文字列決定部１５０は、当該文字“Ａ”よりも後方への置換文字列の拡大を行わない。このため、置換文字列決定部１５０は、“Ｓ１１Ａ”および“Ｓ１２Ａ”をパラメータ化対象の置換文字列として確定する（ステップＳＴ５２）。置換文字列決定部１５０は、当該置換文字列に関するパラメータ化情報１１６を生成し、記憶部１１０に格納する。このように、置換文字列決定部１５０は、辞書情報１１５ａを用いて、パラメータ化情報１１６を生成してもよい。例えば、置換文字列決定部１５０は、辞書情報１１５ａに登録された所定単語を複数の相違単語に含まれる文字列の中から特定し、複数の相違単語のうち所定単語以外の部分から置換文字列を決定する。こうして、ユーザにとって意味のある単語で区切ってパラメータ化する置換文字列を決定することで、共通コードの可読性や再利用可能性を高めることができる。
【０２０２】
なお、ここまでの例では、単語ペアに含まれる各相違単語の文字数が同じ場合を主に説明したが、単語ペアに含まれる各相違単語の文字数は互いに異なっていてもよい。そこで、次に、単語ペアに含まれる各相違単語の文字数が異なる場合を例示する。
【０２０３】
図３５は、異なる文字数の相違単語を含むソースコードの例を示す図である。ソースコード群１１１は、更に、ソースコードＰ５，Ｐ６を含む。ソースコードＰ５のファイル名は“ＰＲＯＧ００５．ＣＢＬ”である。ソースコードＰ６のファイル名は“ＰＲＯＧ００６．ＣＢＬ”である。例えば、ソースコードＰ５の２行目に含まれる単語“カウンターフラグ”と、ソースコードＰ６の２行目に含まれる単語“ラウンドフラグ”とでは文字数が異なっている。
【０２０４】
図３６は、異なる文字数の相違単語を含むコードクローン情報の例を示す図である。例えば、コードクローン検出部１２０は、ユーザによりソースコードＰ５，Ｐ６のファイル名の入力を受け付けると、記憶部１１０に記憶されたソースコードＰ５，Ｐ６を比較して、コードクローン情報ＣＬ５を生成する。
【０２０５】
コードクローン情報ＣＬ５は、コードＣ５１，Ｃ５２を含む。コードＣ５１は、ソースコードＰ５の一部分である。コードＣ５１は、コードＣ５２に類似するコードであり、ソースコードＰ５，Ｐ６の比較に応じて検出されたコードクローンである。コードＣ５２は、ソースコードＰ６の一部分である。コードＣ５２は、コードＣ５１に類似するコードであり、ソースコードＰ５，Ｐ６の比較に応じて検出されたコードクローンである。
【０２０６】
図３７は、異なる文字数の相違単語を含む相違単語情報の例を示す図である。相違単語情報１１３ｅは、コードクローン情報ＣＬ５に対して、相違単語抽出部１３０により生成される相違単語情報を例示している。
【０２０７】
相違単語抽出部１３０は、コードクローン情報ＣＬ５を参照して、コードＣ５１，Ｃ５２それぞれから相違単語を抽出し、相違単語情報１１３ｅを生成する。具体的には、コードＣ５１の相違単語“カウンターフラグ”とコードＣ５２の相違単語“ラウンドフラグ”とが相違単語の単語ペアｅ１である。また、コードＣ５１の相違単語“カウンター出力”とコードＣ５２の相違単語“ラウンド出力”とが相違単語の単語ペアｅ２である。
【０２０８】
図３８は、異なる文字数の相違単語を含む相違文字情報の例を示す図である。相違文字情報１１４ｅは、相違単語情報１１３ｅに対して、相違文字抽出部１４０により生成された相違文字情報を例示している。
【０２０９】
相違文字抽出部１４０は、相違単語情報１１３ｅを参照して、各単語ペアに対する相違位置を検出し、相違文字情報１１４ｅを生成する。具体的には、単語ペアｅ１について、“カウンターフラグ”と“ラウンドフラグ”とでは、先頭から１番目の文字がそれぞれ相違する。このため、相違文字抽出部１４０は、相違位置“１−１”を検出する。また、“カウンターフラグ”と“ラウンドフラグ”とでは、“カウンターフラグ”の先頭から４番目の文字および４番目に後続する５番目の文字（“ター”）と、“ラウンドフラグ”の先頭から４番目の文字（“ド”）とが相違する。このため、相違文字抽出部１４０は、相違位置“（４，５）−４”を検出する。ここで、相違位置の表記において、かっこ記号“（）”で括られた複数の数値は、１つの相違単語に含まれる複数の文字位置を示す。すなわち、相違位置“（４，５）−４”の表記は、相違文字“カウンターフラグ”の先頭から４番目および５番目の連続する２つの文字と、相違文字“ラウンドフラグ”の先頭から４番目の文字と、が相違していることを示している。
【０２１０】
単語ペアｅ２について、“カウンター出力”と“ラウンド出力”とでは、先頭から１番目の文字がそれぞれ相違する。このため、相違文字抽出部１４０は、相違位置“１−１”を検出する。また、“カウンター出力”と“ラウンド出力”とでは、“カウンターフラグ”の先頭から４番目の文字および４番目に後続する５番目の文字と、“ラウンドフラグ”の先頭から４番目の文字とが相違する。このため、相違文字抽出部１４０は、相違位置“（４，５）−４”を検出する。
【０２１１】
次に、相違文字情報１１４ｅに基づく置換文字列の拡大処理の具体例を説明する。
図３９は、置換文字列拡大の第６の具体例を示す図である。置換文字列決定部１５０は、相違文字情報１１４ｅに基づいて、パラメータ化の対象とする置換文字列を決定する。まず、置換文字列決定部１５０は、単語ペアｅ１，ｅ２それぞれにおいて、相違文字情報１１４ｅで示される相違位置の相違文字を置換文字列とする（ステップＳＴ６１）。
【０２１２】
具体的には、置換文字列決定部１５０は、単語ペアｅ１について、“カウンターフラグ”の先頭から１番目の文字“カ”、および、先頭から４番目、５番目の文字“ター”をそれぞれ置換文字列とする。また、置換文字列決定部１５０は、“ラウンドフラグ”の先頭から１番目の文字“ラ”、および、先頭から４番目の文字“ド”をそれぞれ置換文字列とする。この場合、各置換文字列をパラメータ化しようとすると、置換文字列“カ”および“ラ”に対して１つ目のパラメータ、置換文字列“ター”および“ド”に対して２つ目のパラメータを用意することになるので、パラメータ数は“２”である。
【０２１３】
置換文字列決定部１５０は、拡大を行う置換文字列を決定する。例えば、前述のように、置換文字列決定部１５０は、各相違文字列のうち、先頭側にある文字を優先的に拡大対象として選択する。この場合、置換文字列決定部１５０は、相違文字“カ”および“ラ”に対応する置換文字列の拡大を行うと決定する。ここで、相違文字“カ”および“ラ”は、何れも相違単語の先頭の文字である。これ以上前方へは拡大できないので、置換文字列決定部１５０は、当該置換文字列を後方へ拡大する。
【０２１４】
置換文字列決定部１５０は、後方に１文字分、置換文字列の範囲を広げる。すなわち、置換文字列決定部１５０は、現在の置換文字列の末尾に、相違単語の先頭から２番目の文字を結合して置換文字列を更新する（ステップＳＴ６２）。
【０２１５】
ここでは、各相違文字の先頭から２番目の文字は“ウ”である。したがって、相違単語“カウンターフラグ”および“カウンター出力”それぞれの置換文字列は、“カウ”および“ター”である。また、相違単語“ラウンドフラグ”および“ラウンド出力”それぞれの置換文字列は、“ラウ”および“ド”である。各置換文字列をパラメータ化した場合のパラメータ数は“２”である。置換文字列“カウ”および“ラウ”に対して１つ目のパラメータ、置換文字列“ター”および“ド”に対して２つ目のパラメータを用意することになるからである。
【０２１６】
図４０は、置換文字列拡大の第６の具体例（続き）を示す図である。次に、置換文字列決定部１５０は、後方に１文字分、置換文字列の範囲を広げる。すなわち、置換文字列決定部１５０は、現在の置換文字列の末尾に、相違単語の先頭から３番目の文字を結合して置換文字列を更新する（ステップＳＴ６３）。
【０２１７】
ここでは、各相違単語の先頭から３番目の文字は“ン”である。したがって、相違単語“カウンターフラグ”および“カウンター出力”それぞれの置換文字列は“カウンター”である。ここで、置換文字列決定部１５０は、今回の拡大によって作成した置換文字列“カウン”と、“カウン”の直後に後続する置換文字列“ター”とを結合して、１つの置換文字列“カウンター”とする。また、相違単語“ラウンドフラグ”および“ラウンド出力”それぞれの置換文字列は“ラウンド”である。ここで、置換文字列決定部１５０は、今回の拡大によって作成した置換文字列“ラウン”と、“ラウン”の直後に後続する置換文字列“ド”とを結合して、１つの置換文字列“ラウンド”とする。各置換文字列をパラメータ化した場合のパラメータ数は“１”である。置換文字列“カウンター”および“ラウンド”に対して１つパラメータを用意すればよいからである。
【０２１８】
次に、置換文字列決定部１５０は、後方に１文字分、置換文字列の範囲を広げる。すなわち、置換文字列決定部１５０は、現在の置換文字列“カウンター”の末尾に、相違単語“カウンターフラグ”および“カウンター出力”それぞれの先頭から６番目の各文字を結合して当該置換文字列を更新する。また、置換文字列決定部１５０は、現在の置換文字列“ラウンド”の末尾に、相違単語“ラウンドフラグ”および“ラウンド出力”それぞれの先頭から５番目の各文字を結合して当該置換文字列を更新する（ステップＳＴ６４）。
【０２１９】
ここでは、相違単語“カウンターフラグ”の先頭から６番目の文字、および、相違単語“ラウンドフラグ”の先頭から５番目の文字は、“フ”である。相違単語“カウンター出力”の先頭から６番目の文字、および、相違単語“ラウンド出力”の先頭から５番目の文字は、“出”である。したがって、相違単語“カウンターフラグ”の置換文字列は“カウンターフ”である。相違単語“ラウンドフラグ”の置換文字列は“ラウンドフ”である。相違単語“カウンター出力”の置換文字列は“カウンター出”である。相違単語“ラウンド出力”の置換文字列は“ラウンド出”である。各置換文字列をパラメータ化した場合、“カウンターフ”および“ラウンドフ”で１つ目のパラメータ、“カウンター出”および“ラウンド出”で２つ目のパラメータを用意することになるので、パラメータ数は“２”である。パラメータ数“２”は、ステップＳＴ６３におけるパラメータ数“１”よりも多い。
【０２２０】
このため、置換文字列決定部１５０は、ステップＳＴ６４で特定した置換文字列について１文字分の拡大を元に戻す。すなわち、置換文字列決定部１５０は、ステップＳＴ６３で特定した置換文字列“カウンター”および“ラウンド”をパラメータ化対象の置換文字列として確定する。置換文字列決定部１５０は、当該置換文字列に関するパラメータ化情報１１６（パラメータ化情報１１６のレコードと称してもよい）を生成し、記憶部１１０に格納する。
【０２２１】
図４１は、パラメータ化情報の例（その３）を示す図である。パラメータ化情報１１６ｂは、図４０の処理に応じて置換文字列決定部１５０により生成されるパラメータ化情報を例示している。パラメータ化情報１１６ｂは、コードクローン情報ＣＬ５に対して、パラメータ数“１”、コードＣ５１（第１コード）に対する置換文字列“カウンター”、コードＣ５２（第２コード）に対する置換文字列“ラウンド”という情報を含む。
【０２２２】
このように、置換文字列決定部１５０は、ある単語ペアに属する各相違単語の文字数が異なっていても、可読性および再利用可能性の高い共通コードを実現するパラメータ化を行える。
【０２２３】
更に、ここまでの説明では、サーバ１００における、２つのソースコードの指定に応じたパラメータ化を例示した。ただし、ユーザは３以上のソースコードをサーバ１００に指定することもできる。そこで、以下では、一例として、３つのソースコードが指定される場合を説明する。
【０２２４】
図４２は、３つのソースコードの例を示す図である。ソースコード群１１１は、更に、ソースコードＰ７，Ｐ８，Ｐ９を含む。ソースコードＰ７のファイル名は“ＰＲＯＧ００７．ＣＢＬ”である。ソースコードＰ８のファイル名は“ＰＲＯＧ００８．ＣＢＬ”である。ソースコードＰ９のファイル名は“ＰＲＯＧ００９．ＣＢＬ”である。
【０２２５】
図４３は、３つの類似コードに関するコードクローン情報の例を示す図である。例えば、コードクローン検出部１２０は、ユーザによりソースコードＰ７，Ｐ８，Ｐ９のファイル名の入力を受け付けると、記憶部１１０に記憶されたソースコードＰ７，Ｐ８，Ｐ９を比較して、コードクローン情報ＣＬ６を生成する。コードクローン情報ＣＬ６は、コードＣ６１，Ｃ６２，Ｃ６３を含む。
【０２２６】
コードＣ６１は、ソースコードＰ７の一部分である。コードＣ６１は、コードＣ６２に類似するコードであり、ソースコードＰ７，Ｐ８の比較に応じて検出されたコードクローンである。コードＣ６１は、コードＣ６３にも類似する。コードクローン検出部１２０は、ソースコードＰ７，Ｐ９の比較に応じて、コードＣ６１を検出してもよい。
【０２２７】
コードＣ６２は、ソースコードＰ８の一部分である。コードＣ６２は、コードＣ６１に類似するコードであり、ソースコードＰ７，Ｐ８の比較に応じて検出されたコードクローンである。コードＣ６２は、コードＣ６３にも類似する。コードクローン検出部１２０は、ソースコードＰ８，Ｐ９の比較に応じて、コードＣ６２を検出してもよい。
【０２２８】
コードＣ６３は、ソースコードＰ９の一部分である。コードＣ６３は、コードＣ６１に類似するコードであり、ソースコードＰ７，Ｐ９の比較に応じて検出されたコードクローンである。コードＣ６３は、コードＣ６２にも類似する。コードクローン検出部１２０は、ソースコードＰ８，Ｐ９の比較に応じて、コードＣ６３を検出してもよい。
【０２２９】
図４４は、３つの類似コードに関する相違単語情報の例を示す図である。相違単語情報１１３ｆは、コードクローン情報ＣＬ６に対して、相違単語抽出部１３０により生成される相違単語情報を例示している。
【０２３０】
相違単語抽出部１３０は、コードクローン情報ＣＬ６を参照して、コードＣ６１，Ｃ６２，Ｃ６３それぞれから相違単語を抽出し、相違単語情報１１３ｆを生成する。この場合、相違単語の１つの組み合わせには３つの相違単語が属する。相違単語の１つの組み合わせは、セット識別子（単語セットｆ１など）によって識別される。
【０２３１】
具体的には、コードＣ６１の相違単語“Ｓ１１Ａフラグ”とコードＣ６２の相違単語“Ｓ１２Ａフラグ”とコードＣ６３の相違単語“Ｓ１３Ａフラグ”とが、単語セットｆ１の組み合わせに属する相違単語である。
【０２３２】
また、コードＣ６１の相違単語“Ｓ１１Ａ名前”とコードＣ６２の相違単語“Ｓ１２Ａ名前”とコードＣ６３の相違単語“Ｓ１３Ａ名前”とが、単語セットｆ２の組み合わせに属する相違単語である。
【０２３３】
相違単語抽出部１３０は、２つのソースコードが指定された場合と同様に、互いに類似するコードＣ６１，Ｃ６２，Ｃ６３それぞれにおいて、共通の箇所に記述され互いに相違する変数名や処理名などを検出することで、各相違単語を抽出することができる。
【０２３４】
図４５は、３つの類似コードに関する相違文字情報の例を示す図である。相違文字情報１１４ｆは、相違単語情報１１３ｆに対して、相違文字抽出部１４０により生成された相違文字情報を例示している。相違文字抽出部１４０は、相違単語情報１１３ｆを参照して、各単語セットに対する相違位置を検出し、相違文字情報１１４ｆを生成する。
【０２３５】
具体的には、単語セットｆ１について、“Ｓ１１Ａフラグ”と“Ｓ１２Ａフラグ”とでは、先頭から３番目の文字がそれぞれ相違する。また、“Ｓ１２Ａフラグ”と“Ｓ１３Ａフラグ”とでは、先頭から３番目の文字がそれぞれ相違する。このため、相違文字抽出部１４０は、相違位置“３−３−３”を検出する。
【０２３６】
単語セットｆ２について、“Ｓ１１Ａ名前”と“Ｓ１２Ａ名前”とでは、先頭から３番目の文字がそれぞれ相違する。また、“Ｓ１２Ａ名前”と“Ｓ１３Ａ名前”とでは、先頭から３番目の文字がそれぞれ相違する。このため、相違文字抽出部１４０は、相違位置“３−３−３”を検出する。
【０２３７】
なお、相違文字抽出部１４０は、ある単語セットに属する３以上の相違文字のうち、比較対象とする２つの相違文字を任意の組み合わせとすることができる。例えば、単語セットｆ１において、“Ｓ１１Ａフラグ”と“Ｓ１２Ａフラグ”とを比較し、“Ｓ１１Ａフラグ”と“Ｓ１３Ａフラグ”とを比較して、両相違単語の相違位置を検出してもよい。
【０２３８】
図４６は、置換文字列拡大の第７の具体例を示す図である。置換文字列決定部１５０は、相違文字情報１１４ｆに基づいて、パラメータ化の対象とする置換文字列を決定する。まず、置換文字列決定部１５０は、単語セットｆ１，ｆ２それぞれにおいて、相違文字情報１１４ｆで示される相違位置の相違文字を置換文字列とする（ステップＳＴ７１）。
【０２３９】
具体的には、置換文字列決定部１５０は、単語セットｆ１について、“Ｓ１１Ａフラグ”の先頭から３番目の文字“１”、“Ｓ１２Ａフラグ”の先頭から３番目の文字“２”、および、“Ｓ１３Ａフラグ”の先頭から３番目の文字“３”をそれぞれ置換文字列とする。
【０２４０】
また、置換文字列決定部１５０は、単語セットｆ２について、“Ｓ１１Ａ名前”の先頭から３番目の文字“１”、“Ｓ１２Ａ名前”の先頭から３番目の文字“２”、および、“Ｓ１３Ａ名前”の先頭から３番目の文字“３”をそれぞれ置換文字列とする。
【０２４１】
この場合、相違単語“Ｓ１１Ａフラグ”および“Ｓ１１Ａ名前”それぞれの置換文字列は“１”である。相違単語“Ｓ１２Ａフラグ”および“Ｓ１２Ａ名前”それぞれの置換文字列は“２”である。相違単語“Ｓ１３Ａフラグ”および“Ｓ１３Ａ名前”それぞれの置換文字列は“３”である。各置換文字列をパラメータ化した場合のパラメータ数は“１”である。置換文字列“１”、“２”、“３”に対して１つパラメータを用意すればよいからである。
【０２４２】
次に、置換文字列決定部１５０は、前方に１文字分、置換文字列の範囲を広げる。すなわち、置換文字列決定部１５０は、現在の置換文字列の先頭に、相違単語の先頭から２番目の文字を結合して置換文字列を更新する（ステップＳＴ７２）。
【０２４３】
ここでは、各相違単語の先頭から２番目の文字は“１”である。したがって、相違単語“Ｓ１１Ａフラグ”および“Ｓ１１Ａ名前”それぞれの置換文字列は“１１”である。また、相違単語“Ｓ１２Ａフラグ”および“Ｓ１２Ａ名前”それぞれの置換文字列は“１２”である。更に、相違単語““１３Ａフラグ”および“Ｓ１３Ａ名前”それぞれの置換文字列は“１３”である。各置換文字列をパラメータ化した場合のパラメータ数は“１”である。置換文字列“１１”、“１２”および“１３”に対して１つパラメータを用意すればよいからである。
【０２４４】
図４７は、置換文字列拡大の第７の具体例（続き）を示す図である。次に、置換文字列決定部１５０は、前方に１文字分、置換文字列の範囲を広げる。すなわち、置換文字列決定部１５０は、現在の置換文字列の先頭に、相違単語の先頭から１番目の文字を結合して置換文字列を更新する（ステップＳＴ７３）。
【０２４５】
ここでは、各相違単語の先頭から１番目の文字は“Ｓ”である。したがって、相違単語“Ｓ１１Ａフラグ”および“Ｓ１１Ａ名前”それぞれの置換文字列は“Ｓ１１”である。また、相違単語“Ｓ１２Ａフラグ”および“Ｓ１２Ａ名前”それぞれの置換文字列は“Ｓ１２”である。更に、相違単語“Ｓ１３Ａフラグ”および“Ｓ１３Ａ名前”それぞれの置換文字列は“Ｓ１３”である。各置換文字列をパラメータ化した場合のパラメータ数は“１”である。置換文字列“Ｓ１１”、“Ｓ１２”および“Ｓ１３”に対して１つパラメータを用意すればよいからである。
【０２４６】
この段階で、各置換文字列は、各相違文字列の先頭の文字まで拡大済である（先頭の文字を含んでいる）。このため、以後、置換文字列決定部１５０は、置換文字列の起点とした相違位置から後方に置換文字列を拡大する。
【０２４７】
次に、置換文字列決定部１５０は、後方に１文字分、置換文字列の範囲を広げる。すなわち、置換文字列決定部１５０は、現在の置換文字列の末尾に、相違単語の先頭から４番目の文字を結合して置換文字列を更新する（ステップＳＴ７４）。
【０２４８】
ここでは、各相違単語の先頭から４番目の文字は“Ａ”である。したがって、相違単語“Ｓ１１Ａフラグ”および“Ｓ１１Ａ名前”それぞれの置換文字列は“Ｓ１１Ａ”である。相違単語“Ｓ１２Ａフラグ”および“Ｓ１２Ａ名前”それぞれの置換文字列は“Ｓ１２Ａ”である。相違単語“Ｓ１３Ａフラグ”および“Ｓ１３Ａ名前”それぞれの置換文字列は“Ｓ１３Ａ”である。各置換文字列をパラメータ化した場合のパラメータ数は“１”である。置換文字列“Ｓ１１Ａ”、“Ｓ１２Ａ”および“Ｓ１３Ａ”に対して１つパラメータを用意すればよいからである。
【０２４９】
図４８は、置換文字列拡大の第７の具体例（続き）を示す図である。次に、置換文字列決定部１５０は、後方に１文字分、置換文字列の範囲を広げる。すなわち、置換文字列決定部１５０は、現在の置換文字列の末尾に、相違単語の先頭から５番目の文字を結合して置換文字列を更新する（ステップＳＴ７５）。
【０２５０】
ここでは、相違単語“Ｓ１１Ａフラグ”、“Ｓ１２Ａフラグ”および“Ｓ１３Ａフラグ”の先頭から５番目の文字は“フ”である。また、相違単語“Ｓ１１Ａ名前”、“Ｓ１２Ａ名前”および“Ｓ１３Ａ名前”の先頭から５番目の文字は“名”である。したがって、相違単語“Ｓ１１Ａフラグ”の置換文字列は“Ｓ１１Ａフ”である。相違単語“Ｓ１２Ａフラグ”の置換文字列は“Ｓ１２Ａフ”である。相違単語“Ｓ１３Ａフラグ”の置換文字列は“Ｓ１３Ａフ”である。相違単語“Ｓ１１Ａ名前”の置換文字列は“Ｓ１１Ａ名”である。相違単語“Ｓ１２Ａ名前”の置換文字列は“Ｓ１２Ａ名”である。置換文字列“Ｓ１３Ａ名前”の置換文字列は“Ｓ１３Ａ名”である。
【０２５１】
各置換文字列をパラメータ化した場合、“Ｓ１１Ａフ”、“Ｓ１２Ａフ”および“Ｓ１３Ａフ”で１つ目のパラメータ、“Ｓ１１Ａ名”、“Ｓ１２Ａ名”および“Ｓ１３Ａ名”で２つ目のパラメータを用意することになるので、パラメータ数は“２”である。パラメータ数“２”は、ステップＳＴ７４におけるパラメータ数“１”よりも多い。
【０２５２】
このため、置換文字列決定部１５０は、ステップＳＴ７５で特定した置換文字列について１文字分の拡大を元に戻す。すなわち、置換文字列決定部１５０は、ステップＳＴ７４で特定した置換文字列“Ｓ１１Ａ”、“Ｓ１２Ａ”および“Ｓ１３Ａ”をパラメータ化対象の置換文字列として確定する。置換文字列決定部１５０は、当該置換文字列に関するパラメータ化情報１１６（パラメータ化情報１１６のレコードと称してもよい）を生成し、記憶部１１０に格納する。
【０２５３】
図４９は、パラメータ化情報の例（その４）を示す図である。パラメータ化情報１１６ｃは、図４８の処理に応じて置換文字列決定部１５０により生成されるパラメータ化情報を例示している。パラメータ化情報１１６ｃは、コードクローン情報ＣＬ６に対して、パラメータ数“１”、コードＣ６１（第１コード）に対する置換文字列“Ｓ１１Ａ”、コードＣ６２（第２コード）に対する置換文字列“Ｓ１２Ａ”、コードＣ６３（第３コード）に対する置換文字列“Ｓ１３Ａ”という情報を含む。
【０２５４】
このように、置換文字列決定部１５０は、３以上のソースコードが指定された場合にも、当該ソースコードからコードクローンを検出し、当該コードクローンに対して、可読性および再利用可能性の高い共通化を行える。
【０２５５】
ところで、図４，５の例では、コードクローン共通化の単純な方法の例として、コードＣ１１，Ｃ１２間、または、コードＣ２１，Ｃ２２間で相違する箇所（相違する文字）のみをパラメータ化することを例示した。以下では、サーバ１００によるパラメータ化方法の比較例として、コードクローン共通化の単純な処理の具体例を補足する。
【０２５６】
図５０は、コードクローン共通化の単純な処理の例（比較例）を示す図である。例えば、コードＣ７１，Ｃ７２は、２つの異なるソースコードが抽出されたコードクローンである。コンピュータを用いてコードＣ７１，Ｃ７２を比較し、コードＣ７１，Ｃ７２の共通の箇所に記述され互いに異なる単語を抽出する。テーブルＴ３は、当該比較に応じてコードＣ７１およびコードＣ７２から抽出された各単語を例示している。この場合、テーブルＴ３の同一レコードに属する各単語を比較することで、単語間の相違を得ることができる。例えば、テーブルＴ３の最上部のレコードにはコードＣ７１から抽出した相違単語“納品−フラグ”が登録され、コードＣ７２から抽出した相違単語“発送−フラグ”が登録されている。両相違単語間の文字の相違は、“納”と“発”との相違、および、“品”と“送”との相違である。テーブルＴ３では、連続する相違文字を繋げて、当該相違を“納品＜＝＞発送”と表記している。こうして、コンピュータにより相違する文字を抽出し、相違ごとにパラメータ化して、コードＣ７１，Ｃ７２を共通コード化することもできる。この場合、例えば、テーブルＴ３の例では、“納品”および“発送”の相違に対して１つ目のパラメータを用意し、“１１”および“２２”の相違に対して２つ目のパラメータを用意することが考えられ、合計２つのパラメータを用意することになる。
【０２５７】
しかし、このように相違箇所だけをパラメータ化する方法を、実際のソースコードに適用すると、図４，５で例示したように、可読性や再利用可能性の低い共通コードが作成されてしまうおそれがある。
【０２５８】
これに対し、サーバ１００では、各コードクローンにおける相違単語のうち、互いに相違する文字位置から前方または後方に１文字以上拡大した意味のある文字列範囲を、パラメータ化対象の置換文字列とする。これにより、単に相違箇所のみをパラメータ化するよりも、共通コードの可読性、および、再利用可能性を高めることができる。
【０２５９】
例えば、上記のように、サーバ１００は、パラメータ化候補の文字列範囲を１文字ずつ拡大しながらパラメータ数の増減を確認し、パラメータ数が少なくなる置換文字列を優先的に選択する。すると、変数名や処理名（例えば、関数名、オブジェクト名、サブルーチン名）などに含まれる複数の単語について意味のある文字列の単位でプレースホルダを設定できる（例えば、プレースホルダを“？”として、変数名を“？フラグ”とするなど）。これにより、ユーザは、パラメータ化された部分について、変数名や処理名などのパラメータの意味を比較的容易に把握可能となる。すなわち、置換文字列の可読性を高められる。また、パラメータ数を少なくすることで、ある程度まとまった文字列範囲をパラメータ化でき、共通コードの再利用可能性を高められる。例えば、パラメータ部分（プレースホルダ部分）に挿入可能な文字列の自由度が増し、共通コードの再利用可能性が高まる。特に、この場合でも、共通処理内で使用される変数の種類について、例えば、“？フラグ”の“フラグ”という意味のある部分を共通化し、その前方部分をパラメータ化できる。このため、ユーザは、当該個所に設定される変数が“フラグ”であることを意識しながら、パラメータ化した箇所に、意味のある単位で任意の文字列を設定できる。
【０２６０】
このように、パラメータ化情報を生成することで、サーバ１００は、共通コードの可読性、および、再利用可能性を高め、ユーザによるプログラムの作成や保守に伴う作業を省力化できる。こうして、サーバ１００は、ソフトウェア開発の効率を改善することができる。
【０２６１】
なお、第１の実施の形態の情報処理は、演算部１ｂにプログラムを実行させることで実現できる。また、第２の実施の形態の情報処理は、プロセッサ１０１にプログラムを実行させることで実現できる。プログラムは、コンピュータ読み取り可能な記録媒体１３に記録できる。
【０２６２】
例えば、プログラムを記録した記録媒体１３を配布することで、プログラムを流通させることができる。また、プログラムを他のコンピュータに格納しておき、ネットワーク経由でプログラムを配布してもよい。コンピュータは、例えば、記録媒体１３に記録されたプログラムまたは他のコンピュータから受信したプログラムを、ＲＡＭ１０２やＨＤＤ１０３などの記憶装置に格納し（インストールし）、当該記憶装置からプログラムを読み込んで実行してもよい。
【０２６３】
以上の第１，第２の実施の形態を含む実施形態に関し、更に以下の付記を開示する。
（付記１）  コンピュータが、
互いに類似する複数のコードそれぞれにおいて共通の箇所に記述され互いに相違する複数の単語を抽出し、前記複数の単語の間で相違する相違文字の位置を検出し、
前記複数の単語それぞれのうち、前記位置の前方に連なる１以上の文字および前記位置の後方に連なる１以上の文字の両方または何れか一方と前記相違文字とを含む文字列を、パラメータ化の対象部分とする置換文字列と決定し、
前記複数のコードそれぞれの前記置換文字列の情報を出力する、
パラメータ化方法。
【０２６４】
（付記２）  前記決定では、前記複数のコードと前記置換文字列の候補とを用いて作成される共通コードに含まれるパラメータの数に基づいて、前記置換文字列を決定する、付記１記載のパラメータ化方法。
【０２６５】
（付記３）  前記決定では、前記置換文字列の複数の候補のうち前記複数の候補それぞれに応じた共通コードに含まれる前記パラメータの数が少ない候補を優先的に選択することで、前記置換文字列を決定する、付記２記載のパラメータ化方法。
【０２６６】
（付記４）  前記決定では、前記位置を起点に１文字ずつ前記置換文字列の候補に対応する文字列範囲を拡大し、１文字拡大するたびに前記パラメータの数を計算し、今回の前記パラメータの数が前回の前記パラメータの数よりも増えると、前回の前記文字列範囲を前記置換文字列と決定する、付記３記載のパラメータ化方法。
【０２６７】
（付記５）  前記決定では、更に、前記複数の単語それぞれに含まれる所定の文字または隣接する文字の種類の変化に応じて前記置換文字列を決定する、付記２乃至４の何れか１項に記載のパラメータ化方法。
【０２６８】
（付記６）  前記決定では、更に、辞書情報に登録された所定単語を前記複数の単語に含まれる文字列の中から特定し、前記複数の単語のうち前記所定単語以外の部分から前記置換文字列を決定する、付記２乃至５の何れか１項に記載のパラメータ化方法。
【０２６９】
（付記７）  前記複数のコード、および、前記複数のコードそれぞれの前記置換文字列の情報に基づいて、各コードの前記置換文字列をパラメータに置換した共通コードを出力する、付記１乃至６の何れか１項に記載のパラメータ化方法。
【０２７０】
（付記８）  前記複数のコードは、複数のソースコードの比較に応じて検出されたコードクローンである、付記１乃至７の何れか１項に記載のパラメータ化方法。
（付記９）  互いに類似する複数のコードを記憶する記憶部と、
前記複数のコードそれぞれにおいて共通の箇所に記述され互いに相違する複数の単語を抽出し、前記複数の単語の間で相違する相違文字の位置を検出し、前記複数の単語それぞれのうち、前記位置の前方に連なる１以上の文字および前記位置の後方に連なる１以上の文字の両方または何れか一方と前記相違文字とを含む文字列を、パラメータ化の対象部分とする置換文字列と決定し、前記複数のコードそれぞれの前記置換文字列の情報を出力する演算部と、
を有する情報処理装置。
【０２７１】
（付記１０）  コンピュータに、
互いに類似する複数のコードそれぞれにおいて共通の箇所に記述され互いに相違する複数の単語を抽出し、前記複数の単語の間で相違する相違文字の位置を検出し、
前記複数の単語それぞれのうち、前記位置の前方に連なる１以上の文字および前記位置の後方に連なる１以上の文字の両方または何れか一方と前記相違文字とを含む文字列を、パラメータ化の対象部分とする置換文字列と決定し、
前記複数のコードそれぞれの前記置換文字列の情報を出力する、
処理を実行させるパラメータ化プログラム。
【符号の説明】
【０２７２】
１  情報処理装置
１ａ  記憶部
１ｂ  演算部
ＰＦ１，ＰＦ２  ソースコード
ＳＣ１，ＳＣ２  類似コード
Ｄ１  相違単語情報
Ｄ２  相違文字情報
Ｄ３  パラメータ化情報
【図１】
0006649584.tif 000002
【図２】
0006649584.tif 000003
【図３】
0006649584.tif 000004
【図４】
0006649584.tif 000005
【図５】
0006649584.tif 000006
【図６】
0006649584.tif 000007
【図７】
0006649584.tif 000008
【図８】
0006649584.tif 000009
【図９】
0006649584.tif 000010
【図１０】
0006649584.tif 000011
【図１１】
0006649584.tif 000012
【図１２】
0006649584.tif 000013
【図１３】
0006649584.tif 000014
【図１４】
0006649584.tif 000015
【図１５】
0006649584.tif 000016
【図１６】
0006649584.tif 000017
【図１７】
0006649584.tif 000018
【図１８】
0006649584.tif 000019
【図１９】
0006649584.tif 000020
【図２０】
0006649584.tif 000021
【図２１】
0006649584.tif 000022
【図２２】
0006649584.tif 000023
【図２３】
0006649584.tif 000024
【図２４】
0006649584.tif 000025
【図２５】
0006649584.tif 000026
【図２６】
0006649584.tif 000027
【図２７】
0006649584.tif 000028
【図２８】
0006649584.tif 000029
【図２９】
0006649584.tif 000030
【図３０】
0006649584.tif 000031
【図３１】
0006649584.tif 000032
【図３２】
0006649584.tif 000033
【図３３】
0006649584.tif 000034
【図３４】
0006649584.tif 000035
【図３５】
0006649584.tif 000036
【図３６】
0006649584.tif 000037
【図３７】
0006649584.tif 000038
【図３８】
0006649584.tif 000039
【図３９】
0006649584.tif 000040
【図４０】
0006649584.tif 000041
【図４１】
0006649584.tif 000042
【図４２】
0006649584.tif 000043
【図４３】
0006649584.tif 000044
【図４４】
0006649584.tif 000045
【図４５】
0006649584.tif 000046
【図４６】
0006649584.tif 000047
【図４７】
0006649584.tif 000048
【図４８】
0006649584.tif 000049
【図４９】
0006649584.tif 000050
【図５０】
0006649584.tif 000051