(57)【特許請求の範囲】
【請求項１】
１以上の行を夫々含む２つの対象モジュールを比較可能なテキスト比較装置であって、
前記テキスト比較装置は、比較手段を備えており、且つ、記憶手段からデータ取得可能であり、
前記記憶手段には、前記対象モジュールを含む２以上のモジュールが記憶されており、
前記記憶手段に記憶された前記対象モジュールに含まれる前記行を所定の順番にソートすることで、対象リストを得ることができ、
前記比較手段は、前記対象モジュールから夫々得られる２つの前記対象リストに対してテキスト比較を行い、
前記比較手段は、前記テキスト比較において、前記対象リストの一方に含まれる前記行が前記対象リストの他方に含まれる前記行のいずれかと一致する一致行であるか又はいずれとも一致しない不一致行であるかを、前記対象リストの前記一方及び前記他方の並び順に沿って判定し、
前記比較手段は、前記テキスト比較において、前記対象リストの前記一方に含まれる前記行が前記不一致行である場合であって且つ所定の条件が満たされるとき、前記不一致行に含まれる項目を使用して、前記対象リストの他方に含まれる前記行のいずれかと一致しているか不一致であるかを更に判定する
テキスト比較装置。
【請求項２】
請求項１記載のテキスト比較装置であって、
前記対象モジュールの夫々の前記行には、プログラミング言語による文が記述されている
テキスト比較装置。
【請求項３】
請求項１又は請求項２記載のテキスト比較装置であって、
前記記憶手段には、２以上の前記モジュールからなるモジュール群が記憶されており、
前記比較手段は、前記モジュール群に含まれる２つの前記モジュールを前記対象モジュールとして使用し、且つ、前記モジュール群に含まれる２つの前記モジュールの全ての組み合わせについて前記テキスト比較を行う
テキスト比較装置。
【請求項４】
請求項１乃至請求項３のいずれかに記載のテキスト比較装置であって、
前記対象リストは、前記対象モジュールに含まれる前記行を所定の順番にソートするだけでなく、前記対象モジュールに含まれる前記行から前記テキスト比較を行う必要がない比較不要行を削除することで得ることができる
テキスト比較装置。
【請求項５】
請求項１乃至請求項４のいずれかに記載のテキスト比較装置であって、
前記比較手段は、前記対象モジュールの夫々に含まれる処理単位ごとに、前記テキスト比較の結果を作成する
テキスト比較装置。
【請求項６】
請求項１乃至請求項５のいずれかに記載のテキスト比較装置であって、
前記所定の条件は、前記対象リストの前記他方に第１相手行と第２相手行とが含まれている場合であって、且つ、前記不一致行と前記第１相手行と前記第２相手行とを前記所定の順番にソートすると、前記不一致行が前記第１相手行と前記第２相手行との間に位置する場合に満足される
テキスト比較装置。
【請求項７】
コンピュータを、請求項１乃至請求項６のいずれかに記載のテキスト比較装置として機能させるための
テキスト比較プログラム。
【請求項８】
１以上の行を夫々含む２つの対象モジュールをコンピュータによって比較するテキスト比較方法であって、
記憶手段に記憶された前記対象モジュールに含まれる前記行を所定の順番にソートすることで、対象リストを得ることができ、
前記テキスト比較方法は、前記対象モジュールから夫々得られる２つの前記対象リストに対してテキスト比較を行う比較ステップを含み、
前記比較ステップにおいて、前記対象リストの一方に含まれる前記行が前記対象リストの他方に含まれる前記行のいずれかと一致する一致行であるか又はいずれとも一致しない不一致行であるかを、前記対象リストの前記一方及び前記他方の並び順に沿って判定し、
前記比較ステップにおいて、前記対象リストの前記一方に含まれる前記行が前記不一致行である場合であって且つ所定の条件が満たされるとき、前記不一致行に含まれる項目を使用して、前記対象リストの他方に含まれる前記行のいずれかと一致しているか不一致であるかを更に判定する
テキスト比較方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、１以上の行を夫々含む２つのモジュール（テキストファイル）を比較するテキスト比較装置に関する。
【背景技術】
【０００２】
プログラムのソースコード（モジュール：テキストファイル）は、ＰＣ（Personal Computer）を使用して作成されることが多い。ソースコードがこのように作成される場合、コピー＆ペーストによる作成済みソースコードの流用が頻繁に行われる。ソースコードの流用により、所謂コードクローンが発生する。コードクローンは、特に大規模なシステムにおいて、システムメンテナンス工数の増大やメンテナンス漏れの原因になることが多い。一方、ソースコードの流用箇所が網羅的に記録に残されることは、現実的に期待できない。このため、コードクローンを事後的に効率よく検出する方法が求められている。
【０００３】
例えば、特許文献１には、比較先ソースコード（テキストファイル）から、指定されたソースコード片と類似する箇所を検出する方法が開示されている。特許文献１に開示された方法は、比較先ソースコードを行の並び順に沿って比較する。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２００６−１８６９３号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
特許文献１に開示された方法においては、比較対象となるソースコード片を指定する必要がある。しかしながら、システムにどのようなコードクローンが含まれているかは、分からない場合が多い。この場合、比較対象となるソースコード片を指定することができない。従って、システムにおけるコードクローンを検出するためには、システムに含まれる全てのモジュール（テキストファイル）から２つを選択する全ての組み合わせについて比較を行う必要がある。
【０００６】
しかしながら、特に大規模なシステムは、数千以上のモジュールを含んでいることもある。このような場合、２つのモジュールの組み合わせ数は膨大な数になる。従って、コードクローンを効率よく検出するためには、２つのモジュールの比較に要する時間を短縮する必要がある。
【０００７】
そこで、本発明は、１以上の行を夫々含む２つのモジュール（テキストファイル）を対象モジュールとして比較するテキスト比較装置であって、対象モジュールを効率よく比較できるテキスト比較装置を提供することを目的とする。
【課題を解決するための手段】
【０００８】
本発明は、第１のテキスト比較装置として、
１以上の行を夫々含む２つの対象モジュールを比較可能なテキスト比較装置であって、
前記テキスト比較装置は、比較手段を備えており、且つ、記憶手段からデータ取得可能であり、
前記記憶手段には、前記対象モジュールを含む２以上のモジュールが記憶されており、
前記記憶手段に記憶された前記対象モジュールに含まれる前記行を所定の順番にソートすることで、対象リストを得ることができ、
前記比較手段は、前記対象モジュールから夫々得られる２つの前記対象リストに対してテキスト比較を行う
テキスト比較装置を提供する。
【０００９】
また、本発明は、第２のテキスト比較装置として、第１のテキスト比較装置であって、
前記対象モジュールの夫々の前記行には、プログラミング言語による文が記述されている
テキスト比較装置を提供する。
【００１０】
また、本発明は、第３のテキスト比較装置として、第１又は第２のテキスト比較装置であって、
前記記憶手段には、２以上の前記モジュールからなるモジュール群が記憶されており、
前記比較手段は、前記モジュール群に含まれる２つの前記モジュールを前記対象モジュールとして使用し、且つ、前記モジュール群に含まれる２つの前記モジュールの全ての組み合わせについて前記テキスト比較を行う
テキスト比較装置を提供する。
【００１１】
また、本発明は、第４のテキスト比較装置として、第１乃至第３のいずれかのテキスト比較装置であって、
前記対象リストは、前記対象モジュールに含まれる前記行を所定の順番にソートするだけでなく、前記対象モジュールに含まれる前記行から前記テキスト比較を行う必要がない比較不要行を削除することで得ることができる
テキスト比較装置を提供する。
【００１２】
また、本発明は、第５のテキスト比較装置として、第１乃至第４のいずれかのテキスト比較装置であって、
前記比較手段は、前記対象モジュールの夫々に含まれる処理単位ごとに、前記テキスト比較の結果を作成する
テキスト比較装置を提供する。
【００１３】
また、本発明は、第６のテキスト比較装置として、第１乃至第５のいずれかのテキスト比較装置であって、
前記比較手段は、前記テキスト比較において、前記対象リストの一方に含まれる前記行が前記対象リストの他方に含まれる前記行のいずれかと一致する一致行であるか又はいずれとも一致しない不一致行であるかを、前記対象リストの前記一方及び前記他方の並び順に沿って判定する
テキスト比較装置を提供する。
【００１４】
また、本発明は、第７のテキスト比較装置として、第６のテキスト比較装置であって、
前記比較手段は、前記テキスト比較において、前記対象リストの前記一方に含まれる前記行が前記不一致行である場合であって且つ所定の条件が満たされるとき、前記不一致行に含まれる項目を使用して、前記対象リストの他方に含まれる前記行のいずれかと一致しているか不一致であるかを更に判定する
テキスト比較装置を提供する。
【００１５】
また、本発明は、第８のテキスト比較装置として、第７のテキスト比較装置であって、
前記所定の条件は、前記対象リストの前記他方に第１相手行と第２相手行とが含まれている場合であって、且つ、前記不一致行と前記第１相手行と前記第２相手行とを前記所定の順番にソートすると、前記不一致行が前記第１相手行と前記第２相手行との間に位置する場合に満足される
テキスト比較装置を提供する。
【００１６】
また、本発明は、第１のテキスト比較プログラムとして、
コンピュータを、第１乃至第８のいずれかに記載のテキスト比較装置として機能させるための
テキスト比較プログラムを提供する。
【００１７】
また、本発明は、第１のテキスト比較方法として、
１以上の行を夫々含む２つの対象モジュールをコンピュータによって比較するテキスト比較方法であって、
記憶手段に記憶された前記対象モジュールに含まれる前記行を所定の順番にソートすることで、対象リストを得ることができ、
前記テキスト比較方法は、前記対象モジュールから夫々得られる２つの前記対象リストに対してテキスト比較を行う比較ステップを含む
テキスト比較方法を提供する。
【発明の効果】
【００１８】
本発明における対象リストは、記憶手段に記憶された対象モジュールに含まれる行を所定の順番にソートすることで得られる。本発明によれば、この対象リストに対してテキスト比較が行われる。このように夫々ソートされた２つの対象リストを比較する処理は、様々な方法を使用して効率よく行うことができる。このため、対象モジュールを効率よく比較できる。
【図面の簡単な説明】
【００１９】
【図１】本発明の実施の形態によるテキスト比較装置を示すブロック構成図である。
【図２】図１のテキスト比較装置の記憶装置に記憶されているモジュール（テキストファイル）の例を示す図である。
【図３】図１の記憶装置に記憶可能な比較表の例を示す図である。
【図４】図１のテキスト比較装置の比較手段の機能を示すフローチャートである。
【図５】図４に示された比較手段の機能のうちのテキスト比較機能を、より詳細に示すフローチャートである。
【図６】図５に示されたテキスト比較機能のうちの行比較機能を、より詳細に示すフローチャートである。
【図７】図１の記憶装置に記憶されているモジュールの他の例を示す図である。
【図８】図１の記憶装置に記憶されているモジュールの更に他の例を示す図である。
【図９】図７のモジュールから作成される対象リストを例示する図である。
【図１０】図８のモジュールから作成される対象リストを例示する図である。
【図１１】図７のモジュールと図８のモジュールとから作成した比較表の例を示す図である。
【図１２】図５に示されたテキスト比較機能の変形例を示すフローチャートである。
【図１３】図７のモジュールにおける行とメソッドとの間の関連を示す図である。
【図１４】図８のモジュールにおける行とメソッドとの間の関連を示す図である。
【図１５】図７のモジュールと図８のモジュールとから作成した比較表の別の例を示す図である。
【図１６】図６に示された行比較機能の変形例を示すフローチャートである。
【図１７】図１６に示された行比較機能によって比較される行の一例を示す図である。
【図１８】図１のテキスト比較装置の第１の変形例によるテキスト比較システムを示すシステム構成図である。
【図１９】図１のテキスト比較装置の第２の変形例によるテキスト比較システムを示すシステム構成図である。
【発明を実施するための形態】
【００２０】
図１に示されるように、本発明の実施の形態によるテキスト比較装置１０は、装置本体２０と、記憶装置（記憶手段）３０と、入力装置４０と、出力装置５０とを備えている。テキスト比較装置１０は、所謂テキスト比較を行うための装置である。
【００２１】
図１を参照すると、記憶装置３０は、例えば磁気ディスク装置であり、フォルダ（図示せず）を使用して様々なファイルを階層化し、記憶できる。特に、本実施の形態による記憶装置３０には、２以上のモジュール（テキストファイル）３２からなるモジュール群３２Ｇが記憶されている。また、記憶装置３０は、１以上の比較表３４を記憶可能である。記憶装置３０は、装置本体２０と通信可能に接続されており、装置本体２０からの指示に従ってファイルの読込、書込（記憶）等を行う。換言すれば、テキスト比較装置１０は、記憶装置３０からデータ取得可能であり、記憶装置３０にデータ書込可能である。
【００２２】
図１及び図２を参照すると、本実施の形態によるモジュール３２は、記憶装置３０に記憶されたプログラムのソースコード（モジュール）である。モジュール３２は、例えばプログラミングツール（図示せず）を使用して作成される。モジュール３２は、文字、数字、記号等を組み合わせたモジュール名によって特定可能である。例えば、図２に例示された３つのモジュール３２のモジュール名は、夫々Module1, Module2, Module3である。以下の説明において、特定のモジュール３２を示す場合、" Module1"というように、単にモジュール名によって示すことがある。
【００２３】
本実施の形態において、モジュール３２の夫々は、一つのテキストファイルである。但し、モジュール３２をテキストファイルに変換できる限り、モジュール３２は、テキストファイルでなくてもよい。例えば、モジュール３２は、MICROSOFT EXCEL（登録商標）のワークシートであってもよい。この場合、一つのワークブックの中に、複数のワークシート（モジュール３２）が記憶されていてもよい。
【００２４】
図２及び図７に例示されるように、本実施の形態によるモジュール３２は、上から下に順に並ぶ１以上の行３２２を含んでいる。以下の説明において、モジュール３２の先頭行とは、モジュール３２の１行目（最も上の行３２２）を意味し、モジュール３２の最終行とは、モジュール３２の最も下の行３２２を意味する。モジュール３２のＮ行目とは、上からＮ番目の行３２２を意味する。また、モジュール３２のＮ行目に対する次行とは、モジュール３２のＮ＋１行目を意味し、モジュール３２のＮ行目に対する直前行とは、モジュール３２のＮ−１行目を意味する。
【００２５】
行３２２には、プログラミング言語による文（変数宣言文、実行文、コメント文、空文等）が記述されている。行３２２には、一つの完結した文全体が記述されていてもよいし、一つの文の一部が記述されていてもよい。本実施の形態によるプログラム言語はＪＡＶＡ（登録商標）である。但し、本発明はＪＡＶＡ（登録商標）以外のプログラム言語（例えば、ＣＯＢＯＬやＣ＃）にも適用可能である。行３２２には、文以外の要素を含んでいてもよい。例えば、モジュール３２がＣＯＢＯＬによって記述されているとき、行３２２には、文に加えて、行番号が記述されている。
【００２６】
モジュール３２には、１以上の行３２２から構成される処理単位を記述することができる。本実施の形態による処理単位は、ＪＡＶＡ（登録商標）におけるメソッドである。メソッドの夫々は、メソッド名（処理単位名）によって特定することができる。例えば、図７に例示されたSample1は、メソッド名が夫々main, getVisitorName， greetVisitor である３つのメソッドを含んでいる。また、Sample1は、いずれのメソッドにも含まれない行３２２（例えば、"import java.io.*;"が記述された行３２２）を含んでいる。本発明による処理単位は、メソッドには限られない。例えば、モジュール３２がＣＯＢＯＬによって記述されているとき、処理単位は、セクション名（処理単位名）によって特定可能なセクションである。
【００２７】
図３を参照すると、本実施の形態による比較表３４は、MICROSOFT EXCEL（登録商標）のワークシートである。比較表３４は、上から下に順に並ぶ複数の行３４２と、左から右に順に並ぶ複数の列３４４とから構成されている。図３に例示された比較表３４は、４つの行３４２と５つの列３４４とから構成されている。但し、比較表３４は、必要な数の行３４２及び列３４４から構成されていればよい。以下の説明において、比較表３４のＮ行目とは、上からＮ番目の行３４２を意味し、比較表３４のＭ列目とは、左からＭ番目の列３４４を意味する。
【００２８】
図１乃至図３を参照すると、テキスト比較装置１０は、モジュール群３２Ｇに含まれる複数のモジュール３２を互いに比較して比較表３４を作成する。図３に例示された比較表３４は、モジュール群３２Ｇに含まれる３つのモジュール３２（Module1, Module2及びModule3）を互いに比較することにより作成されている。詳しくは、図３に例示された比較表３４には、Module1とModule2とを比較した結果，Module1とModule3とを比較した結果及びModule2とModule3とを比較した結果が示されている。
【００２９】
図３に例示された比較表３４には、モジュール３２の夫々について、ステップ数（モジュール３２に含まれる行３２２の数）、他のモジュール３２との間で一致する行３２２の数及び他のモジュール３２との間の類似度が示されている。例えば、例示された比較表３４の２行目且つ２列目に示されるように、Module1のステップ数は１５２である。また、Module2のステップ数は１６２である。Module1の行３２２とModule2の行３２２とを比較すると、Module2の行３２２のうちの１４８が、Module1の行３２２のいずれかと一致している。換言すれば、Module2のうちの１４８の行３２２の夫々には、Module1の行３２２のいずれかと同一の文が記述されている。従って、Module1とModule2との間の類似度は、１４８／１６６（１５２＋１６２−１４８）＝約８９％である。
【００３０】
図３から理解されるように、２つのモジュール３２の間の類似度を示すことで、コードクローンを含んでいる可能性が高いモジュール３２が分かる。類似度が高い２つのモジュール３２（例示された比較表３４においては、Module1とModule2）を例えば目視によって照合することで、効率よくコードクローンを検出できる。
【００３１】
以上の説明から理解されるように、比較表３４は、MICROSOFT EXCEL（登録商標）のワークシートでなくてもよい。例えば、比較表３４は、テキストファイルであってもよい。この場合、比較表３４（テキストファイル）の複数の行に、２つのモジュール３２の間の類似度を夫々設定すればよい。但し、比較結果の把握し易さという観点からは、表形式のファイルであることが好ましい。
【００３２】
図１を参照すると、入力装置４０は、例えばキーボードやマウスである。入力装置４０は、装置本体２０と通信可能に接続されており、キーボードから入力された文字やマウスによって指示された位置を装置本体２０に通知する。
【００３３】
出力装置５０は、例えばディスプレイやプリンタである。出力装置５０は、装置本体２０と通信可能に接続されており、装置本体２０から転送された文字や図形等（例えば、比較表３４）を表示又は印刷する。
【００３４】
装置本体２０は、例えばＰＣ（Personal Computer：図示せず）の本体である。装置本体２０は、ＣＰＵ（Central Processing Unit：図示せず）、主記憶装置（図１８参照）等を備えている。記憶装置３０には様々なプログラムの実行形式ファイル（図示せず）が記憶されている。ＣＰＵは、実行形式ファイルを主記憶装置にローディングし、実行形式ファイル内の命令語を実行することで様々な機能を実現する。またＣＰＵが命令語を実行する過程において、記憶装置３０に記憶された所定のファイルが、主記憶装置内のバッファ領域を経由してプログラムの変数領域に読み込まれる。プログラムの変数領域に読み込まれたファイルの内容は、必要に応じて主記憶装置内のバッファ領域を経由して記憶装置３０に書き込まれる。上記の説明から理解されるように、記憶装置３０と主記憶装置とは、本実施の形態における読み込み及び書き込み可能な記憶手段として夫々機能する。本実施の形態の説明においては、記憶手段３０として記憶装置３０を使用する。
【００３５】
本実施の形態による記憶装置３０には、テキスト比較プログラム（図示せず）が記憶されている。テキスト比較プログラムは、主記憶装置（図１８参照）にローディングされ、ＣＰＵ（図示せず）によって実行される。これによってコンピュータは、比較手段２２として機能する。即ち、テキスト比較プログラムは、コンピュータをテキスト比較装置１０として機能させるためのプログラムである。換言すれば、本実施の形態によるテキスト比較装置１０の装置本体２０は、比較手段２２を備えている。
【００３６】
以下に説明するように、テキスト比較装置１０は、１以上の行３２２を夫々含む２つのモジュール３２（対象モジュール）を比較可能である。
【００３７】
図１を参照すると、本実施の形態によれば、ＣＰＵ（図示せず）がテキスト比較プログラム（図示せず）の命令語を実行することで、記憶装置３０に記憶されたモジュール群３２Ｇについて、テキスト比較が行われ、比較結果が比較表３４として出力される。換言すれば、比較手段２２は、記憶装置３０に記憶されたモジュール群３２Ｇについて、テキスト比較を行い、比較結果を比較表３４として出力する。以下、以上のように構成されたテキスト比較装置１０の機能及び動作について、比較手段２２を様々な処理の実行主体として記述しつつ、詳細に説明する。
【００３８】
図１を参照すると、比較手段２２は、モジュール群３２Ｇに含まれる２つのモジュール３２の全ての組み合わせについてテキスト比較を行う。例えば、モジュール群３２Ｇに１００のモジュール３２が含まれている場合、比較手段２２は、１００Ｃ２＝４９５０通りの組み合わせに対してテキスト比較を行う。換言すれば、比較手段２２は、４９５０回のテキスト比較を行う。以下の説明において、各テキスト比較において互いに比較される２つのモジュール３２を、対象モジュール３２Ｔ（図２参照）という。即ち、記憶装置３０には、対象モジュール３２Ｔを含む２以上のモジュール３２が含まれている。また、記憶装置３０に記憶されたモジュール群３２Ｇには、対象モジュール３２Ｔが記憶されている。比較手段２２は、モジュール群３２Ｇに含まれる２つのモジュール３２を対象モジュール３２Ｔとして使用して各テキスト比較を行う。
【００３９】
図１及び図４を参照すると、比較手段２２は、例えば入力装置４０から入力された起動指示によって起動される。起動指示は、例えば、キーボード（入力装置４０）を使用して入力された所定のコマンドである。
【００４０】
比較手段２２は、起動されると、処理対象とすべきモジュール群３２Ｇを決定する（Ｓ４００）。詳しくは、比較手段２２は、例えば、所定のコマンドと共に入力されたフォルダ名を取得する。また、比較手段２２は、例えば、記憶装置３０に記憶されたテキストファイルのうち、取得したフォルダ名に対応する所定のフォルダに含まれる全てのテキストファイルを、モジュール群３２Ｇとして使用する。
【００４１】
この場合、比較手段２２は、所定のフォルダ直下に存在するテキストファイルのみをモジュール群３２Ｇとして使用してもよい。また、比較手段２２は、所定のフォルダ内を再帰的に検索し、所定のフォルダのサブフォルダに含まれるテキストファイルを含む全てのテキストファイルをモジュール群３２Ｇとして使用してもよい。比較手段２２は、テキストファイルであるか否かを、様々な方法で決定できる。例えば、比較手段２２は、テキストファイルであるか否かを、拡張子によって決定してもよい。
【００４２】
比較手段２２は、所定のプログラミング言語（例えば、ＪＡＶＡ（登録商標））によって記述されたテキストファイルのみからなるモジュール群３２Ｇを、処理対象として使用してもよい。この場合、比較手段２２は、所定のプログラミング言語によって記述されているか否かを、例えば拡張子によって決定してもよいし、テキストファイルの記述内容によって決定してもよい。
【００４３】
図１及び図４を参照すると、次に、比較手段２２は、テキスト比較を行う（Ｓ４０２）。より具体的には、比較手段２２は、モジュール群３２Ｇに含まれるモジュール３２から２つのモジュール３２を対象モジュール３２Ｔとして選択し、この２つの対象モジュール３２Ｔを比較する（Ｓ４０２）。次に、比較手段２２は、モジュール群３２Ｇに含まれる２つのモジュール３２の全ての組み合わせについてテキスト比較済みであるか否かを判定する（Ｓ４０４）。比較手段２２は、上述の判定結果がＮＯの場合（Ｓ４０４においてＮＯの場合）、未だテキスト比較を行っていない２つのモジュール３２についてテキスト比較を行う（Ｓ４０２）。
【００４４】
比較手段２２は、例えば、テキスト比較を行う前に、モジュール群３２Ｇに含まれる全てのモジュール３２の一覧表を作成してもよい。この場合、比較手段２２は、この一覧表の並び順に沿って２つの対象モジュール３２Ｔを選択すればよい。
【００４５】
図１及び図４を参照すると、比較手段２２は、上述の判定結果がＹＥＳの場合（Ｓ４０４においてＹＥＳの場合）、比較表３４を作成する（Ｓ４０６）。比較手段２２は、例えば、各テキスト比較（Ｓ４０２）において、対象モジュール３２Ｔの夫々のモジュール名及びステップ数を取得すると共に、２つの対象モジュール３２Ｔの間の一致する行３２２の数（一致行数）を算出すればよい。この場合、比較手段２２は、取得または算出したモジュール名、ステップ数及び一致行数を使用して、比較表３４を作成すればよい。
【００４６】
図１及び図４を参照すると、比較手段２２は、作成した比較表３４を記憶又は出力した後、処理を終了する。より具体的には、比較手段２２は、作成した比較表３４を記憶装置３０に記憶してもよい。また、比較手段２２は、比較表３４を出力装置５０に出力してもよい。例えば、比較手段２２は、比較表３４をディスプレイ（出力装置５０）に表示してもよい。更に、比較手段２２は、比較表３４を記憶装置３０に記憶することなく、出力装置５０に出力してもよい。
【００４７】
図７及び図８を参照すると、図７に例示されたモジュール３２Ｘは、モジュール３２のうちの１つであり、図８に例示されたモジュール３２Ｙも、モジュール３２のうちの１つである。以下、上述したテキスト比較（図４のＳ４０２における処理）について、モジュール３２Ｘ及びモジュール３２Ｙを対象モジュール３２Ｔとして使用しつつ、より詳しく説明する。
【００４８】
図５、図７及び図８を参照すると、比較手段２２は、２つの対象モジュール３２Ｔの夫々に含まれる比較不要行を削除する（Ｓ５００）。
【００４９】
比較不要行は、対象モジュール３２Ｔにコードクローンが含まれているか否かの判断材料として使用できない行３２２である。より具体的には、比較不要行は、例えばコメント文や空文である。対象モジュール３２ＴがＪＡＶＡ（登録商標）で記述されている場合には、例えば"{"や"}"のみが記述されている行３２２も比較不要行として扱ってもよい。また、対象モジュール３２ＴがＣＯＢＯＬで記述されている場合には、例えば"THEN"や"ELSE"のみが記述されている行３２２も比較不要行として扱ってもよい。以上の説明から理解されるように、比較不要行として削除する行３２２は、使用されているプログラム言語等に応じて適切に決めればよい。
【００５０】
図７に示される例を参照すると、モジュール３２Ｘは、コメント文（例えば、１行目の"//import"）、空文（例えば、４行目の空文）や"{"等の比較不要行を含んでいる。図７及び図９を参照すると、比較手段２２は、モジュール３２Ｘの行３２２から、これらの比較不要行を削除して中間リスト３２ＸＭを作成する。図８に示される例を参照すると、モジュール３２Ｙは、同様に様々な比較不要行を含んでいる。図８及び図１０を参照すると、比較手段２２は、モジュール３２Ｙの行３２２から、これらの比較不要行を削除して中間リスト３２ＹＭを作成する。
【００５１】
図５、図７及び図８を参照すると、次に、比較手段２２は、比較不要行を削除した後の２つの対象モジュール３２Ｔの夫々に含まれる行３２２をソートする（Ｓ５０４）。ソート後の一群の行３２２を対象リスト３２Ｌという。即ち、対象リスト３２Ｌは、対象モジュール３２Ｔに含まれる行３２２を所定の順番にソートすることで得ることができる。特に、本実施の形態による対象リスト３２Ｌは、対象モジュール３２Ｔに含まれる行３２２を所定の順番にソートするだけでなく、対象モジュール３２Ｔに含まれる行３２２からテキスト比較を行う必要がない比較不要行を削除することで得ることができる。
【００５２】
図９に示される例を参照すると、比較手段２２は、比較不要行を削除した後のモジュール３２Ｘの行３２２をアルファベットの昇順にソートして対象リスト３２ＬＸを作成する。図１０に示される例を参照すると、比較手段２２は、比較不要行を削除した後のモジュール３２Ｙの行３２２を同様にソートして対象リスト３２ＬＹを作成する。
【００５３】
図５、図９及び図１０を参照すると、本実施の形態による比較手段２２は、行３２２に含まれる文をアルファベットの昇順にソートすることで対象リスト３２Ｌを作成する。即ち、比較手段２２は、文の左側にある空白文字やタブコード等の区切り文字の連続を無視してソートする（図９及び図１０参照）。但し、本発明は、これに限られない。例えば、比較手段２２は、文をアルファベットの降順にソートすることで対象リスト３２Ｌを作成してもよい。更に、比較手段２２は、ソートにおいて大文字と小文字とを区別してもよいし、同じものとして扱ってもよい。換言すれば、ソート後の行３２２は、行３２２に含まれる文から決定可能な所定の大小関係に従って並んでいればよい。
【００５４】
上述のように行３２２をソートする場合、処理時間を短縮するという観点からは、例えば所謂ヒープソートのような高速ソート法を使用することが好ましい。また、例えば、行３２２から３２ビットのハッシュ値を生成して、生成したハッシュ値を使用してソートしてもよい。このようにすることで、一般的に文字列比較よりも高速な数値比較によってソートできる。
【００５５】
以上の説明から理解されるように、比較不要行の削除（Ｓ５００）をソート（Ｓ５０４）の後に行っても、対象リスト３２Ｌを得ることができる。但し、処理時間を短縮するという観点からは、本実施の形態における順番通りに処理することが好ましい。
【００５６】
図５、図９及び図１０を参照すると、次に、比較手段２２は、行比較を行う（Ｓ５０６）。より具体的には、比較手段２２は、ソート後の対象モジュール３２Ｔの行３２２を１行ずつ比較する（Ｓ５０６）。
【００５７】
詳しくは、図６、図９及び図１０を参照すると、比較手段２２は、対象リスト３２Ｌの一方（比較対象リスト）の先頭行を、比較対象行として取得する（Ｓ６００）。また、比較手段２２は、対象リスト３２Ｌの他方（比較相手リスト）の先頭行を、比較相手行として取得する（Ｓ６１０）。
【００５８】
図６、図９及び図１０を参照すると、次に、比較手段２２は、比較対象行の内容（文字列からなる文）と比較相手行の内容（文字列からなる文）との間の文字列としての大小関係を判定し、比較対象行が比較相手行と一致するか否かを決定する（Ｓ６２０，Ｓ６３０）。このとき、本実施の形態による比較手段２２は、文の左側にある空白文字やタブコード等の区切り文字の連続を無視して大小関係を判定する。
【００５９】
詳しくは、比較手段２２は、比較対象行の内容が比較相手行の内容よりも小さい場合（Ｓ６２０においてＹＥＳの場合）、比較相手リストに比較対象行と一致する行３２２が含まれていないと決定する。一方、比較手段２２は、比較対象行全体が比較相手行全体と一致する場合、即ち、比較対象行の内容が比較相手行の内容と同じ場合（Ｓ６２０においてＮＯであり、Ｓ６３０においてＹＥＳの場合）、比較相手リストに比較対象行と一致する行３２２が含まれていると決定する。
【００６０】
比較手段２２は、上述のように比較相手リストに比較対象行と一致する行３２２が含まれているか否かを決定できた場合、比較対象リストの次行を使用して同様の比較を行う（Ｓ６５０，Ｓ６６０，Ｓ６２０，Ｓ６３０）。詳しくは、比較手段２２は、比較対象行が比較対象リストの最終行である場合（Ｓ６５０においてＹＥＳの場合）、行比較を終了する。一方、比較手段２２は、比較対象行が最終行でない場合（Ｓ６５０においてＮＯの場合）、比較対象リストの次行を比較対象行として取得し（Ｓ６６０）、比較相手行と比較する（Ｓ６２０，Ｓ６３０）。
【００６１】
一方、比較手段２２は、比較対象行の内容が比較相手行の内容よりも大きい場合（Ｓ６２０においてＮＯであり、且つ、Ｓ６３０においてＮＯの場合）、比較相手リストに比較対象行と一致する行３２２が含まれているか否かを決定できない。このため、比較手段２２は、比較対象行を比較相手リストの次行と比較する（Ｓ６７０，Ｓ６８０，Ｓ６２０，Ｓ６３０）。詳しくは、比較手段２２は、比較対象行が比較対象リストの最終行である場合（Ｓ６７０においてＹＥＳの場合）、行比較を終了する。この場合、比較手段２２は、比較対象リストの比較対象行以降の行３２２と一致する行３２２が比較相手リストに含まれていないと決定する。一方、比較手段２２は、比較相手行が最終行でない場合（Ｓ６７０においてＮＯの場合）、比較相手リストの次行を比較相手行として取得し（Ｓ６８０）、比較対象行と比較する（Ｓ６２０，Ｓ６３０）。
【００６２】
図９及び図１０に示される例を参照すると、比較手段２２は、まず、対象リスト３２ＬＸの１行目の行３２２を比較対象行として取得し、対象リスト３２ＬＹの１行目の行３２２を比較相手行として取得する。対象リスト３２ＬＸの１行目の行３２２は、対象リスト３２ＬＹの１行目の行３２２と一致する。次に、比較手段２２は、対象リスト３２ＬＸの２行目以降の行３２２を順次使用して、上述の行比較を行う。
【００６３】
例えば、対象リスト３２ＬＸの２行目の行３２２（"class Sample1{"が記述された行３２２）は、対象リスト３２ＬＹのいずれの行３２２とも一致しない。特に、この２行目の行３２２の内容は、文字列の大小関係において、対象リスト３２ＬＹの２行目の行３２２の内容（"class Sample2{"）よりも小さい。このため、この２行目と対象リスト３２ＬＹの２行目とを比較した段階で、この２行目が対象リスト３２ＬＹのいずれの行３２２とも一致しないことが分かる。
【００６４】
以上のように処理を行うと、最終的には、対象リスト３２ＬＸの行３２２のうちの８つが対象リスト３２ＬＹの行３２２のいずれかと一致することが分かる。換言すれば、対象リスト３２ＬＸと対象リスト３２ＬＹとを行比較した結果、一致行数が８であることが分かる。
【００６５】
図５、図９及び図１０を参照すると、以上に説明したように、比較手段２２は、対象モジュール３２Ｔから夫々得られる２つのソートされた対象リスト３２Ｌに対してテキスト比較を行う。換言すれば、本実施の形態によるテキスト比較方法は、対象モジュール３２Ｔから夫々得られる２つのソートされた対象リスト３２Ｌに対してテキスト比較を行う比較ステップを含んでいる。
【００６６】
以上の説明から理解されるように、比較手段２２は、比較対象行の内容が比較相手リストのＮ行目の内容よりも大きく且つＮ＋１行目の内容よりも小さい場合に、比較対象行についての行比較を終了できる。更に、比較手段２２は、比較相手リストの行３２２のうち既に行比較を行った行３２２を比較対象から外すことができる。このため、比較対象行を比較する回数（行３２２の比較回数）を低減でき、テキスト比較に要する処理時間を短縮できる。また、対象モジュール３２Ｔから比較不要行を削除しているため、テキスト比較に要する処理時間を更に短縮できる。
【００６７】
図９及び図１０を参照すると、一般的に、プログラムのソースコードは記述された順序に意味がある。ソースコードの記述順序をソースコードの意味を考慮することなく変更した場合、プログラムとしての同一性が失われるだけでなくプログラムとしての機能が失われる。従来のテキスト比較においては、このような技術常識に縛られ、モジュール３２の行３２２について、記述された順序を維持して比較する。しかしながら、従来のように行３２２をソートすることなく行比較を行う場合、比較相手リストが比較対象行と一致する行３２２を含んでいるか否かを判定するためには、比較対象リストの行３２２の夫々を、比較相手リストの全ての行３２２と比較する必要がある。
【００６８】
具体的には、図７及び図８に示される例を参照すると、従来のテキスト比較による行３２２の比較回数は、２９（モジュール３２Ｘの行数）×１６（モジュール３２Ｙの行数）＝４６４回である。
【００６９】
一方、本発明は、コードクローンを検出するという観点においては、モジュール３２がプログラムとしての同一性や機能を失っても問題がないという新たな着想に基づいている。このため、比較手段２２は、図５に示されるように行３２２をソート（Ｓ５０４）してから比較する（Ｓ５０６）。これにより、図９及び図１０に示される例を参照すると、行３２２の比較回数は２０回程度に減少する。この例から理解できるように、本発明によれば、行３２２の比較回数を飛躍的に低減でき、テキスト比較に要する処理時間を大きく短縮できる。
【００７０】
行比較の方法は、図６に例示した方法に限定されない。例えば、所謂バイナリサーチによって行比較を行ってもよい。但し、対象モジュール３２Ｔ（図２参照）がコードクローンを殆ど又は全く含んでいない場合には、本実施の形態による行比較を使用した方が処理時間を、より短縮できる。
【００７１】
図５、図９及び図１０を参照すると、比較手段２２は、行比較（Ｓ５０６）を行った後、比較結果を作成して（Ｓ５０８）、テキスト比較を終了する。
【００７２】
図９乃至図１０に示される例を参照すると、比較手段２２は、モジュール３２Ｘのモジュール名（Sample1）及び対象リスト３２ＬＸの行数（１４）と、モジュール３２Ｙのモジュール名（Sample2）及び対象リスト３２ＬＹの行数（９）とを取得する。比較手段２２は、これらの取得データと、行比較（Ｓ５０６）によって得た一致行数とから、図１１に例示された比較表３４の２行目の比較結果を作成する。
【００７３】
図１１を参照すると、図示されたステップ数は、対象リスト３２ＬＸ（比較対象リスト）又は対象リスト３２ＬＹ（比較相手リスト）のステップ数、即ち、比較不要行を削除した後のステップ数である。また、図示された類似度（図１１において５３％）の分母は、対象リスト３２ＬＸのステップ数＋対象リスト３２ＬＹのステップ数−一致行数、即ち、比較不要行を削除した後のステップ数の合計−一致行数である。
【００７４】
但し、比較結果は、本実施の形態に限られず、必要に応じて様々に作成すればよい。例えば、ステップ数は、比較不要行を削除する前のステップ数であってもよい。また、類似度の分母は、比較不要行を削除した後の比較対象リスト及び比較相手リストのうちの一方のステップ数であってもよいし、比較不要行を削除する前の比較対象リスト及び比較相手リストのうちの一方のステップ数であってもよい。
【００７５】
以上、２つの対象モジュール３２Ｔ（図７及び図８参照）全体を１つの比較単位として互いに比較する例について説明したが、本発明はこれに限られない。例えば、対象モジュール３２Ｔの処理単位毎にテキスト比較（図４のＳ４０２における処理）を行ってもよい。換言すれば、処理単位を比較単位として互いに比較してもよい。処理単位毎にテキスト比較を行うことで、処理単位の内部に含まれるコードクローンを、より適切に検出できる。
【００７６】
以下、処理単位を比較単位として互いに比較する例、即ち、前述したテキスト比較（図４のＳ４０２における処理）の変形例について、モジュール３２Ｘ（図７参照）及びモジュール３２Ｙ（図８参照）を対象モジュール３２Ｔとして使用しつつ、図１２のフローチャートに従って説明する。
【００７７】
図５及び図１２を参照すると、図１２に示すテキスト比較のフローチャートは、図５に示すテキスト比較のフローチャートの変形例である。以下、図１２に示すフローチャートに従って、図５に示すフローチャートとの相違点を中心に説明する。
【００７８】
図９、図１０及び図１２を参照すると、比較手段２２は、前述した処理（図５のＳ５００における処理）と同様に、２つの対象モジュール３２Ｔの夫々に含まれる比較不要行を削除する（Ｓ５００）。
【００７９】
次に、比較手段２２は、対象モジュール３２Ｔの行３２２の夫々を、対応する処理単位と対応付ける。
【００８０】
図７及び図１３を参照すると、モジュール３２Ｘは、main, getVisitorName, greetVisitorの３つの処理単位（メソッド）を含んでいる。また、モジュール３２Ｘは、これらのメソッドに含まれない３つの行３２２を含んでいる。これら３つの行３２２は、モジュール３２Ｘ全体（即ち、the whole moduleと名付けることができる処理単位）に含まれていると考えることができる。このため、比較手段２２は、比較不要行を削除した後の中間リスト３２ＸＭの行３２２の夫々を、main, getVisitorName, greetVisitor, the whole moduleの４つの処理単位のいずれかと対応付ける。
【００８１】
例えば、比較手段２２は、mainメソッドに対して、４行目乃至６行目の行３２２が対応していることを示すデータを作成する。比較手段２２は、他の３つの処理単位に対しても、同様のデータを作成する。図１４を参照すると、比較手段２２は、中間リスト３２ＹＭに対しても同様の対応付けを行う。
【００８２】
図９、図１０及び図１２を参照すると、次に、比較手段２２は、比較不要行を削除した後の２つの対象モジュール３２Ｔの夫々に含まれる行３２２をソートする（Ｓ５０４）。このとき、比較手段２２は、前述した処理（図５のＳ５０４における処理）と基本的に同様にソートを行う。但し、このとき、比較手段２２は、処理単位と行３２２との間の対応付けを維持する。
【００８３】
例えば、図９及び図１３に示される例を参照すると、比較手段２２は、mainメソッドと行３２２との間の対応付けを示すデータを、mainメソッドが対象リスト３２ＬＸの８行目、１２行目及び３行目に対応していることを示すように変更する。比較手段２２は、他の３つの処理単位についても、同様に対応付けを維持する。図１０及び図１４に示される例を参照すると、比較手段２２は、モジュール３２Ｙについても同様に対応付けを維持する。但し、処理単位と行３２２との間の対応付けを維持する具体的な方法は、上述した方法に限られない。
【００８４】
図９、図１０及び図１２を参照すると、次に、比較手段２２は、前述した処理（図６における処理）と同様に行比較を行う（Ｓ５０６）。
【００８５】
比較手段２２は、行比較（Ｓ５０６）を行った後、比較結果を作成する（Ｓ５０８）。このとき、比較手段２２は、対象モジュール３２Ｔの夫々に含まれる処理単位ごとに、テキスト比較の結果を作成する。
【００８６】
図１３乃至図１５に示される例を参照すると、比較手段２２は、モジュール３２Ｘに含まれる処理単位と、モジュール３２Ｙに含まれる処理単位の全ての組み合わせについて、類似度を算出するための分母となる処理単位の行数と、分子となる一致行数とを取得する。比較手段２２は、取得した処理単位の行数及び一致行数を使用して類似度を算出する。例えば、モジュール３２Ｙのmainメソッドの６つの行３２２については、行比較（Ｓ５０６）において、１つの行がモジュール３２Ｘのmainメソッドの３つの行３２２のうちのいずれかと一致し、３つの行がモジュール３２ＸのgetVisitorNameメソッドの５つの行３２２のうちの３つと夫々一致し、２つの行がモジュール３２ＸのgreetVisitorメソッドの３つの行３２２のうちの２つと夫々一致する。このため、図１５の比較表３４の１０番目の列３４４に示される比較結果が作成される。
【００８７】
図１１及び図１５を参照すると、図１５に示された比較表３４は、図１１に示された比較表３４に加えて、開始行番号（対象モジュール３２Ｔにおける処理単位の開始位置）を表示するための列３４４を有している。処理単位の開始位置は、対象モジュール３２Ｔから比較不要行を削除する前に取得することができる。このように処理単位の開始位置を示すことで、比較表３４を参照しつつコードクローンを目視により容易に発見できる。比較表３４は、開始行番号に加えて、必要に応じて様々なデータを表示してもよい。また、類似度の表示方法も様々に変更可能である。例えば、類似度が高い欄の背景色を目立つ色（例えば、赤）にすることで、類似度が高い欄に容易に着目できる。
【００８８】
図７及び図８を参照すると、対象モジュール３２Ｔの処理単位毎にテキスト比較する方法は、上述の方法に限定されない。例えば、対象モジュール３２Ｔの行３２２を対応する処理単位に分類し、処理単位の夫々を互いに独立にソートした後に、２つの処理単位の全ての組み合わせについてテキスト比較してもよい。但し、この場合、テキスト比較の回数が増加する。例えば、図７及び図８に示される例においては、８回（４×２）又は１５回（６Ｃ２）のテキスト比較が必要になる。テキスト比較に要する処理時間を短縮するという観点からは、特別なケースを除き、本実施の形態のようにテキスト比較することが好ましい。
【００８９】
以上の説明において、比較手段２２は、行３２２に含まれる文全体を互いに比較していた。但し、本発明はこれに限られない。
【００９０】
図６及び図１６を参照すると、図１６に示すフローチャートは、図６に示した行比較の変形例である。以下、図１６に示すフローチャートに従って、この変形例における行比較を説明する。
【００９１】
図６、図９、図１０及び図１６を参照すると、比較手段２２は、図１６に示すフローチャートにおいて、図６に示すフローチャートと基本的に同様に処理を行う。即ち、比較手段２２は、テキスト比較において、対象リスト３２Ｌの一方（比較対象リスト）に含まれる行３２２が対象リストの他方（比較相手リスト）に含まれる行３２２のいずれかと一致する一致行であるか又はいずれとも一致しない不一致行であるかを、比較対象リスト及び比較相手リストの並び順に沿って判定する。
【００９２】
但し、比較手段２２は、図１６に示すフローチャートにおいて、図６に示すフローチャートと少し異なる処理を行う。より具体的には、比較手段２２は、比較対象行の内容（文）が比較相手行の内容（文）よりも小さい場合（Ｓ６２０においてＹＥＳの場合）、比較対象行に含まれる項目を使用して比較する（Ｓ６４０）。
【００９３】
詳しくは、比較手段２２は、比較対象行の内容が比較相手リストにおける比較相手行（第１相手行）の直前の行３２２（第２相手行）の内容よりも大きい場合、比較対象行に含まれる項目を、第１相手行に含まれる項目と比較し、且つ、第２相手行に含まれる項目と比較する。本実施の形態において、比較対象行等に含まれる項目とは、文に含まれる文字列であり、空白文字やタブコード等の区切り文字によって互いから分離された文字列である。加えて、プログラム言語の文法によって定義された演算子、予約語等も、比較対象行等に含まれる項目である。
【００９４】
比較手段２２は、比較対象行に含まれる項目が並び順も含めて第１相手行に含まれる項目と夫々同一である場合、又は、並び順も含めて第２相手行に含まれる項目と夫々同一である場合、比較対象行が一致行であると判定する。一方、比較手段２２は、この条件が満たされない場合、比較対象行が不一致行であると判定する。このような判定によれば、比較対象行と第１相手行（又は第２相手行）との相違が、項目と項目との間の空白等の区切り文字の数のみである場合、比較対象行に含まれる項目を使用して比較することで比較対象行が一致行であると判定できる。換言すれば、比較手段２２は、比較対象行が第１相手行又は第２相手行と実質的に一致するか否かを判定できる。
【００９５】
図９、図１０及び図１７に示される例を参照すると、対象リスト３２ＬＸの２行目（比較対象行）の内容（"class Sample1{"）は、対象リスト３２ＬＹの２行目（比較相手行：第１相手行）の内容（"class Sample2{"）よりも小さく、且つ、対象リスト３２ＬＹの１行目（第２相手行）の内容（"BufferedReader br = new BufferedReader (new InputStreamReader(System.in));"）よりも大きい。このため、比較手段２２は、比較対象行から３つの項目（"class", "Sample1", "{"）を取り出す。同様に、比較手段２２は、第１相手行から３つの項目（"class", "Sample2", "{"）を取り出す。
【００９６】
次に、比較手段２２は、比較対象行から取り出した項目を、第１相手行から取り出した項目と夫々比較する。この例においては、"Sample1"と"Sample2"とが異なるため、比較手段２２は、比較対象行が第１相手行と一致しないと判定する。また、この例においては、比較対象行から取り出した１番目の項目（"class"）と、第２相手行から取り出した１番目の項目（" BufferedReader"）とが異なるため、比較手段２２は、比較対象行が第２相手行とも一致しないと判定する。このため、比較手段２２は、比較対象行が不一致行であると判定する。
【００９７】
図１７に示される例を参照すると、比較手段２２は、項目をアルファベットのみからなる文字列（英字項目）と、数字のみからなる文字列（数字項目）とに更に分解して比較してもよい。例えば、"Sample1"を"Sample"と"1"とに分解して比較してもよい。この場合、比較手段２２は、比較対象行と第１相手行（又は第２相手行）との相違が数字項目の相違のみである場合、比較対象行が一致行であると判定してもよい。このように判定することで、例えば、変数名の末尾の数字のみが異なる場合に、実質的に一致すると判定できる。更に、比較手段２２は、"1st"と"first"のように意味的に同じ文字列を一致すると判定してもよい。以上のように、形式的な一致だけでなく実質的な一致／不一致を判定することで、コードクローンを、より適切に検出できる。
【００９８】
図９、図１０及び図１６を参照すると、以上に説明したように、本変形例による比較手段２２は、テキスト比較において、対象リスト３２Ｌの一方（比較対象リスト）に含まれる行３２２が不一致行である場合であって且つ所定の条件が満たされるとき、不一致行に含まれる項目を使用して、対象リストの他方（比較相手リスト）に含まれる行３２２のいずれかと一致しているか不一致であるかを更に判定する。また、この所定の条件は、比較相手リストに第１相手行と第２相手行とが含まれている場合であって、且つ、不一致行と第１相手行と第２相手行とを所定の順番にソートすると、不一致行が第１相手行と第２相手行との間に位置する場合に満足される。
【００９９】
不一致行に含まれる項目を、第１相手行に含まれる項目や第２相手行に含まれる項目と比較する場合、比較対象リストや比較相手リストをソート（図５のＳ５０４における処理）する前に、行３２２の夫々から項目を取り出して、１以上の項目からなる１次元の項目リストを作成してもよい。この場合、この項目リストからなる配列をソートすることによって行３２２をソートしてもよい。
【０１００】
本実施の形態によるテキスト比較装置１０は、既に述べた変形例に加えて、様々に変形することが可能である。以下、テキスト比較装置１０の変形例について説明する。
【０１０１】
図１８に示されるように、本実施の形態の第１の変形例によるテキスト比較システム１００Ａは、テキスト比較装置１０Ａと、ファイルサーバ６０Ａと、記憶装置（記憶手段）７０Ａとから構成されている。
【０１０２】
記憶装置７０Ａは、例えば磁気ディスク装置であり、ファイルサーバ６０Ａと通信可能に接続されている。記憶装置７０Ａは、ファイルサーバ６０Ａからの指示に従ってファイルの読込、書込等を行う。本実施の形態による記憶装置７０Ａには、本実施の形態（図１参照）と同様に、２以上のモジュール３２からなるモジュール群３２Ｇが記憶されている。また、記憶装置７０Ａは、１以上の比較表３４を記憶可能である。
【０１０３】
テキスト比較装置１０Ａは、装置本体２０Ａと、入力装置４０と、出力装置５０とを備えている。装置本体２０Ａは、比較手段２２と、主記憶装置（記憶手段）３０Ａとを備えている。主記憶装置３０Ａには、例えば、モジュール３２と、比較表３４とを記憶可能である。テキスト比較装置１０Ａは、通信回線８０Ａを経由して、ファイルサーバ６０Ａと通信可能に接続されている。通信回線８０Ａは、例えばＬＡＮ（Local Area Network）であってもよいし、インターネットであってもよい。
【０１０４】
図１８から理解されるように、テキスト比較装置１０Ａは、ファイルサーバ６０Ａを経由して、記憶装置７０Ａと接続されている。このため、テキスト比較装置１０Ａは、記憶装置７０Ａからデータ取得可能であり、記憶装置７０Ａにデータ書込可能である。より具体的には、テキスト比較装置１０Ａは、記憶装置７０Ａから主記憶装置３０Ａにモジュール３２を読み込むことができる。換言すれば、テキスト比較装置１０Ａは、記憶装置７０Ａからモジュール３２を取得できる。テキスト比較装置１０Ａは、取得した２つのモジュール３２を、テキスト比較装置１０（図１参照）と同様に比較できる。更に、テキスト比較装置１０Ａは、主記憶装置３０Ａに作成した比較表３４を、記憶装置７０Ａに書き込むことができる。
【０１０５】
以上の説明から理解されるように、第１の変形例によるテキスト比較システム１００Ａによれば、テキスト比較装置１０Ａは、ファイルサーバ６０Ａの記憶装置７０Ａに記憶された多数のモジュール３２を順次取得してテキスト比較できる。また、複数のテキスト比較装置１０Ａを使用することで、テキスト比較に要する処理時間を分散させることができる。
【０１０６】
図１９に示されるように、本実施の形態の第２の変形例によるテキスト比較システム１００Ｂは、クライアント装置１０Ｂと、アプリケーションサーバ（テキスト比較装置）６０Ｂと、記憶装置（記憶手段）７０Ｂとから構成されている。
【０１０７】
テキスト比較装置６０Ｂは、比較手段２２と、主記憶装置（記憶手段）３０Ｂとを備えている。記憶装置７０Ｂは、例えば磁気ディスク装置であり、テキスト比較装置６０Ｂと通信可能に接続されている。記憶装置７０Ｂは、テキスト比較装置６０Ｂからの指示に従ってファイルの読込、書込等を行う。主記憶装置３０Ｂ及び記憶装置７０Ｂの夫々には、例えば、モジュール３２と、比較表３４とを記憶可能である。
【０１０８】
クライアント装置１０Ｂは、装置本体２０Ｂと、入力装置４０と、出力装置５０と、記憶装置（記憶手段）３０とを備えている。装置本体２０Ｂは、ファイル送受信手段２６（ファイル送受信プログラム）を備えている。記憶装置３０は、２以上のモジュール３２からなるモジュール群３２Ｇを記憶しており、且つ、１以上の比較表３４を記憶可能である。クライアント装置１０Ｂは、通信回線８０Ｂを経由して、テキスト比較装置６０Ｂと通信可能に接続されている。通信回線８０Ｂは、例えばＬＡＮであってもよいし、インターネットであってもよい。
【０１０９】
図１９から理解されるように、テキスト比較装置６０Ｂは、クライアント装置１０Ｂを経由して、記憶装置３０と接続されている。このため、テキスト比較装置６０Ｂは、記憶装置３０からデータ取得可能であり、記憶装置３０にデータ書込可能である。より具体的には、クライアント装置１０Ｂのファイル送受信手段２６は、記憶装置３０からモジュール３２を読み込んで、テキスト比較装置６０Ｂに送信できる。テキスト比較装置６０Ｂは、クライアント装置１０Ｂから受信した２つのモジュール３２を、テキスト比較装置１０（図１参照）と同様に比較できる。テキスト比較装置６０Ｂは、作成した比較表３４を、クライアント装置１０Ｂのファイル送受信手段２６に送信できる。ファイル送受信手段２６は、テキスト比較装置６０Ｂから受信した比較表３４を、記憶装置３０に記憶したり、出力装置５０に出力したりできる。
【０１１０】
テキスト比較装置６０Ｂは、ファイル送受信手段２６から受信したモジュール３２を、一時的に主記憶装置３０Ｂ又は記憶装置７０Ｂに記憶してもよい。また、テキスト比較装置６０Ｂは、作成した比較表３４を一時的に主記憶装置３０Ｂ又は記憶装置７０Ｂに記憶してもよい。
【０１１１】
以上の説明から理解されるように、第２の変形例によるテキスト比較システム１００Ｂによれば、複数のクライアント装置１０Ｂが、テキスト比較装置６０Ｂを共同利用できる。
【０１１２】
本発明は、更に様々に変形可能であり、応用可能である。例えば、上述した第１の変形例によるテキスト比較装置１０Ａ（図１８参照）と第２の変形例によるテキスト比較装置６０Ｂ（図１９参照）とを組み合わせることもできる。
【符号の説明】
【０１１３】
１０，１０Ａ                テキスト比較装置
１０Ｂ                      クライアント装置
２０，２０Ａ，２０Ｂ        装置本体
２２                        比較手段
２６                        ファイル送受信手段
３０                        記憶装置（記憶手段）
３０Ａ，３０Ｂ              主記憶装置（記憶手段）
３２Ｇ                      モジュール群
３２                        モジュール（テキストファイル）
３２Ｔ                      対象モジュール
３２Ｘ，３２Ｙ              モジュール
３２ＸＭ，３２ＹＭ          中間リスト
３２Ｌ，３２ＬＸ，３２ＬＹ  対象リスト
３２２                      行
３４                        比較表
３４２                      行
３４４                      列
４０                        入力装置
５０                        出力装置
６０Ａ                      ファイルサーバ
６０Ｂ                      テキスト比較装置（アプリケーションサーバ）
７０Ａ，７０Ｂ              記憶装置（記憶手段）
８０Ａ，８０Ｂ              通信回線
１００Ａ，１００Ｂ          テキスト比較システム
【要約】
【課題】１以上の行を夫々含む２つのモジュール（テキストファイル）を対象モジュールとして比較するテキスト比較装置であって、対象モジュールを効率よく比較できるテキスト比較装置を提供すること。
【解決手段】テキスト比較装置は、１以上の行を夫々含む２つの対象モジュールを比較可能である。テキスト比較装置は、比較手段を備えており、且つ、記憶手段からデータ取得可能である。記憶手段には、対象モジュールが記憶されている。記憶手段に記憶された対象モジュールに含まれる行を所定の順番にソートすることで、対象リストを得ることができる。比較手段は、対象モジュールから夫々得られる２つの対象リストに対してテキスト比較を行う。
【選択図】図５【図１】
0005846658.tif 000002
【図２】
0005846658.tif 000003
【図３】
0005846658.tif 000004
【図４】
0005846658.tif 000005
【図５】
0005846658.tif 000006
【図６】
0005846658.tif 000007
【図７】
0005846658.tif 000008
【図８】
0005846658.tif 000009
【図９】
0005846658.tif 000010
【図１０】
0005846658.tif 000011
【図１１】
0005846658.tif 000012
【図１２】
0005846658.tif 000013
【図１３】
0005846658.tif 000014
【図１４】
0005846658.tif 000015
【図１５】
0005846658.tif 000016
【図１６】
0005846658.tif 000017
【図１７】
0005846658.tif 000018
【図１８】
0005846658.tif 000019
【図１９】
0005846658.tif 000020