特許第6235945号(P6235945)IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ 株式会社日立公共システムの特許一覧

特許6235945ソースコード生成および提供装置、並びにソースコード生成および提供方法
<>
  • 特許6235945-ソースコード生成および提供装置、並びにソースコード生成および提供方法 図000002
  • 特許6235945-ソースコード生成および提供装置、並びにソースコード生成および提供方法 図000003
  • 特許6235945-ソースコード生成および提供装置、並びにソースコード生成および提供方法 図000004
  • 特許6235945-ソースコード生成および提供装置、並びにソースコード生成および提供方法 図000005
  • 特許6235945-ソースコード生成および提供装置、並びにソースコード生成および提供方法 図000006
  • 特許6235945-ソースコード生成および提供装置、並びにソースコード生成および提供方法 図000007
  • 特許6235945-ソースコード生成および提供装置、並びにソースコード生成および提供方法 図000008
  • 特許6235945-ソースコード生成および提供装置、並びにソースコード生成および提供方法 図000009
  • 特許6235945-ソースコード生成および提供装置、並びにソースコード生成および提供方法 図000010
  • 特許6235945-ソースコード生成および提供装置、並びにソースコード生成および提供方法 図000011
  • 特許6235945-ソースコード生成および提供装置、並びにソースコード生成および提供方法 図000012
  • 特許6235945-ソースコード生成および提供装置、並びにソースコード生成および提供方法 図000013
  • 特許6235945-ソースコード生成および提供装置、並びにソースコード生成および提供方法 図000014
  • 特許6235945-ソースコード生成および提供装置、並びにソースコード生成および提供方法 図000015
  • 特許6235945-ソースコード生成および提供装置、並びにソースコード生成および提供方法 図000016
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】6235945
(24)【登録日】2017年11月2日
(45)【発行日】2017年11月22日
(54)【発明の名称】ソースコード生成および提供装置、並びにソースコード生成および提供方法
(51)【国際特許分類】
   G06F 9/44 20060101AFI20171113BHJP
【FI】
   G06F9/06 620K
【請求項の数】8
【全頁数】18
(21)【出願番号】特願2014-58028(P2014-58028)
(22)【出願日】2014年3月20日
(65)【公開番号】特開2015-184735(P2015-184735A)
(43)【公開日】2015年10月22日
【審査請求日】2017年3月15日
(73)【特許権者】
【識別番号】596127554
【氏名又は名称】株式会社日立公共システム
(74)【代理人】
【識別番号】110001922
【氏名又は名称】特許業務法人 日峯国際特許事務所
(74)【代理人】
【識別番号】100074631
【弁理士】
【氏名又は名称】高田 幸彦
(74)【代理人】
【識別番号】100180024
【弁理士】
【氏名又は名称】関山 健一
(72)【発明者】
【氏名】城代 佳範
【審査官】 小林 哲雄
(56)【参考文献】
【文献】 特開2009−176064(JP,A)
【文献】 特開平08−263299(JP,A)
【文献】 肥後芳樹、神谷年洋、楠本真二、井上克郎,コードクローンを対象としたリファクタリング支援環境,電子情報通信学会論文誌,日本,東京:社団法人電子情報通信学会,2005年 2月 1日,第J88-D-I巻、第2号,pp.186-195,ISSN 0915-1915
(58)【調査した分野】(Int.Cl.,DB名)
G06F 9/44
(57)【特許請求の範囲】
【請求項1】
ソースコードを解析して、ソースコードに含まれる互いに類似する部分コードを検出し、そのソースコード上の位置情報を取得する類似コード検出手段と、
前記検出した互いに類似する複数の部分コードに基づいて、共通コードを生成するとともに、当該共通コードと前記類似するそれぞれの各部分コードとの差分情報を生成する共通コード生成手段と、
前記ソースコード内の前記類似する各部分コードを、その前記位置情報に基づいて、前記共通コードおよび前記部分コードの差分情報を挿入する挿入コードに差し替える部分コード差替手段と、
を備えることを特徴とするソースコード生成装置。
【請求項2】
請求項1に記載されたソースコード生成装置において、
前記類似する部分コードは、プログラム文法上同等とみなされるコードであるコードクローンであり、
前記差分情報は、前記部分コード内の記述を他の記述に置き換えるための情報であること
を特徴とするソースコード生成装置。
【請求項3】
請求項2に記載されたソースコード生成装置において、
前記類似コード検出手段は、プログラム文法に基づいて、前記コードクローンとして類似する部分コードを抽出し、抽出した複数の部分コードの比較または基準との比較により、その部分コードの差し替え対象としての一部除外または分割による粒度調整を行うこと
を特徴とするソースコード生成装置。
【請求項4】
請求項1乃至3のいずれかに記載されたソースコード生成装置において、
前記差し替えられた類似する部分コードと、その前記位置情報と、前記共通コードと、前記差分情報とを含む保守用情報を生成する保守用情報生成手段を備えたこと
を特徴とするソースコード生成装置。
【請求項5】
類似コード検出手段が、ソースコードを解析して、ソースコードに含まれる互いに類似する部分コードを検出し、そのソースコードの位置情報を取得する類似コード検出ステップと、
共通コード生成手段が、前記検出した互いに類似する複数の部分コードに基づいて、共通コードを生成するとともに、当該共通コードと前記類似するそれぞれの各部分コードとの差分情報を生成する共通コード生成ステップと、
部分コード差替手段が、前記ソースコード内の前記類似する各部分コードを、その前記位置情報に基づいて、前記共通コードおよび前記部分コードの差分情報を挿入する挿入コードに差し替える部分コード差替ステップと、
を含むことを特徴とするソースコード生成方法。
【請求項6】
請求項5に記載されたソースコード生成方法において、
前記類似する部分コードは、プログラム文法上同等とみなされるコードであるコードクローンであり、
前記差分情報は、前記部分コード内の記述を他の記述に置き換えるための情報である
ことを特徴とするソースコード生成方法。
【請求項7】
請求項6に記載されたソースコード生成方法において、
前記類似コード検出ステップでは、プログラム文法に基づいて、前記コードクローンとして類似する部分コードを抽出し、抽出した複数の部分コードの比較または基準との比較により、その部分コードの差し替え対象としての一部除外または分割による粒度調整を行うこと
を特徴とするソースコード生成方法。
【請求項8】
請求項5乃至7のいずれかに記載されたソースコード生成方法において生成されたソースコードに加えて、
前記差し替えられた類似する部分コードと、その前記位置情報と、前記共通コードと、前記差分情報とを含んで生成された保守用情報を提供する保守用情報提供ステップを、
含むことを特徴とするソースコード提供方法。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、ソースコード生成および提供装置、並びにソースコード生成および提供方法に関する。
【背景技術】
【0002】
システムの保守作業では、長年に亘るソースコードの修正により、設計書の不備により、あるいはデータ項目やロジックの仕様変更によりコード(ロジックやデータ項目定義等のコード)の重複が生じ、ソースコードの可読性が低下するという問題があり、保守作業の効率が落ちるということがあった。このために、手作業にてリファクタリング(重複コードの共通化によるソースコード規模の縮小)作業を行い、保守性の回復がなされて来た。
【0003】
特許文献1には、スクリプトによるソースコード自動生成の方法が提案され、生成結果としての同じコードが存在する場合に、重複部分を共通化することが記載されている。
【0004】
特許文献2には、重複コードの検出方法として既存のコードクローン検出ツールを利用し、ソースファイルからコードクローンを検出し重複部分の共通化することが記載されている。
【先行技術文献】
【特許文献】
【0005】
【特許文献1】特開第2007−304998号公報
【特許文献2】特開第2009−176064号公報
【発明の概要】
【発明が解決しようとする課題】
【0006】
手作業による重複コードの共通化を図る方法にあっては、品質が低く作業コストが高くなるという問題があった。加えて、手作業では、変数名が異なるなど完全一致でない、類似のソースコードを検出する事が難しく、重複コードの共通化が効果的に行うことができないという問題があった。
【0007】
また、特許文献1の技術では、ソースコード生成過程で重複コードを共通化するという手段であると、生成中のソースコードのみに影響する重複コードを共通化するということが出来るが、コードの共通化時にすでに生成完了したソースコードにまたがる重複コードを共通化するということができないため、複数のプログラム間に跨って存在する重複コードを共通化することができないという問題があった。
【0008】
また、特許文献2の技術では、変数のスコープが局所化できる構造化言語に対して有効な技術であり、COBOL85のような変数が大域変数(変数の影響範囲が常に変数宣言を行ったプログラム全体に及ぶ)となる、初期の構造化プログラム言語の場合、重複コードに含まれる変数を関数のパラメタとして生成することはソースコードが冗長となり、ソースコードの可読性が低下してしまうといった問題があった。加えて、特許文献2の技術では、変数宣言からなるデータ構造の定義はリファクタリング(コード共通化)の対象でない。
【0009】
また、コードの共通化後にソースコードを修正あるいは保守する場合は、コード共通化によるソースコードの変更を考慮する必要があるため、コード共通化後の保守性が向上しにくいという問題があった。
【0010】
本発明は、初期の構造化プログラム言語で作成されたソースコードに対して、リファクタリングされたソースコードを効率よく生成することが出来るようにすることを目的とする。
【0011】
また、リファクタリング後の保守作業を容易にするための保守用情報を生成、提供することを目的とする。
【課題を解決するための手段】
【0012】
本発明は、ソースコードを解析して、ソースコードに含まれる互いに類似する部分コードを検出し、そのソースコード上の位置情報を取得する類似コード検出手段と、
前記検出した互いに類似する複数の部分コードに基づいて、共通コードを生成するとともに、当該共通コードと前記類似するそれぞれの各部分コードとの差分情報を生成する共通コード生成手段と、
前記ソースコード内の前記類似する各部分コードを、その前記位置情報に基づいて、前記共通コードおよび前記部分コードの差分情報を挿入する挿入コードに差し替える部分コード差替手段と、
を備えることを特徴とするソースコード生成装置を提供する。
【0013】
本発明は、上述されたソースコード生成装置において、
前記類似する部分コードは、プログラム文法上同等とみなされるコードであるコードクローンであり、
前記差分情報は、前記部分コード内の記述を他の記述に置き換えるための情報であること
を特徴とするソースコード生成装置を提供する。
【0014】
本発明は、上述されたソースコード生成装置において、
前記類似コード検出手段は、プログラム文法に基づいて、前記コードクローンとして類似する部分コードを抽出し、抽出した複数の部分コードの比較または基準との比較により、その部分コードの差し替え対象としての一部除外または分割による粒度調整を行うこと
を特徴とするソースコード生成装置を提供する。
【0015】
本発明は、上述されたソースコード生成装置において、
前記差し替えられた類似する部分コードと、その前記位置情報と、前記共通コードと、前記差分情報とを含む保守用情報を生成する保守用情報生成手段を備えたこと
を特徴とするソースコード生成装置を提供する。
【0016】
また、本発明は、類似コード検出手段が、ソースコードを解析して、ソースコードに含まれる互いに類似する部分コードを検出し、そのソースコードの位置情報を取得する類似コード検出ステップと、
共通コード生成手段が、前記検出した互いに類似する複数の部分コードに基づいて、共通コードを生成するとともに、当該共通コードと前記類似するそれぞれの各部分コードとの差分情報を生成する共通コード生成ステップと、
部分コード差替手段が、前記ソースコード内の前記類似する各部分コードを、その前記位置情報に基づいて、前記共通コードおよび前記部分コードの差分情報を挿入する挿入コードに差し替える部分コード差替ステップと、
を含むことを特徴とするソースコード生成方法を提供する。

【0017】
本発明は、上述されたソースコード生成方法において、
前記類似する部分コードは、プログラム文法上同等とみなされるコードであるコードクローンであり、
前記差分情報は、前記部分コード内の記述を他の記述に置き換えるための情報である
ことを特徴とするソースコード生成方法を提供する。
【0018】
本発明は、上述されたソースコード生成方法において、
前記類似コード検出ステップでは、プログラム文法に基づいて、前記コードクローンとして類似する部分コードを抽出し、抽出した複数の部分コードの比較または基準との比較により、その部分コードの差し替え対象としての一部除外または分割による粒度調整を行うこと
を特徴とするソースコード生成方法を提供する。
【0019】
本発明は、上述されたソースコード生成方法において生成されたソースコードに加えて、
前記差し替えられた類似する部分コードと、その前記位置情報と、前記共通コードと、前記差分情報とを含んで生成された保守用情報を提供する保守用情報提供ステップを、
さらに含むことを特徴とするソースコード提供方法を提供する。
【発明の効果】
【0020】
本発明は、従来のリファクタリング装置と異なり、リファクタリング対象を関数単位だけではなく、変数宣言まで拡大しているため、より多くの重複コードを共通化し、また保守性をより向上させることができる。
【0021】
また本発明は、初期の構造化言語で作成されたソースコードに好適なリファクタリング装置であり、初期の構造化言語の利用が多いとされる保守期間が長いシステムへ適用することで多大な効果を発揮し得る。
【図面の簡単な説明】
【0022】
図1】本発明実施例の形態をブロックで示す図。
図2】二つの類似部分コードの共通化を行う手順と、その自動化を行うステップを示す図。
図3】手順の実施例を示す図。
図4】類似コードの抽出の内容の詳細を示す図。
図5】共通コードの生成の内容の詳細を示す図。
図6】共通コード埋込命令への差し替えの内容の詳細および保守用資料の生成の内容を示す図。
図7】ファイル1、ファイル2、ファイル3の例を示す図。
図8】類似コードの抽出例を示す図。
図9】類似コードの抽出例を示す図。
図10】類似部分コード情報を示す図。
図11】共通コードの生成を示す図。
図12】共通コード埋め込み命令への差し替えを示す図。
図13】ファイル1やファイル2について埋め込み命令が挿入されたことを示す図。
図14】リファクタリング判断基準情報例を示す図。
図15】リファクタリング判断例を示す図。
【発明を実施するための形態】
【0023】
以下、本発明の形態を、図面を用いて説明する。
【実施例】
【0024】
図1は、本発明の実施例であるソースコード生成装置100をブロックで示す。
【0025】
図1において、ソースコード生成装置100は、処理装置101が持つソースコード102を参照する。このソースコード102は、変数が大域変数である初期の構造化プログラム言語で記述されているものとする。
【0026】
ソースコード生成装置100は、コードクローン検出手段1、コードクローン情報取得手段2、共通化単位設定およびコードクローン情報調整手段3、コードクローン情報取得手段4、部分コード間差分情報生成手段6、共通化コード生成手段7、埋め込みコード情報取得手段8、調整ソースコード生成手段9、およびデータベース10から構成される。これらの手段は、通信回線11で互いに接続され、情報の授受がなされ得る。ソースコード提供装置110は、ソースコード生成装置100と保守用情報生成手段105とから構成される。保守用情報生成手段105はソースコード生成装置100と通信回線13で互いに接続され、情報の授受がなされ得る。外部の処理装置101とソースコード提供装置110とは通常の通信回路12を介して接続される。他の手段によって接続されるようにしてもよい。通信回路12によって生成された情報の相互授受がなされる。
【0027】
コードクローンについて使用する場合、類似部分コードをコードクローンに含まれる下位概念とされる場合があるが、ここではコードクローン(あるいはクローン)を二つの部分コードが類似した類似部分コードの関係にある場合を指して使用する。部分コードが同一の場合には、同一部分コードとして示す。
【0028】
コードクローン検出手段1は、ソースコード解析およびコードクローンとして把握される部分コードである類似部分コードおよび同一部分コードの検出を行う。部分コードは、通常互いに同一の同一部分コード、互いに類似の類似部分コードからなり、部分コードとしての識別がなされる。同一部分コードに特定しての共通化処理では共通化範囲に限界がある、本実施例では類似部分コードについても共通化処理を行う。このように類似部分コードについてについて主に説明するが、同一部分コードの共通化処理を除外するものではない。コードクローンの検出法については各種の検出方法が報告されていて、各種の検出方法が採用可能である。
【0029】
コードクローン検出手段1は、単一または複数のソースコードを解析して、当該ソースコードに含まれる少なくとも二つの部分コードについて、部分コードを構成するトークン種別の並びが同等であることを条件として、類似部分コードをコードクローンとして検出する。トークンとは、プログラミング言語の文法上、ソースコードを構成する最小単位の文字列である。
【0030】
コードクローン情報取得手段2は、コードクローン検出手段1で検出された部分コードのソースコード上の位置情報を取得する。位置情報は、領域情報と言われることがある。
【0031】
コードクローン情報調整手段3は、共通化単位設定を設定し、コードクローン情報取得手段2で取得された部分コードの位置情報を読み込み、任意の粒度(構造的なまとまり)を持つ部分コードを抽出する。粒度は、コードの共通化を行う単位として設定する。粒度は演算処理記述やデータ構造記述など、複数の粒度を設定してよい。粒度は、ソースコード生成装置100が生成するソースコードの理解容易性や保守性から定めればよい。
【0032】
コードクローン情報取得手段4は、コードクローン情報調整手段3で、共通化単位が設定され、抽出された部分コードのソースコード上の位置情報を取得する。コードクローン情報取得手段2で取得した部分コードの位置情報は破棄する。
【0033】
部分コード間差分情報生成手段6は、部分コード間の差分を検出する。差分は類似コードの関係をもつ部分コード間で検出する。検出された差分に基づいて部分コード間差分情報を取得する。
【0034】
共通コード生成手段7は、コードクローンについて予め定めた単位、典型的には粒度に基づいて予め定めたルールに従って共通コードを生成する。共通コードの生成に部分コード間差分情報を利用しないルールを定めてもよい。生成された共通コードと、類似コードの関係にある部分コードとの差分を検出する。検出された差分情報を、部分コード間差分情報として取得する。部分コード間差分情報生成手段7で取得した部分コード間差分情報は破棄する。
【0035】
埋め込みコード情報取得手段8は、部分コード間差分情報から差分情報付き類似コード情報を生成する。
【0036】
調整ソースコード生成手段9は、上述した処理結果に基づいて、各ソースコードから当該部分コードを削除させる命令、および埋め込み済みソースコードを形成させる共通コード挿入指示命令を生成する。
【0037】
削除させる命令が、取得された部分コードの位置情報に関連して当該部分コードを削除させる命令であり、埋め込み済みソースコードを生成させる共通コード挿入指示命令が、削除した位置に、埋め込みコード情報から生成された共通化コードと生成された差分情報とを埋め込んで、ソースコードの構造上の形態を実質的に変えることなく埋め込み済みソースコードを生成させる命令である。埋め込み済みソースコードは、ソースコードとなる。
【0038】
このようにすることで、外部の処理装置101に提供され、使用されることになる埋め込み済みソースコードが生成される。このように、生成されたスリム化ソースコード103は、処理装置101での処理に用いられることになる。
【0039】
ソースコード提供装置110は、スリム化ソースコード103、および生成されたソースコード保守用情報生成手段105で生成された保守用情報104を処理装置101に提供する。これらに二つの提供によって顧客は、ソースコードが使い易いものとなる。
【0040】
図2は、二つの類似部分コードの共通化処理を行う手順と、その自動化を行う手順を含む手順を示す。
【0041】
図2において、ステップは大きく分けて、
1.類似コードの抽出ステップ(すなわち、コードクローン抽出ステップ)
2.共通コードの生成ステップ
3.共通コード埋込命令への差し替えステップ
4.保守用資料の生成ステップ
5.生成情報提供ステップ
からなり、これらのステップによって、ソースコードおよび関連の保守用情報が利用者である顧客の端末に提供される。
1.類似コードの抽出ステップでは、ソースコードから類似部分コードを抽出し、それら類似部分コードの情報を取得する。
1−1 類似部分コードを以下の条件で抽出する。
1)共通化を行う単位。共通化を行う単位として抽出単位は予め定めた任意の粒度であること
2)プログラム文法上同等とみなされる構文(コードクローン)であること
1−2 類似部分コードの情報として、以下の情報を取得する。
・ 類似部分コードの、ソースコード上に占める位置情報
2.共通コードの生成ステップでは、抽出された類似部分コードから共通コードファイルを生成する。
2−1 共通コードを生成する。共通コードは、関連する類似部分コードに対する差分が少なくなるように共通コードを生成すると、ソースコードファイル全体の保守性が向上する。
2−2 生成した共通コードと、関連する類似部分コードとの差分を算出する。
2−3 生成した共通コードを共通コードファイルとして生成する。
3.共通コード埋込命令への差し替えステップでは、共通コード埋込命令への差し替えを行う。ソースコード内の各類似部分コードを削除し、削除した位置(1−2a)に、「共通コードと類似部分コードとの差分を補完しながら、共通コードファイルの内容を挿入する」命令を挿入する。すなわち共通コード挿入指示命令を挿入する。このようにして削除命令および共通コード挿入指示命令を持つスリム化ソースコードが生成される。
4.保守用資料の生成ステップでは、作成した共通コードや修正したソースコードの関連を、類似コードごとにまとめた一覧をファイルとして出力する。スリム化ソースコードと共に保守用情報が顧客に提供される。
【0042】
図3は、ソースコード提供手順の実施例を示す。
【0043】
図3において、手順は、上述したように、1.類似部分コードの抽出およびコード調整、2.共通化コードの生成、3.共通コード挿入による差し替え、4.保守用資料の生成、5.生成情報の提供からなる。
【0044】
図3において、類似部分コードの抽出で、ソースコード31(図1でソースコード102)が用意され、準備されたソースコード31が参照されて、静的解析32(静的解析は、従来から知られている)がなされ、類似部分コードを含んだコードクローンの検出がなされる。このように切り出され、検出された類似部分コードを含んだコードクローン情報33が取得される。コードクローン情報33が参照され、コードクローンについての調整、例えば粒度調整34がなされる。リファクタリング粒度情報39が参照され、コードクローン粒度調整34がなされたコードクローンについてコードクローン情報35が取得される。
【0045】
コードクローンは、リファクタリング調整基準に従ってリファクタリング候補となり、ファイル化される。
【0046】
リファクタリング候補コードについて、リファクタリング判断基準情報36が参照されて、リファクタリング判断37がなされ、リファクタリング対象コードクローン情報38が生成される。
【0047】
2.共通コードの生成に移行する。
【0048】
このステップで、リファクタリング対象コードクローン間差分の検出40がなされる。検出された差分から差分情報が生成される。差分情報が参照されて差分情報付きコードクローン情報41が取得される。差分情報付きコードクローン情報41が参照されて共通コード生成42がなされる。生成された共通コードおよび差分情報から共通コード43および共通化処理のための共通コード情報44が取得される。
3.共通コード埋込命令への差し替えに移行する。
【0049】
移行のため、削除命令、共通コード挿入指示命令が生成され、挿入すなわち埋込45がなされる。この埋込命令を持つ埋め込みソースコード46が生成され、取得される。これによって埋め込みソースコードは、保守前のソースコードの構造上の形態を実質的に変えられることなく、保守前のソースコードの規模に比べて大きさが縮小される。
4.保守用資料の生成および5.生成情報の提供に移行する。
【0050】
このステップで、ソースコード処理方法情報を含む保守用情報の生成がなされ、生成された、ソースコード情報および保守用情報の提供がなされる。
【0051】
このように、処理装置に実行させる単一または複数のソースプログラムの複数のソースコードを解析して、当該ソースコードに含まれる少なくとも二つの部分コードについて共通化を行う予め定めた単位であること、およびプログラム文法上同等とみなされる構文であることを条件として、類似部分コードが検出され、
複数のソースコードのコードクローン間の差分を検出して各ソースコードについて差分情報が生成され、
各ソースコードについて、生成された共通コードと生成された差分情報とからなる埋め込みコード情報が生成され、
取得された位置情報に関連して当該部分コードを削除させる命令、および埋め込み済みソースコードを生成させ、削除した位置に、埋め込みコード情報から生成された共通コードと生成された差分情報とを埋め込んで、ソースコードの構造上の形態を実質的に変えることなく埋め込み済みソースコードを形成させる命令が生成され、
複数のプログラムの各調整部分コードと、生成された共通コードと検出された差分とからなる埋め込みコード情報の関係の保守用情報が生成され、
ソースコードの構造上の形態が実質的に変わることなく、参照されたソースコードに比して各規模が縮小されたソースコードおよび該埋め込みコード情報の関係の保守用情報を提供する。これによって顧客は、上述のようにして生成された共通コードを持つソースコードを用いての各種処理を行い得ることになる。
【0052】
図4図6は、図3に示した内容の詳細を示す。図3で説明した事項は必要以上に繰り返さないことにする。
【0053】
図4は、1.類似コードの抽出の内容の詳細を示す。図4において、類似部分コード抽出により、コードクローンを抽出する。ソースコードAからソースコードA内の一方のコードが部分コード(1)32Aとして抽出され、一方の部分コード(1)32Bとなる。また、ソースコードBからソースコードB内の類似コード(1)32Cが抽出され、類似部分コード(1)32Dとなる。一方の部分コード(1)32Bと類似部分コード(1)32Dの2つの部分コードは、類似の関係にあり、コードクローンの関係にある。
【0054】
このように静的解析がなされ、複数のソースコード31についてのコードクローン検出32がなされる。
【0055】
コードの類似性を判定する方法は、各種知られており、公知の手法によるコード類似判定方法が採用可能である。
【0056】
一方の部分コード(1)32Bおよび類似部分コード(1)32Dから類似部分コード情報33が取得される。また、類似部分コード情報として、類似コードの、ソースコード上に占める位置が位置情報として取得される。
【0057】
次のステップで、リファクタリング粒度情報39が参照され、類似部分コードを共通化する共通コードの単位に調整するコードクローン粒度調整34がなされる。共通コードの単位をコード共通化実行単位に調整したコードクローン情報35を取得する。コードクローンを共通コードの粒度に調整する。すなわち、リファクタリングスル粒度に調整する。
【0058】
調整とは、類似部分コードの一部のコードの一部を削ったり、類似部分コードを分割してコード共通化実行単位、例えば実行粒度を合わせることをいう。共通コード以下の粒度の場合は共通化不要とし、共通化処理の対象から外される。この調整によってコード共通化後のソースコードファイルの保守性が、調整を行わない場合よりも向上する。
【0059】
調整単位、粒度単位は、関数やデータ構造などの(1)共通化処理後のプログラム保守性が損なわれず、(2)後述の共通コード挿入命令よりも大きい、プログラム言語上の粒度が適宜設定される。すなわち、粒度は、プログラムの演算処理またはデータ構造のいずれかまたは両方の観点から、プログラム言語構造上の粒度をリファクタリングの対象として予めリファクタリング粒度情報に設定したものを利用する。
【0060】
◆共通化の粒度単位へ削る例を示す。コードクローンI34Aが実行単位の共通化処理の粒度単位まで削られ、コードクローンI34Bとされる。したがって、コードクローンIは、共通化処理の粒度単位に設定調整、設定されたコードクローンということになる。
【0061】
◆共通化の粒度単位へ分割する例を示す。コードクローンII34Cが実行単位の共通化処理の粒度単位まで分割され、コードクローンII34DおよびコードクローンII34Eとなる。したがって、コードクローンII34CおよびコードクローンII34Eは、複数の共通化処理の粒度単位に設定調整、設定されたれたリファクタリング候補コードになる。コードクローンは、リファクタリング候補コードとしてリファクタリングコードクローン情報ファイルにファイルされる。
【0062】
リファクタリング候補コードは、リファクタリング判断基準情報36が参照されることで、リファクタリング判断37(リファクタリング判断部における判断)され、リファクタリング対象コードクローンとされ、コードクローン情報38が取得される。以下、コードクローンという。
【0063】
リファクタリング判断37を行うリファクタリング部は、与えられた判断情報(リファクタリング対象とするソースコードの構成など)や、算出された保守容易性の傾向(既存の尺度、例えば削減されるソースコードの規模や保守容易性指数など)をもとに、対象のコードクローン情報ファイルの中からリファクタリングを行うリファクタリング候補コードが設定された。
【0064】
判断は、リファクタリング対象の「データ構造の記述」と「演算に記述」ごとに実施する。そして、次に示すように選択したコードクローン間の差分情報を、調整単位、例えばプログラム言語のトークンレベルの粒度で収集し、その結果を先に選択したコードクローンに紐付け、リファクタリング対象コードクローンを取得し、リファクタリングコードクローン情報ファイルに格納する。
【0065】
このようにリファクタリングは、類似コードについてコードクローンとして検出するだけでなく、共通化コードを生成し、差分情報を収集し共通化コードを利用できるように置き換え、ソースコード作成のための共通コードの適用までのステップで使用される。
【0066】
図5は、2.共通コードの生成の内容の詳細を示す。
【0067】
コードクローン間差分抽出40では、類似となるコードクローン間の、共通部分以外の差分を検出する。全く同一のコードであれば差分はないが、類似の場合差分が存在する。共通コードおよびこの共通コードに関連した差分からなる埋め込み用のコードが生成される。
【0068】
類似となるコードクローンには、共通部分が双方に共通し、一方のみに差分となるコードが存在する場合、共通部分が双方に共通し、互いに差異となるコードが存在する場合がある。共通コード生成は、これらの差異が場合に、差異が存在しない場合に生成され、差異がある場合に、差分が共通コードに加えられて生成される。
【0069】
ソースコードAについてのコードクローン(1)40AおよびソースコードBについてのコードクローン(1′)40Bは、コードクローンであり、これらにはそれぞれ差分が付加された形態となる。コードクローン(1)40Aおよびコードクローン(1′)40Bは、コードクローン間で同一の部分である。類似部分コードには、この同一部分に各差分が付加される。コードクローン(1)40Aとその差分、コードクローン(1′)40Aとその差分から差分情報付きコードクローン情報41、リファクタリング対象コードクローン情報41が取得される。この差分情報付きコードクローン情報41が埋め込み用のコードとして用いられることになる。
【0070】
コードクローン情報41から、共通コード43を生成し、共通コードについて共通コードファイルを格納する。このようにして共通コードファイルに生成された共通コードを格納しておく。
【0071】
共通コード生成42において、各コードクローンから、共通部分を抜き出して共通コードファイルを生成する。
【0072】
ソースコードAその他のソースコードのコードクローン(1)や(1′)のコードクローン間で同一のコード部分について共通コードとする。これによって共通コード43で示すように対象のソースコードに対応して一つまたは複数の共通コードを生成する。共通コード生成がなされたことで、取得されたコードクローン位置情報と生成された共通コードと検出対象コードクローン間の差分とからなる共通コード情報44が生成される。
【0073】
図6は、3.共通コード埋込命令への差し替えの内容の詳細および4.保守用資料の生成、5.生成情報の提供の内容を示す。
【0074】
共通コード挿入指示命令が生成され、命令の埋込45がなされる。
【0075】
プログラムコードからリファクタリングコードクローンに相当する部分コードを削除すると共に、各共通コードの挿入コードの挿入命令を挿入する。
【0076】
なお、共通コード挿入指示命令には、挿入する共通コードおよび共通コードとの差分情報を付加する。
【0077】
ソースコードからリファクタリング対象コードクローンに相当する部分コードを削除すると共に、各共通コードの挿入させる挿入命令を生成し、挿入を指示する。共通コードとの差分情報を付加させる。埋込済ソースコード46を生成する。
【0078】
図6において、ソースコードから調整コードクローンに相当する部分コードをその部分の位置情報から削除46Aするとともに、生成された各共通コードの共通コード挿入指示命令46Bを挿入する。共通コード挿入指示命令埋込46を実行する。なお、共通コード挿入指示命令には、挿入する共通コードに共通コードとの差分情報が付加される。
【0079】
埋込済ソースコード46は、同一部分コードおよび類似部分コードの共通化処理の結果、生成されたソースコードになる。同一部分コードについては、上述したステップにより処理が可能である。
4.保守用資料の生成がなされ、5、生成情報が提供される。
【0080】
この保守用資料の生成ステップでは、共通化処理と共に共通コード一覧・共通コード呼び出し元プログラム一覧・削除プログラム一覧などの保守用資料を生成する。
【0081】
生成された情報が提供可能とされる。
・規模(コード行数)一覧資料:プログラムソースコードファイルごとの、修正行数・削除行数・追加行数などの規模の一覧
・共通コード一覧:共通コードの一覧
・削除コード関連一覧:共通コードが、どの類似コードと置き換わったのかという関連を示す一覧
・修正コード一覧:類似コードを共通コードに置き換えた影響で修正された箇所の一覧
情報の提供に際しては、生成されたソースコードへの命令の埋め込み情報を元のソースコードに対する保守用情報として生成して格納し、
外部の処理装置に、ソースコードの構造上の形態を実質的に変えることなく、参照されたソースコードに比して規模が縮小されたソースコードを提供し、該提供時に格納した保守用情報を電子情報として提供する。
【0082】
このように、複数のプログラムの各調整部分コードと、生成された共通コードと共通コードに関連して検出された差分とからなる埋め込みコード情報の関係の保守用情報が生成され、
ソースコードの構造上の形態が実質的に変わることなく、参照されたソースコードに比して各規模が縮小されたソースコードおよび該埋め込みコード情報の関係の保守用情報を提供する、ソースコード提供装置110が構成される。
【0083】
図7から図14は、共通化処理例を示す。
【0084】
図7は、COBOLレコードの例であり、ファイルI、ファイル2、ファイル3の例を示す。
【0085】
図8図9は、類似コードの抽出例を示す。
【0086】
図8は、クローン1を、図9は、クローン2の例を示す。ファイル1のNo.2−5,ファイル2のNo.2−5、ファイル3のNo.13−16がコードクローンであることを示す。
【0087】
図9は、ファイル3を示し、No.15,16とNo19,20がコードクローンであることを示す。
【0088】
図10は、類似部分コード情報を示す。
【0089】
図11は、共通コードの生成を示す。No.2−5が生成された共通コードを示す。
【0090】
図12は、共通コード挿入指示命令への差し替えを示す。
【0091】
背景色(網かけ)を付けた部分が修正される。ファイル1のNo.2−5、ファイル2のNo.2−5、ファイル3のNo.13−16が論理削除または物理削除される。ファイル3に、No17に、共通コード挿入指示命令が挿入されたことを示す。
【0092】
ソースコードの構造上の形態を実質的に変えることなく埋め込み済みソースコードを生成させる命令によって実行されている。
【0093】
図13は、ファイル1やファイル2について共通コード挿入指示命令が挿入されたことを示す。
【0094】
図14は、リファクタリング判断基準情報例を示す。
【0095】
図15は、リファクタリング判断例を示す。例1は、2つのデータ記述がコードクローン候補として存在するが、リファクタリング対象としない場合である。例2は、2つのデータ記述がコードクローン候補として存在し、リファクタリング対象とする場合である。
【0096】
ソースコード生成装置100は、処理装置に実行させる単一または複数のソースプログラムの複数のソースコードを解析して、当該ソースコードに含まれる少なくとも二つの部分コードについて共通化を行う予め定めた単位であること、およびプログラム文法上同等とみなされる構文であることを条件として、類似部分コードのコードクローンであることを検出するコードクローン検出手段と、
複数のソースコードについて、検出された二つの部分コードがコードコローン関係であることおよび当該部分コードのソースコード上の位置情報を取得するコードクローン情報取得手段と、
複数のプログラムの各コードクローンについて、共通コードを生成する共通コード生成手段と、
複数のソースコードのコードクローン間の差分を検出して各ソースコードについて差分情報を生成する調整ソースコード差分情報取得手段と、
各ソースコードについて、生成された共通コードと生成された差分情報とからなる埋め込みコード情報を生成する埋め込みコード情報取得手段と、
各ソースコードから当該部分コードを削除させる命令、および埋め込み済みソースコードを生成させる命令を備えた調整ソースコード生成手段と、を備える、
ここで、削除させる命令が、取得された位置情報に関連して当該部分コードを削除させる命令であり、埋め込み済みソースコードを生成させる命令が、削除した位置に、埋め込みコード情報から生成された共通コードと生成された差分情報とを埋め込んで、ソースコードの構造上の形態を実質的に変えることなく埋め込み済みソースコードを生成させる命令である。
【0097】
ソースコード生成装置100は、
複数のソースコードの各コードクローンについて、識別された粒度単位から、共通化実行単位としての共通化コードを生成する単位としての粒度を予め定めたルールに従って調整、設定する粒度調整設定手段と、
複数のソースコードの各コードクローンについて、共通化実行単位として調整、設定された共通化コード粒度の情報を取得するコードクローン情報取得手段と、を備える。
【0098】
共通化コード生成手段が、複数のプログラムの各コードクローンについて、共通コードを生成し、
コードクローン間差分情報取得手段が、複数のソースコードのコードクローン間の差分を検出して各ソースコードについて差分情報を生成し、
埋め込みコード情報取得手段が、各ソースコードについて、当該共通コードと生成された差分情報とからなる埋め込みコード情報を生成する。
【0099】
埋め込み済みソースコードを生成させる命令が、埋め込みコード情報から当該共通化コードとコードクローンに関連して生成された差分とを埋め込んで、ソースコードの構造上の形態を実質的に変えることなく埋め込み済みソースコードを生成させる命令である。
【0100】
コードクローン検出手段が同一および類似部分コード関係であることを検出し、コードクローン情報取得手段が同一および類似部分コードの情報を取得する。埋め込み済みソースコードを生成させる命令が、差分のないことを示す情報を持つ埋め込みコード情報をも埋め込んだソースコードを生成させる命令である。
【0101】
このようにして、ログラムコードの同一部分コードまたは/および類似部分コードを共通化処理することができ、上述した削除および埋め込み命令が挿入されたソースコードが形成されるので、ソースコードの規模を効果的に削減することができる。
【0102】
ソースコードの構造上の形態が実質的に変わることなく、保守に際して、使い勝手、保守性がよく、よって汎用性があり、効率よく共通化がなされ、共通化可能範囲が拡大されて、効率よく共通化がなされ、また参照されたソースコードに比して規模が縮小されたソースコードを提供することが出来る。
【0103】
また、規模が縮小されて作成されたソースコードが提供できる。
そして、本実施例によれば、上述したように設定された共通コード粒度下で、コードクローン関係の類似部分コードと生成された共通コードと検出された各共通コード粒度コードクローン類似部分コード間の差分とからなる共通コード情報を取得しているので、各ソースコードについて、ソースコードから、取得されたコードクローン関係の類似部分コードを削除し、生成された共通コードと検出された各共通コード粒度コードクローン類似部分コード間の差分をそれぞれ挿入出来るようにしてコードクローン埋め込み済みソースコードを生成することができる。また、設定された共通コード粒度のもとで、ソースコードの同一部分コードまたは/および類似部分コードを共通化処理することができるからソースコードの規模を効果的に削減することができる。
【符号の説明】
【0104】
1…コードクローン検出手段、2…コードクローン情報取得手段、3…コードクローン情報取得調整手段、4…コードクローン情報取得手段、6…部分コーン間差分情報生成手段、7…共通コード生成手段、8…埋め込みコード情報取得手段、9…調整ソースコード生成手段,10…データベース、100…ソースコード生成装置、101…処理装置、102…ソースコード、103…埋込済ソースコード、104…保守用情報、105…保守用情報生成手段、110…ソースコード提供装置。
図1
図2
図3
図4
図5
図6
図7
図8
図9
図10
図11
図12
図13
図14
図15