(57)【要約】【課題】ソースコードについて、共通化可能範囲を拡大し、使い勝手・保守性がよく、汎用性があり、効率よく共通化することができるようにする。【解決手段】各ソースコードについて、生成された共通コードと検出された差分とからなる埋め込みコード情報を生成し、各ソースコードについて、取得された位置情報から部分コードを削除させ、削除した位置に生成された埋め込みコードを埋め込んで、ソースコードの構造上の形態を実質的に変えることなく埋め込み済みのソースコードを生成させる。【選択図】図２
2015184735.tif 000002
【特許請求の範囲】
【請求項１】
ソースコードを解析して、ソースコードに含まれる互いに類似する部分コードを検出し、そのソースコード上の位置情報を取得する類似コード検出手段と、
前記検出した互いに類似する複数の部分コードに基づいて、共通コードを生成するとともに、当該共通コードと前記類似するそれぞれの各部分コードとの差分情報を生成する共通コード生成手段と、
前記ソースコード内の前記類似する各部分コードを、その前記位置情報に基づいて、前記共通コードおよび前記部分コードの差分情報を挿入する挿入コードに差し替える部分コード差替手段と、
を備えることを特徴とするソースコード生成装置。
【請求項２】
請求項１に記載されたソースコード生成装置において、
前記類似する部分コードは、プログラム文法上同等とみなされるコードであるコードクローンであり、
前記差分情報は、前記部分コード内の記述を他の記述に置き換えるための情報であること
を特徴とするソースコード生成装置。
【請求項３】
請求項２に記載されたソースコード生成装置において、
前記類似コード検出手段は、プログラム文法に基づいて、前記コードクローンとして類似する部分コードを抽出し、抽出した複数の部分コードの比較または基準との比較により、その部分コードの差し替え対象としての一部除外または分割による粒度調整を行うこと
を特徴とするソースコード生成装置。
【請求項４】
請求項１乃至３のいずれかに記載されたソースコード生成装置において、
前記差し替えられた類似する部分コードと、その前記位置情報と、前記共通コードと、前記差分情報とを含む保守用情報を生成する保守用情報生成手段を備えたこと
を特徴とするソースコード生成装置。
【請求項５】
類似コード検出手段が、ソースコードを解析して、ソースコードに含まれる互いに類似する部分コードを検出し、そのソースコード状の位置情報を取得する類似コード検出ステップと、
共通コード生成手段が、前記検出した互いに類似する複数の部分コードに基づいて、共通コードを生成するとともに、当該共通コードと前記類似するそれぞれの各部分コードとの差分情報を生成する共通コード生成ステップと、
部分コード差替手段が、前記ソースコード内の前記類似する各部分コードを、その前記位置情報に基づいて、前記共通コードおよび前記部分コードの差分情報を挿入する挿入コードに差し替える部分コード差替ステップと、
を含むことを特徴とするソースコード生成方法。
【請求項６】
請求項５に記載されたソースコード生成方法において、
前記類似する部分コードは、プログラム文法上同等とみなされるコードであるコードクローンであり、
前記差分情報は、前記部分コード内の記述を他の記述に置き換えるための情報である
ことを特徴とするソースコード生成方法。
【請求項７】
請求項６に記載されたソースコード生成方法において、
前記類似コード検出ステップでは、プログラム文法に基づいて、前記コードクローンとして類似する部分コードを抽出し、抽出した複数の部分コードの比較または基準との比較により、その部分コードの差し替え対象としての一部除外または分割による粒度調整を行うこと
を特徴とするソースコード生成方法。
【請求項８】
請求項５乃至７のいずれかに記載されたソースコード生成方法において生成されたソースコードに加えて、
前記差し替えられた類似する部分コードと、その前記位置情報と、前記共通コードと、前記差分情報とを含んで生成された保守用情報を提供する保守用情報提供ステップを、
含むことを特徴とするソースコード提供方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソースコード生成および提供装置、並びにソースコード生成および提供方法に関する。
【背景技術】
【０００２】
システムの保守作業では、長年に亘るソースコードの修正により、設計書の不備により、あるいはデータ項目やロジックの仕様変更によりコード（ロジックやデータ項目定義等のコード）の重複が生じ、ソースコードの可読性が低下するという問題があり、保守作業の効率が落ちるということがあった。このために、手作業にてリファクタリング（重複コードの共通化によるソースコード規模の縮小）作業を行い、保守性の回復がなされて来た。
【０００３】
特許文献１には、スクリプトによるソースコード自動生成の方法が提案され、生成結果としての同じコードが存在する場合に、重複部分を共通化することが記載されている。
【０００４】
特許文献２には、重複コードの検出方法として既存のコードクローン検出ツールを利用し、ソースファイルからコードクローンを検出し重複部分の共通化することが記載されている。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開第２００７−３０４９９８号公報
【特許文献２】特開第２００９−１７６０６４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
手作業による重複コードの共通化を図る方法にあっては、品質が低く作業コストが高くなるという問題があった。加えて、手作業では、変数名が異なるなど完全一致でない、類似のソースコードを検出する事が難しく、重複コードの共通化が効果的に行うことができないという問題があった。
【０００７】
また、特許文献１の技術では、ソースコード生成過程で重複コードを共通化するという手段であると、生成中のソースコードのみに影響する重複コードを共通化するということが出来るが、コードの共通化時にすでに生成完了したソースコードにまたがる重複コードを共通化するということができないため、複数のプログラム間に跨って存在する重複コードを共通化することができないという問題があった。
【０００８】
また、特許文献２の技術では、変数のスコープが局所化できる構造化言語に対して有効な技術であり、COBOL85のような変数が大域変数(変数の影響範囲が常に変数宣言を行ったプログラム全体に及ぶ)となる、初期の構造化プログラム言語の場合、重複コードに含まれる変数を関数のパラメタとして生成することはソースコードが冗長となり、ソースコードの可読性が低下してしまうといった問題があった。加えて、特許文献２の技術では、変数宣言からなるデータ構造の定義はリファクタリング(コード共通化)の対象でない。
【０００９】
また、コードの共通化後にソースコードを修正あるいは保守する場合は、コード共通化によるソースコードの変更を考慮する必要があるため、コード共通化後の保守性が向上しにくいという問題があった。
【００１０】
本発明は、初期の構造化プログラム言語で作成されたソースコードに対して、リファクタリングされたソースコードを効率よく生成することが出来るようにすることを目的とする。
【００１１】
また、リファクタリング後の保守作業を容易にするための保守用情報を生成、提供することを目的とする。
【課題を解決するための手段】
【００１２】
本発明は、ソースコードを解析して、ソースコードに含まれる互いに類似する部分コードを検出し、そのソースコード上の位置情報を取得する類似コード検出手段と、
前記検出した互いに類似する複数の部分コードに基づいて、共通コードを生成するとともに、当該共通コードと前記類似するそれぞれの各部分コードとの差分情報を生成する共通コード生成手段と、
前記ソースコード内の前記類似する各部分コードを、その前記位置情報に基づいて、前記共通コードおよび前記部分コードの差分情報を挿入する挿入コードに差し替える部分コード差替手段と、
を備えることを特徴とするソースコード生成装置を提供する。
【００１３】
本発明は、上述されたソースコード生成装置において、
前記類似する部分コードは、プログラム文法上同等とみなされるコードであるコードクローンであり、
前記差分情報は、前記部分コード内の記述を他の記述に置き換えるための情報であること
を特徴とするソースコード生成装置を提供する。
【００１４】
本発明は、上述されたソースコード生成装置において、
前記類似コード検出手段は、プログラム文法に基づいて、前記コードクローンとして類似する部分コードを抽出し、抽出した複数の部分コードの比較または基準との比較により、その部分コードの差し替え対象としての一部除外または分割による粒度調整を行うこと
を特徴とするソースコード生成装置を提供する。
【００１５】
本発明は、上述されたソースコード生成装置において、
前記差し替えられた類似する部分コードと、その前記位置情報と、前記共通コードと、前記差分情報とを含む保守用情報を生成する保守用情報生成手段を備えたこと
を特徴とするソースコード生成装置を提供する。
【００１６】
また、本発明は、類似コード検出手段が、ソースコードを解析して、ソースコードに含まれる互いに類似する部分コードを検出し、そのソースコード状の位置情報を取得する類似コード検出ステップと、
共通コード生成手段が、前記検出した互いに類似する複数の部分コードに基づいて、共通コードを生成するとともに、当該共通コードと前記類似するそれぞれの各部分コードとの差分情報を生成する共通コード生成ステップと、
部分コード差替手段が、前記ソースコード内の前記類似する各部分コードを、その前記位置情報に基づいて、前記共通コードおよび前記部分コードの差分情報を挿入する挿入コードに差し替える部分コード差替ステップと、
を含むことを特徴とするソースコード生成方法を提供する。
【００１７】
本発明は、上述されたソースコード生成方法において、
前記類似する部分コードは、プログラム文法上同等とみなされるコードであるコードクローンであり、
前記差分情報は、前記部分コード内の記述を他の記述に置き換えるための情報である
ことを特徴とするソースコード生成方法を提供する。
【００１８】
本発明は、上述されたソースコード生成方法において、
前記類似コード検出ステップでは、プログラム文法に基づいて、前記コードクローンとして類似する部分コードを抽出し、抽出した複数の部分コードの比較または基準との比較により、その部分コードの差し替え対象としての一部除外または分割による粒度調整を行うこと
を特徴とするソースコード生成方法を提供する。
【００１９】
本発明は、上述されたソースコード生成方法において生成されたソースコードに加えて、
前記差し替えられた類似する部分コードと、その前記位置情報と、前記共通コードと、前記差分情報とを含んで生成された保守用情報を提供する保守用情報提供ステップを、
さらに含むことを特徴とするソースコード提供方法を提供する。
【発明の効果】
【００２０】
本発明は、従来のリファクタリング装置と異なり、リファクタリング対象を関数単位だけではなく、変数宣言まで拡大しているため、より多くの重複コードを共通化し、また保守性をより向上させることができる。
【００２１】
また本発明は、初期の構造化言語で作成されたソースコードに好適なリファクタリング装置であり、初期の構造化言語の利用が多いとされる保守期間が長いシステムへ適用することで多大な効果を発揮し得る。
【図面の簡単な説明】
【００２２】
【図１】本発明実施例の形態をブロックで示す図。
【図２】二つの類似部分コードの共通化を行う手順と、その自動化を行うステップを示す図。
【図３】手順の実施例を示す図。
【図４】類似コードの抽出の内容の詳細を示す図。
【図５】共通コードの生成の内容の詳細を示す図。
【図６】共通コード埋込命令への差し替えの内容の詳細および保守用資料の生成の内容を示す図。
【図７】ファイル１、ファイル２、ファイル３の例を示す図。
【図８】類似コードの抽出例を示す図。
【図９】類似コードの抽出例を示す図。
【図１０】類似部分コード情報を示す図。
【図１１】共通コードの生成を示す図。
【図１２】共通コード埋め込み命令への差し替えを示す図。
【図１３】ファイル１やファイル２について埋め込み命令が挿入されたことを示す図。
【図１４】リファクタリング判断基準情報例を示す図。
【図１５】リファクタリング判断例を示す図。
【発明を実施するための形態】
【００２３】
以下、本発明の形態を、図面を用いて説明する。
【実施例】
【００２４】
図１は、本発明の実施例であるソースコード生成装置１００をブロックで示す。
【００２５】
図１において、ソースコード生成装置１００は、処理装置１０１が持つソースコード１０２を参照する。このソースコード１０２は、変数が大域変数である初期の構造化プログラム言語で記述されているものとする。
【００２６】
ソースコード生成装置１００は、コードクローン検出手段１、コードクローン情報取得手段２、共通化単位設定およびコードクローン情報調整手段３、コードクローン情報取得手段４、部分コード間差分情報生成手段６、共通化コード生成手段７、埋め込みコード情報取得手段８、調整ソースコード生成手段９、およびデータベース１０から構成される。これらの手段は、通信回線１１で互いに接続され、情報の授受がなされ得る。ソースコード提供装置１１０は、ソースコード生成装置１００と保守用情報生成手段１０５とから構成される。保守用情報生成手段１０５はソースコード生成装置１００と通信回線１３で互いに接続され、情報の授受がなされ得る。外部の処理装置１０１とソースコード提供装置１１０とは通常の通信回路１２を介して接続される。他の手段によって接続されるようにしてもよい。通信回路１２によって生成された情報の相互授受がなされる。
【００２７】
コードクローンについて使用する場合、類似部分コードをコードクローンに含まれる下位概念とされる場合があるが、ここではコードクローン（あるいはクローン）を二つの部分コードが類似した類似部分コードの関係にある場合を指して使用する。部分コードが同一の場合には、同一部分コードとして示す。
【００２８】
コードクローン検出手段１は、ソースコード解析およびコードクローンとして把握される部分コードである類似部分コードおよび同一部分コードの検出を行う。部分コードは、通常互いに同一の同一部分コード、互いに類似の類似部分コードからなり、部分コードとしての識別がなされる。同一部分コードに特定しての共通化処理では共通化範囲に限界がある、本実施例では類似部分コードについても共通化処理を行う。このように類似部分コードについてについて主に説明するが、同一部分コードの共通化処理を除外するものではない。コードクローンの検出法については各種の検出方法が報告されていて、各種の検出方法が採用可能である。
【００２９】
コードクローン検出手段１は、単一または複数のソースコードを解析して、当該ソースコードに含まれる少なくとも二つの部分コードについて、部分コードを構成するトークン種別の並びが同等であることを条件として、類似部分コードをコードクローンとして検出する。トークンとは、プログラミング言語の文法上、ソースコードを構成する最小単位の文字列である。
【００３０】
コードクローン情報取得手段２は、コードクローン検出手段１で検出された部分コードのソースコード上の位置情報を取得する。位置情報は、領域情報と言われることがある。
【００３１】
コードクローン情報調整手段３は、共通化単位設定を設定し、コードクローン情報取得手段２で取得された部分コードの位置情報を読み込み、任意の粒度（構造的なまとまり）を持つ部分コードを抽出する。粒度は、コードの共通化を行う単位として設定する。粒度は演算処理記述やデータ構造記述など、複数の粒度を設定してよい。粒度は、ソースコード生成装置１００が生成するソースコードの理解容易性や保守性から定めればよい。
【００３２】
コードクローン情報取得手段４は、コードクローン情報調整手段３で、共通化単位が設定され、抽出された部分コードのソースコード上の位置情報を取得する。コードクローン情報取得手段２で取得した部分コードの位置情報は破棄する。
【００３３】
部分コード間差分情報生成手段６は、部分コード間の差分を検出する。差分は類似コードの関係をもつ部分コード間で検出する。検出された差分に基づいて部分コード間差分情報を取得する。
【００３４】
共通コード生成手段７は、コードクローンについて予め定めた単位、典型的には粒度に基づいて予め定めたルールに従って共通コードを生成する。共通コードの生成に部分コード間差分情報を利用しないルールを定めてもよい。生成された共通コードと、類似コードの関係にある部分コードとの差分を検出する。検出された差分情報を、部分コード間差分情報として取得する。部分コード間差分情報生成手段７で取得した部分コード間差分情報は破棄する。
【００３５】
埋め込みコード情報取得手段８は、部分コード間差分情報から差分情報付き類似コード情報を生成する。
【００３６】
調整ソースコード生成手段９は、上述した処理結果に基づいて、各ソースコードから当該部分コードを削除させる命令、および埋め込み済みソースコードを形成させる共通コード挿入指示命令を生成する。
【００３７】
削除させる命令が、取得された部分コードの位置情報に関連して当該部分コードを削除させる命令であり、埋め込み済みソースコードを生成させる共通コード挿入指示命令が、削除した位置に、埋め込みコード情報から生成された共通化コードと生成された差分情報とを埋め込んで、ソースコードの構造上の形態を実質的に変えることなく埋め込み済みソースコードを生成させる命令である。埋め込み済みソースコードは、ソースコードとなる。
【００３８】
このようにすることで、外部の処理装置１０１に提供され、使用されることになる埋め込み済みソースコードが生成される。このように、生成されたスリム化ソースコード１０３は、処理装置１０１での処理に用いられることになる。
【００３９】
ソースコード提供装置１１０は、スリム化ソースコード１０３、および生成されたソースコード保守用情報生成手段１０５で生成された保守用情報１０４を処理装置１０１に提供する。これらに二つの提供によって顧客は、ソースコードが使い易いものとなる。
【００４０】
図２は、二つの類似部分コードの共通化処理を行う手順と、その自動化を行う手順を含む手順を示す。
【００４１】
図２において、ステップは大きく分けて、
１．類似コードの抽出ステップ(すなわち、コードクローン抽出ステップ)
２．共通コードの生成ステップ
３．共通コード埋込命令への差し替えステップ
４．保守用資料の生成ステップ
５．生成情報提供ステップ
からなり、これらのステップによって、ソースコードおよび関連の保守用情報が利用者である顧客の端末に提供される。
１．類似コードの抽出ステップでは、ソースコードから類似部分コードを抽出し、それら類似部分コードの情報を取得する。
１−１ 類似部分コードを以下の条件で抽出する。
１）共通化を行う単位。共通化を行う単位として抽出単位は予め定めた任意の粒度であること
２）プログラム文法上同等とみなされる構文（コードクローン）であること
１−２ 類似部分コードの情報として、以下の情報を取得する。
・ 類似部分コードの、ソースコード上に占める位置情報
２．共通コードの生成ステップでは、抽出された類似部分コードから共通コードファイルを生成する。
２−１ 共通コードを生成する。共通コードは、関連する類似部分コードに対する差分が少なくなるように共通コードを生成すると、ソースコードファイル全体の保守性が向上する。
２−２ 生成した共通コードと、関連する類似部分コードとの差分を算出する。
２−３ 生成した共通コードを共通コードファイルとして生成する。
３．共通コード埋込命令への差し替えステップでは、共通コード埋込命令への差し替えを行う。ソースコード内の各類似部分コードを削除し、削除した位置（１−２a）に、「共通コードと類似部分コードとの差分を補完しながら、共通コードファイルの内容を挿入する」命令を挿入する。すなわち共通コード挿入指示命令を挿入する。このようにして削除命令および共通コード挿入指示命令を持つスリム化ソースコードが生成される。
４．保守用資料の生成ステップでは、作成した共通コードや修正したソースコードの関連を、類似コードごとにまとめた一覧をファイルとして出力する。スリム化ソースコードと共に保守用情報が顧客に提供される。
【００４２】
図３は、ソースコード提供手順の実施例を示す。
【００４３】
図３において、手順は、上述したように、１．類似部分コードの抽出およびコード調整、２．共通化コードの生成、３．共通コード挿入による差し替え、４．保守用資料の生成、５．生成情報の提供からなる。
【００４４】
図３において、類似部分コードの抽出で、ソースコード３１（図１でソースコード１０２）が用意され、準備されたソースコード３１が参照されて、静的解析３２(静的解析は、従来から知られている)がなされ、類似部分コードを含んだコードクローンの検出がなされる。このように切り出され、検出された類似部分コードを含んだコードクローン情報３３が取得される。コードクローン情報３３が参照され、コードクローンについての調整、例えば粒度調整３４がなされる。リファクタリング粒度情報３９が参照され、コードクローン粒度調整３４がなされたコードクローンについてコードクローン情報３５が取得される。
【００４５】
コードクローンは、リファクタリング調整基準に従ってリファクタリング候補となり、ファイル化される。
【００４６】
リファクタリング候補コードについて、リファクタリング判断基準情報３６が参照されて、リファクタリング判断３７がなされ、リファクタリング対象コードクローン情報３８が生成される。
【００４７】
２．共通コードの生成に移行する。
【００４８】
このステップで、リファクタリング対象コードクローン間差分の検出４０がなされる。検出された差分から差分情報が生成される。差分情報が参照されて差分情報付きコードクローン情報４１が取得される。差分情報付きコードクローン情報４１が参照されて共通コード生成４２がなされる。生成された共通コードおよび差分情報から共通コード４３および共通化処理のための共通コード情報４４が取得される。
３．共通コード埋込命令への差し替えに移行する。
【００４９】
移行のため、削除命令、共通コード挿入指示命令が生成され、挿入すなわち埋込４５がなされる。この埋込命令を持つ埋め込みソースコード４６が生成され、取得される。これによって埋め込みソースコードは、保守前のソースコードの構造上の形態を実質的に変えられることなく、保守前のソースコードの規模に比べて大きさが縮小される。
４．保守用資料の生成および５．生成情報の提供に移行する。
【００５０】
このステップで、ソースコード処理方法情報を含む保守用情報の生成がなされ、生成された、ソースコード情報および保守用情報の提供がなされる。
【００５１】
このように、処理装置に実行させる単一または複数のソースプログラムの複数のソースコードを解析して、当該ソースコードに含まれる少なくとも二つの部分コードについて共通化を行う予め定めた単位であること、およびプログラム文法上同等とみなされる構文であることを条件として、類似部分コードが検出され、
複数のソースコードのコードクローン間の差分を検出して各ソースコードについて差分情報が生成され、
各ソースコードについて、生成された共通コードと生成された差分情報とからなる埋め込みコード情報が生成され、
取得された位置情報に関連して当該部分コードを削除させる命令、および埋め込み済みソースコードを生成させ、削除した位置に、埋め込みコード情報から生成された共通コードと生成された差分情報とを埋め込んで、ソースコードの構造上の形態を実質的に変えることなく埋め込み済みソースコードを形成させる命令が生成され、
複数のプログラムの各調整部分コードと、生成された共通コードと検出された差分とからなる埋め込みコード情報の関係の保守用情報が生成され、
ソースコードの構造上の形態が実質的に変わることなく、参照されたソースコードに比して各規模が縮小されたソースコードおよび該埋め込みコード情報の関係の保守用情報を提供する。これによって顧客は、上述のようにして生成された共通コードを持つソースコードを用いての各種処理を行い得ることになる。
【００５２】
図４−図６は、図３に示した内容の詳細を示す。図３で説明した事項は必要以上に繰り返さないことにする。
【００５３】
図４は、１．類似コードの抽出の内容の詳細を示す。図４において、類似部分コード抽出により、コードクローンを抽出する。ソースコードＡからソースコードＡ内の一方のコードが部分コード（１）３２Ａとして抽出され、一方の部分コード（１）３２Ｂとなる。また、ソースコードＢからソースコードＢ内の類似コード（１）３２Ｃが抽出され、類似部分コード（１）３２Ｄとなる。一方の部分コード（１）３２Ｂと類似部分コード（１）３２Ｄの２つの部分コードは、類似の関係にあり、コードクローンの関係にある。
【００５４】
このように静的解析がなされ、複数のソースコード３１についてのコードクローン検出３２がなされる。
【００５５】
コードの類似性を判定する方法は、各種知られており、公知の手法によるコード類似判定方法が採用可能である。
【００５６】
一方の部分コード（１）３２Ｂおよび類似部分コード（１）３２Ｄから類似部分コード情報３３が取得される。また、類似部分コード情報として、類似コードの、ソースコード上に占める位置が位置情報として取得される。
【００５７】
次のステップで、リファクタリング粒度情報３９が参照され、類似部分コードを共通化する共通コードの単位に調整するコードクローン粒度調整３４がなされる。共通コードの単位をコード共通化実行単位に調整したコードクローン情報３５を取得する。コードクローンを共通コードの粒度に調整する。すなわち、リファクタリングスル粒度に調整する。
【００５８】
調整とは、類似部分コードの一部のコードの一部を削ったり、類似部分コードを分割してコード共通化実行単位、例えば実行粒度を合わせることをいう。共通コード以下の粒度の場合は共通化不要とし、共通化処理の対象から外される。この調整によってコード共通化後のソースコードファイルの保守性が、調整を行わない場合よりも向上する。
【００５９】
調整単位、粒度単位は、関数やデータ構造などの（１）共通化処理後のプログラム保守性が損なわれず、（２）後述の共通コード挿入命令よりも大きい、プログラム言語上の粒度が適宜設定される。すなわち、粒度は、プログラムの演算処理またはデータ構造のいずれかまたは両方の観点から、プログラム言語構造上の粒度をリファクタリングの対象として予めリファクタリング粒度情報に設定したものを利用する。
【００６０】
◆共通化の粒度単位へ削る例を示す。コードクローンＩ３４Ａが実行単位の共通化処理の粒度単位まで削られ、コードクローンＩ３４Ｂとされる。したがって、コードクローンＩは、共通化処理の粒度単位に設定調整、設定されたコードクローンということになる。
【００６１】
◆共通化の粒度単位へ分割する例を示す。コードクローンII３４Ｃが実行単位の共通化処理の粒度単位まで分割され、コードクローンII３４ＤおよびコードクローンII３４Ｅとなる。したがって、コードクローンII３４ＣおよびコードクローンII３４Ｅは、複数の共通化処理の粒度単位に設定調整、設定されたれたリファクタリング候補コードになる。コードクローンは、リファクタリング候補コードとしてリファクタリングコードクローン情報ファイルにファイルされる。
【００６２】
リファクタリング候補コードは、リファクタリング判断基準情報３６が参照されることで、リファクタリング判断３７（リファクタリング判断部における判断）され、リファクタリング対象コードクローンとされ、コードクローン情報３８が取得される。以下、コードクローンという。
【００６３】
リファクタリング判断３７を行うリファクタリング部は、与えられた判断情報（リファクタリング対象とするソースコードの構成など）や、算出された保守容易性の傾向（既存の尺度、例えば削減されるソースコードの規模や保守容易性指数など）をもとに、対象のコードクローン情報ファイルの中からリファクタリングを行うリファクタリング候補コードが設定された。
【００６４】
判断は、リファクタリング対象の「データ構造の記述」と「演算に記述」ごとに実施する。そして、次に示すように選択したコードクローン間の差分情報を、調整単位、例えばプログラム言語のトークンレベルの粒度で収集し、その結果を先に選択したコードクローンに紐付け、リファクタリング対象コードクローンを取得し、リファクタリングコードクローン情報ファイルに格納する。
【００６５】
このようにリファクタリングは、類似コードについてコードクローンとして検出するだけでなく、共通化コードを生成し、差分情報を収集し共通化コードを利用できるように置き換え、ソースコード作成のための共通コードの適用までのステップで使用される。
【００６６】
図５は、２．共通コードの生成の内容の詳細を示す。
【００６７】
コードクローン間差分抽出４０では、類似となるコードクローン間の、共通部分以外の差分を検出する。全く同一のコードであれば差分はないが、類似の場合差分が存在する。共通コードおよびこの共通コードに関連した差分からなる埋め込み用のコードが生成される。
【００６８】
類似となるコードクローンには、共通部分が双方に共通し、一方のみに差分となるコードが存在する場合、共通部分が双方に共通し、互いに差異となるコードが存在する場合がある。共通コード生成は、これらの差異が場合に、差異が存在しない場合に生成され、差異がある場合に、差分が共通コードに加えられて生成される。
【００６９】
ソースコードＡについてのコードクローン（１）４０ＡおよびソースコードＢについてのコードクローン（１′）４０Ｂは、コードクローンであり、これらにはそれぞれ差分が付加された形態となる。コードクローン（１）４０Ａおよびコードクローン（１′）４０Ｂは、コードクローン間で同一の部分である。類似部分コードには、この同一部分に各差分が付加される。コードクローン（１）４０Ａとその差分、コードクローン（１′）４０Ａとその差分から差分情報付きコードクローン情報４１、リファクタリング対象コードクローン情報４１が取得される。この差分情報付きコードクローン情報４１が埋め込み用のコードとして用いられることになる。
【００７０】
コードクローン情報４１から、共通コード４３を生成し、共通コードについて共通コードファイルを格納する。このようにして共通コードファイルに生成された共通コードを格納しておく。
【００７１】
共通コード生成４２において、各コードクローンから、共通部分を抜き出して共通コードファイルを生成する。
【００７２】
ソースコードＡその他のソースコードのコードクローン（１）や(１′)のコードクローン間で同一のコード部分について共通コードとする。これによって共通コード４３で示すように対象のソースコードに対応して一つまたは複数の共通コードを生成する。共通コード生成がなされたことで、取得されたコードクローン位置情報と生成された共通コードと検出対象コードクローン間の差分とからなる共通コード情報４４が生成される。
【００７３】
図６は、３．共通コード埋込命令への差し替えの内容の詳細および４．保守用資料の生成、５．生成情報の提供の内容を示す。
【００７４】
共通コード挿入指示命令が生成され、命令の埋込４５がなされる。
【００７５】
プログラムコードからリファクタリングコードクローンに相当する部分コードを削除すると共に、各共通コードの挿入コードの挿入命令を挿入する。
【００７６】
なお、共通コード挿入指示命令には、挿入する共通コードおよび共通コードとの差分情報を付加する。
【００７７】
ソースコードからリファクタリング対象コードクローンに相当する部分コードを削除すると共に、各共通コードの挿入させる挿入命令を生成し、挿入を指示する。共通コードとの差分情報を付加させる。埋込済ソースコード４６を生成する。
【００７８】
図６において、ソースコードから調整コードクローンに相当する部分コードをその部分の位置情報から削除４６Ａするとともに、生成された各共通コードの共通コード挿入指示命令４６Ｂを挿入する。共通コード挿入指示命令埋込４６を実行する。なお、共通コード挿入指示命令には、挿入する共通コードに共通コードとの差分情報が付加される。
【００７９】
埋込済ソースコード４６は、同一部分コードおよび類似部分コードの共通化処理の結果、生成されたソースコードになる。同一部分コードについては、上述したステップにより処理が可能である。
４．保守用資料の生成がなされ、５、生成情報が提供される。
【００８０】
この保守用資料の生成ステップでは、共通化処理と共に共通コード一覧・共通コード呼び出し元プログラム一覧・削除プログラム一覧などの保守用資料を生成する。
【００８１】
生成された情報が提供可能とされる。
・規模（コード行数）一覧資料：プログラムソースコードファイルごとの、修正行数・削除行数・追加行数などの規模の一覧
・共通コード一覧：共通コードの一覧
・削除コード関連一覧：共通コードが、どの類似コードと置き換わったのかという関連を示す一覧
・修正コード一覧：類似コードを共通コードに置き換えた影響で修正された箇所の一覧
情報の提供に際しては、生成されたソースコードへの命令の埋め込み情報を元のソースコードに対する保守用情報として生成して格納し、
外部の処理装置に、ソースコードの構造上の形態を実質的に変えることなく、参照されたソースコードに比して規模が縮小されたソースコードを提供し、該提供時に格納した保守用情報を電子情報として提供する。
【００８２】
このように、複数のプログラムの各調整部分コードと、生成された共通コードと共通コードに関連して検出された差分とからなる埋め込みコード情報の関係の保守用情報が生成され、
ソースコードの構造上の形態が実質的に変わることなく、参照されたソースコードに比して各規模が縮小されたソースコードおよび該埋め込みコード情報の関係の保守用情報を提供する、ソースコード提供装置１１０が構成される。
【００８３】
図７から図１４は、共通化処理例を示す。
【００８４】
図７は、ＣＯＢＯＬレコードの例であり、ファイルＩ、ファイル２、ファイル３の例を示す。
【００８５】
図８、図９は、類似コードの抽出例を示す。
【００８６】
図８は、クローン１を、図９は、クローン２の例を示す。ファイル１のＮｏ．２−５，ファイル２のＮｏ．２−５、ファイル３のＮｏ．１３−１６がコードクローンであることを示す。
【００８７】
図９は、ファイル３を示し、Ｎｏ．１５，１６とＮｏ１９，２０がコードクローンであることを示す。
【００８８】
図１０は、類似部分コード情報を示す。
【００８９】
図１１は、共通コードの生成を示す。Ｎｏ．２−５が生成された共通コードを示す。
【００９０】
図１２は、共通コード挿入指示命令への差し替えを示す。
【００９１】
背景色(網かけ)を付けた部分が修正される。ファイル１のＮｏ．２−５、ファイル２のＮｏ．２−５、ファイル３のＮｏ．１３−１６が論理削除または物理削除される。ファイル３に、Ｎｏ１７に、共通コード挿入指示命令が挿入されたことを示す。
【００９２】
ソースコードの構造上の形態を実質的に変えることなく埋め込み済みソースコードを生成させる命令によって実行されている。
【００９３】
図１３は、ファイル１やファイル２について共通コード挿入指示命令が挿入されたことを示す。
【００９４】
図１４は、リファクタリング判断基準情報例を示す。
【００９５】
図１５は、リファクタリング判断例を示す。例１は、２つのデータ記述がコードクローン候補として存在するが、リファクタリング対象としない場合である。例２は、２つのデータ記述がコードクローン候補として存在し、リファクタリング対象とする場合である。
【００９６】
ソースコード生成装置１００は、処理装置に実行させる単一または複数のソースプログラムの複数のソースコードを解析して、当該ソースコードに含まれる少なくとも二つの部分コードについて共通化を行う予め定めた単位であること、およびプログラム文法上同等とみなされる構文であることを条件として、類似部分コードのコードクローンであることを検出するコードクローン検出手段と、
複数のソースコードについて、検出された二つの部分コードがコードコローン関係であることおよび当該部分コードのソースコード上の位置情報を取得するコードクローン情報取得手段と、
複数のプログラムの各コードクローンについて、共通コードを生成する共通コード生成手段と、
複数のソースコードのコードクローン間の差分を検出して各ソースコードについて差分情報を生成する調整ソースコード差分情報取得手段と、
各ソースコードについて、生成された共通コードと生成された差分情報とからなる埋め込みコード情報を生成する埋め込みコード情報取得手段と、
各ソースコードから当該部分コードを削除させる命令、および埋め込み済みソースコードを生成させる命令を備えた調整ソースコード生成手段と、を備える、
ここで、削除させる命令が、取得された位置情報に関連して当該部分コードを削除させる命令であり、埋め込み済みソースコードを生成させる命令が、削除した位置に、埋め込みコード情報から生成された共通コードと生成された差分情報とを埋め込んで、ソースコードの構造上の形態を実質的に変えることなく埋め込み済みソースコードを生成させる命令である。
【００９７】
ソースコード生成装置１００は、
複数のソースコードの各コードクローンについて、識別された粒度単位から、共通化実行単位としての共通化コードを生成する単位としての粒度を予め定めたルールに従って調整、設定する粒度調整設定手段と、
複数のソースコードの各コードクローンについて、共通化実行単位として調整、設定された共通化コード粒度の情報を取得するコードクローン情報取得手段と、を備える。
【００９８】
共通化コード生成手段が、複数のプログラムの各コードクローンについて、共通コードを生成し、
コードクローン間差分情報取得手段が、複数のソースコードのコードクローン間の差分を検出して各ソースコードについて差分情報を生成し、
埋め込みコード情報取得手段が、各ソースコードについて、当該共通コードと生成された差分情報とからなる埋め込みコード情報を生成する。
【００９９】
埋め込み済みソースコードを生成させる命令が、埋め込みコード情報から当該共通化コードとコードクローンに関連して生成された差分とを埋め込んで、ソースコードの構造上の形態を実質的に変えることなく埋め込み済みソースコードを生成させる命令である。
【０１００】
コードクローン検出手段が同一および類似部分コード関係であることを検出し、コードクローン情報取得手段が同一および類似部分コードの情報を取得する。埋め込み済みソースコードを生成させる命令が、差分のないことを示す情報を持つ埋め込みコード情報をも埋め込んだソースコードを生成させる命令である。
【０１０１】
このようにして、ログラムコードの同一部分コードまたは/および類似部分コードを共通化処理することができ、上述した削除および埋め込み命令が挿入されたソースコードが形成されるので、ソースコードの規模を効果的に削減することができる。
【０１０２】
ソースコードの構造上の形態が実質的に変わることなく、保守に際して、使い勝手、保守性がよく、よって汎用性があり、効率よく共通化がなされ、共通化可能範囲が拡大されて、効率よく共通化がなされ、また参照されたソースコードに比して規模が縮小されたソースコードを提供することが出来る。
【０１０３】
また、規模が縮小されて作成されたソースコードが提供できる。
そして、本実施例によれば、上述したように設定された共通コード粒度下で、コードクローン関係の類似部分コードと生成された共通コードと検出された各共通コード粒度コードクローン類似部分コード間の差分とからなる共通コード情報を取得しているので、各ソースコードについて、ソースコードから、取得されたコードクローン関係の類似部分コードを削除し、生成された共通コードと検出された各共通コード粒度コードクローン類似部分コード間の差分をそれぞれ挿入出来るようにしてコードクローン埋め込み済みソースコードを生成することができる。また、設定された共通コード粒度のもとで、ソースコードの同一部分コードまたは/および類似部分コードを共通化処理することができるからソースコードの規模を効果的に削減することができる。
【符号の説明】
【０１０４】
１…コードクローン検出手段、２…コードクローン情報取得手段、３…コードクローン情報取得調整手段、４…コードクローン情報取得手段、６…部分コーン間差分情報生成手段、７…共通コード生成手段、８…埋め込みコード情報取得手段、９…調整ソースコード生成手段，１０…データベース、１００…ソースコード生成装置、１０１…処理装置、１０２…ソースコード、１０３…埋込済ソースコード、１０４…保守用情報、１０５…保守用情報生成手段、１１０…ソースコード提供装置。
【図１】
2015184735.tif 000003
【図２】
2015184735.tif 000004
【図３】
2015184735.tif 000005
【図４】
2015184735.tif 000006
【図５】
2015184735.tif 000007
【図６】
2015184735.tif 000008
【図７】
2015184735.tif 000009
【図８】
2015184735.tif 000010
【図９】
2015184735.tif 000011
【図１０】
2015184735.tif 000012
【図１１】
2015184735.tif 000013
【図１２】
2015184735.tif 000014
【図１３】
2015184735.tif 000015
【図１４】
2015184735.tif 000016
【図１５】
2015184735.tif 000017