(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2024-07-17
(45)【発行日】2024-07-25
(54)【発明の名称】コード変更パターンマイニングプログラム及びコード変更パターンマイニング方法
(51)【国際特許分類】
G06F 8/65 20180101AFI20240718BHJP
G06F 8/75 20180101ALI20240718BHJP
G06F 16/903 20190101ALI20240718BHJP
【FI】
G06F8/65
G06F8/75
G06F16/903
(21)【出願番号】P 2021011129
(22)【出願日】2021-01-27
【審査請求日】2023-09-07
(73)【特許権者】
【識別番号】000005223
【氏名又は名称】富士通株式会社
(74)【代理人】
【識別番号】100094525
【氏名又は名称】土井 健二
(74)【代理人】
【識別番号】100094514
【氏名又は名称】林 恒徳
(72)【発明者】
【氏名】野田 訓広
【審査官】円子 英紀
(56)【参考文献】
【文献】特開2015-069400(JP,A)
【文献】特表2022-534181(JP,A)
【文献】国際公開第2020/236744(WO,A1)
【文献】Hoan Anh Nguyen et al.,Graph-based Mining of In-the-Wild, Fine-grained, Semantic Code Change Patterns,Proceedings of 41st International Conference on Software Engineering,ACM DIGITAL LIBRARY [online],2019年05月25日,pp.819-830,インターネット:<URL: https://dl.acm.org/doi/10.1109/ICSE.2019.00089 >,[検索日 2024年06月05日]
(58)【調査した分野】(Int.Cl.,DB名)
G06F 8/00-8/77
G06F 16/903
(57)【特許請求の範囲】
【請求項1】
コード変更前の第1プログラムコードとコード変更後の第2プログラムコードの第1抽象構文木と第2抽象構文木(以下抽象構文木をASTと称する。)をそれぞれ生成し、
前記第1プログラムコードと前記第2プログラムコードの第1プログラム依存グラフと第2プログラム依存グラフ(以下プログラム依存グラフをPDGと称する。)をそれぞれ生成し、前記第1PDG及び第2PDGを有するチェンジグラフを生成し、
前記第1ASTと第2AST上のASTノード間の第1の対応関係を生成し、
前記第1の対応関係が生成されたASTノードを起点にする親ノード間及び子ノード間の対応関係を前記第1の対応関係に追加し、
前記第1の対応関係に含まれ、前記チェンジグラフ上のPDGノード間に対応する前記ASTノード間の対応関係を、前記チェンジグラフ上に、PDGノード間の第2の対応関係として生成し、
前記チェンジグラフの前記第2の対応関係に基づいて、前記第2の対応関係を有するPDGノードを含むサブグラフのうち所定の頻度以上で含まれるサブグラフを、コード変更パターンとして抽出する、
処理をコンピュータに実行させるコード変更パターンマイニングプログラム。
【請求項2】
親ノード間及び子ノード間の対応関係を前記第1の対応関係に追加する処理は、当該対応関係が追加された親ノード及び小ノードを起点にして、再帰的に繰り返される、請求項1に記載のコード変更パターンマイニングプログラム。
【請求項3】
親ノード間及び子ノード間の対応関係を前記第1の対応関係に追加する処理では、前記第1の対応関係が生成されたASTノードを起点にする親ノード間に対応関係が存在しない場合に、前記親ノード間に対応関係を追加する、請求項1または2に記載のコード変更パターンマイニングプログラム。
【請求項4】
親ノード間及び子ノード間の対応関係を前記第1の対応関係に追加する処理では、前記第1の対応関係が生成されたASTノードを起点にする子ノードのうち1つの子ノードのみに対応関係が存在しない場合に、前記子ノード間に対応関係を追加する、請求項1または2に記載のコード変更パターンマイニングプログラム。
【請求項5】
前記子ノード間に対応関係が追加された場合、当該子ノードの子孫ノードに前記対応関係が存在しない場合、当該子ノードを根とする部分ASTについて、前記部分AST内のASTノード間の第1の対応関係を生成する、請求項4に記載のコード変更パターンマイニングプログラム。
【請求項6】
前記再帰的な繰り返しは、所定回数まで繰り返す、新たな対応関係の増加数が基準個数未満になるまで繰り返す、請求項2に記載のコード変更パターンマイニングプログラム。
【請求項7】
前記処理は、更に、
前記チェンジグラフ上の第2の対応関係が生成されたPDGノード対から親ノード又は子ノード方向に同じ依存辺をたどって到達できる同じラベルを持つPDGノード対に、新たに第2の対応関係を生成することを有する、請求項1に記載のコード変更パターンマイニングプログラム。
【請求項8】
前記PDGは、プログラムコードの文や条件式よりも単位が細かい少なくとも式及び演算子をノードとする細粒度PDGである、請求項1に記載のコード変更パターンマイニングプログラム。
【請求項9】
コード変更前の第1プログラムコードとコード変更後の第2プログラムコードの第1抽象構文木と第2抽象構文木(以下抽象構文木をASTと称する。)をそれぞれ生成し、
前記第1プログラムコードと前記第2プログラムコードの第1プログラム依存グラフと第2プログラム依存グラフ(以下プログラム依存グラフをPDGと称する。)をそれぞれ生成し、前記第1PDG及び第2PDGを有するチェンジグラフを生成し、
前記第1ASTと第2AST上のASTノード間の第1の対応関係を生成し、
前記第1の対応関係が生成されたASTノードを起点にする親ノード間及び子ノード間の対応関係を前記第1の対応関係に追加し、
前記第1の対応関係に含まれ、前記チェンジグラフ上のPDGノード間に対応する前記ASTノード間の対応関係を、前記チェンジグラフ上に、PDGノード間の第2の対応関係として生成し、
前記チェンジグラフの前記第2の対応関係に基づいて、前記第2の対応関係を有するPDGノードを含むサブグラフのうち所定の頻度以上で含まれるサブグラフを、コード変更パターンとして抽出する、
処理を有するコード変更パターンマイニング方法。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、コード変更パターンマイニングプログラム及びコード変更パターンマイニング方法に関する。
【背景技術】
【0002】
コード変更パターンのマイニングは、プログラム開発を支援する開発支援プログラムに含まれる1つの機能である。プログラム開発では、ソースコードの複数の箇所に類似する変更が加えられることがある。例えば、ソースコード内のAPI(Application Programming Interface)のバージョンアップや変更が生じた場合、APIの利用箇所を一括で変更する、または、ソースコード内のバグを修正する場合に、同種のバグの箇所を一括で変更する、などである。
【0003】
このような、ソースコード内の異なる箇所に類似する変更を加えることを、システマティックエディット(Systematic edit:システマティックな編集または変更)と呼ぶ。システマティックエディットは、ソースコードの開発履歴において、異なる版で同じ箇所や異なる箇所に発生することもあれば、同じ版の異なる箇所に発生することもある。
【0004】
システマティックエディットで変更すべき箇所が多数ある場合、変更漏れの発生や、コード書き換えの作業コストが増大する。このような問題を解消するために、過去の開発履歴のソースコードから、システマティックエディットパターン(以下、コード変更パターン、エディットパターン、編集パターン、または単にパターンと称する。)を収集し、それを利用することで、変更漏れの検出と自動修正や、類似するコード変更作業を自動化するなどのプログラム開発の支援が可能になる。
【0005】
システマティックエディットに基づく変更支援や自動修正の処理の流れは、例えば(1)ソースコードの開発履歴群からコード変更パターンをマイニングし、(2)変更対象プログラム内のコード変更パターンの適用箇所を検出し、(3)検出した適用箇所をコード変更パターンに基づいてコード変更する等である。
【0006】
前述のコード変更パターンは、例えば、PDG(Program Dependence Graph:プログラム依存グラフ)の変化で表現される。そして、PDGの変化を表現するグラフであるチェンジグラフ(change graph)の集合から、頻出するサブグラフがコード変更パターンとしてマイニングされる。PDGの変化を表現するチェンジグラフを利用することで、プログラムの意味的な繋がりを考慮した変更パターンを表現でき、例えば、AST(Abstract Syntax Tree:抽象構文木)編集スクリプトを利用するより柔軟にコード変更を表現できる。
【0007】
PDGのチェンジグラフは、例えば、(1)コード変更前後のソースプログラムをASTに変換し、(2)AST差分計算アルゴリズムによりASTのノード間の対応関係を計算し、(3)コード変更前後のコードをfgPDG(fine-grained PDG:細粒度PDG)に変換し、コード変更前と後のfgPDGを左右に並べて表現し、(4)ASTノード間の対応関係に基づいて、コード変更前後のfgPDGのノード間に対応関係の情報を付与することで、生成される。
【0008】
以下の特許文献には、プログラムの編集を支援する方法について記載される。また、非特許文献にはPDGの変化としてコード変更パターンを表現することが記載されている。
【先行技術文献】
【特許文献】
【0009】
【文献】特開平9-16389号公報
【文献】特開2011-53840号公報
【文献】特開2020-64463号公報
【非特許文献】
【0010】
【文献】Graph-based Mining of In-the-Wild, Fine-grained, Semantic Code Change Patterns, Hoan Nguyen, Tien N. Nguyen, Danny Dig, Son Nguyen, Hieu Tran, Michael Hilton, International Conference on Software Engineering, 2019
【発明の概要】
【発明が解決しようとする課題】
【0011】
しかしながら、fgPDGは一般にASTに基づいて生成されるが、ASTとfgPDGとは抽象度や構造が異なっている。そのため、AST差分計算で求めた対応関係の情報を、fgPDGのチェンジグラフに転写するだけでは、ASTでの多くの対応関係の情報がfgPDGのチェンジグラフ上では失われる。fgPDGのチェンジグラフ上の対応関係の情報が少ないと、fgPDGのチェンジグラフからコード変更を正確に追跡することができない。その結果、コード変更パターンを適切にマイニングすることができない。
【0012】
そこで、本実施の形態の第1の側面の目的は、コード変更パターンを適切にマイニングするコード変更パターンマイニングプログラム及びコード変更パターンマイニング方法を提供することにある。
【課題を解決するための手段】
【0013】
本実施の形態の第1の側面は、コード変更前の第1プログラムコードとコード変更後の第2プログラムコードの第1抽象構文木と第2抽象構文木(以下抽象構文木をASTと称する。)をそれぞれ生成し、前記第1プログラムコードと前記第2プログラムコードの第1プログラム依存グラフと第2プログラム依存グラフ(以下プログラム依存グラフをPDGと称する。)をそれぞれ生成し、前記第1PDG及び第2PDGを有するチェンジグラフを生成し、前記第1ASTと第2AST上のASTノード間の第1の対応関係を生成し、前記第1の対応関係が生成されたASTノードを起点にする親ノード間及び子ノード間の対応関係を前記第1の対応関係に追加し、前記第1の対応関係に含まれ、前記チェンジグラフ上のPDGノード間に対応する前記ASTノード間の対応関係を、前記チェンジグラフ上に、PDGノード間の第2の対応関係として生成し、前記チェンジグラフの前記第2の対応関係に基づいて、前記第2の対応関係を有するPDGノードを含むサブグラフのうち所定の頻度以上で含まれるサブグラフを、コード変更パターンとして抽出する、処理をコンピュータに実行させるコード変更パターンマイニングプログラムである。
【発明の効果】
【0014】
第1の側面によれば、コード変更パターンを適切にマイニングするコード変更パターンマイニングプログラム及びコード変更パターンマイニング方法を提供することができる。
【図面の簡単な説明】
【0015】
【
図1】システマティックエディットの一例を示す図である。
【
図2】システマティックエディットによるコード変更支援及び自動修正のフローチャートの一例を示す図である。
【
図3】PDGの変化を示すチェンジグラフからコード変更パターンをマイニングする処理のフローチャートを示す図である。
【
図4】PDGの変化としてコード変更パターンをマイニングする詳細処理のフローチャートを示す図である。
【
図5】ソースプログラム例に対するAST例を示す図である。
【
図6】コード変更前のASTと変更後のASTと両AST間の対応関係の具体例を示す図である。
【
図7】ソースプログラムのコードから変換したfgPDGの例を示す図である。
【
図9】複数のチェンジグラフから所定の頻度以上のサブグラフをコード変更パターンとして抽出する例を示す図である。
【
図10】コード変更パターンの適用箇所の検出とコード変更の例を示す図である。
【
図11】対応関係が十分でコード変更の追跡が容易な例と困難な例を示す図である。
【
図12】変更の追跡が容易にできる例のコード差分とAST差分計算結果の例を示す図である。
【
図13】
図12のコード差分とAST間の対応関係から生成されたチェンジグラフの例を示す図である。
【
図14】変更の追跡が困難な例のコード差分とAST差分計算結果の例を示す図である。
【
図15】
図14のコード差分とAST間の対応関係から生成されたチェンジグラフの例を示す図である。
【
図16】本実施の形態におけるチェンジグラフの例を示す図である。
【
図17】本実施の形態により増加されたチェンジグラフ上でのfgPDGノード間のmap辺の例を示す図である。
【
図18】本実施の形態における開発支援装置の構成例を示す図である。
【
図19】本実施の形態におけるコード変更パターンをマイニングする詳細処理のフローチャートを示す図である。
【
図20】AST上でmap辺を伝搬しmap辺を追加する処理S21Aのフローチャート例を示す図である。
【
図21】AST上での親ノードへのmap辺の伝搬処理例を示す図である。
【
図22】AST上での子ノードへのmap辺の伝搬処理例を示す図である。
【
図23】
図14のAST上で親ノードへmap辺を伝搬した例を示す図である。
【
図24】
図23のAST上で子ノードへmap辺を伝搬した例を示す図である。
【
図25】
図24のAST上のmap辺に基づいてmap辺が生成されたチェンジグラフの例を示す図である。
【
図26】チェンジグラフ上でラベル同一性に基づきmap辺を補足する処理S23Aのフローチャート例を示す図である。
【
図27】チェンジグラフ上でラベル同一性に基づきmap辺を補足する処理S23Aの具体例を説明するASTの図である。
【
図28】チェンジグラフ上でラベル同一性に基づきmap辺を補足する処理S23Aの具体例を説明するチェンジグラフの図である。
【発明を実施するための形態】
【0016】
以下、実施の形態についてJava言語(Javaはオラクルおよびその関連会社の登録商標)を例にして説明するが、実施の形態はJava言語に限定されるものではなく、C言語や他の言語にも適用できる。以下では、まず背景としてSystematic editとコード変更パターンをマイニングする技術について説明した後に、実施の形態におけるコード変更パターンのマイニングについて説明する。
【0017】
[Systematic editに基づくコード変更支援・自動修正]
図1は、システマティックエディットの一例を示す図である。図中、横軸が開発履歴の各バージョン番号v1~v3を示し、それぞれのバージョン番号v1~v3に対応するソースプログラムSP1~SP4が示される。
【0018】
前述したとおり、プログラム開発では、ソースコードの複数の箇所に類似する変更が加えられることがある。例えば、ソースコード内のAPIのバージョンアップや変更が生じた場合、APIの利用箇所を一括で変更する、または、ソースコード内のバグを修正する場合に、同種のバグの箇所を一括で変更する、などである。このような、ソースコード内の異なる箇所に類似する変更を加えることを、システマティックエディットと呼ぶ。システマティックエディットは、ソースコードの開発履歴において、異なる版で同じ箇所または異なる箇所に発生することもあれば、同じ版の異なる箇所に発生することもある。
【0019】
図1において、各ソースプログラムSP1~SP4には、行頭が「-」の削除される文と、行頭が「+」の挿入される文(共に下線で示す文)とが含まれる。ここの例では、APIメソッドFile.read()からAPIメソッドIO.read()に変更される。このコード変更は、異なるバージョンのソースプログラムSP1~SP3内の異なる箇所で行われる。
【0020】
図1の例において、コード変更パターンマイニングプログラムを実行するプロセッサが、バージョンv4のソースプログラムSP4の開発過程で、過去に開発されたソースプログラムSP1、SP2を含む開発履歴群から、APIメソッドFile.read()からAPIメソッドIO.read()に変更するというシステマティックエディットパターン(コード変更パターン)をマイニングする。そして、プロセッサが、新たに開発されるソースプログラムSP4を、マイニングされたコード変更パターンに基づいて、同様のコード変更を実行する。
【0021】
図2は、システマティックエディットによるコード変更支援及び自動修正のフローチャートの一例を示す図である。システマティックエディット(システマティックなコード変更)は、複数の開発済みソースコードを含む開発履歴群10から、所定の頻度以上に発生したコード変更パターン11をマイニングする処理S1を有する。コード変更パターン11の例は、
図1の例のAPIメソッドFile.read()からAPIメソッドIO.read()に変更するコード変更パターンである。さらに、システマティックなコード変更は、変更対象プログラム12内のコード変更パターン11に合致するコード変更パターン適用箇所を検出する処理S2と、変更対象プログラム12のコード変更パターン適用箇所のコードをコード変更パターンに基づいてコード変更する処理S3とを有する。本実施の形態は、コード変更パターン11をマイニングする処理S1の改善に関する。
【0022】
コード変更パターンは、ソースプログラムの行またはトークン単位の変化、AST編集スクリプト、プログラム依存グラフ(PDG)の変化、などで表現される。ここで、トークンは、それ以上分解することができないプログラムの最小単位であり、プログラミングの命令文は複数のトークンによって構成される。また、AST編集スクリプトは、ソースコードの差分をAST間の差分として表現したものである。本実施の形態では、コード変更パターンとしてPDGの変化で表現するものを対象とする。PDGの変化は、プログラムの意味的なつながりを考慮した変更パターンを表現できるというメリットがあり、他の2つの表現よりもより柔軟にコード変更パターンを表現することができる。
【0023】
図3は、PDGの変化を示すチェンジグラフからコード変更パターンをマイニングする処理のフローチャートを示す図である。チェンジグラフは、コード変更前のプログラムとコード変更後のプログラムのメソッドの変更差分から計算されるグラフである。コード変更パターンのマイニング処理は、開発履歴中のバージョン毎に(S10)、そして、変更されたメソッド毎に(S11)、変更されたメソッドmの変更差分からチェンジグラフCGmを計算する処理(S12)を繰り返す。そして、マイニング処理は、計算されたチェンジグラフ群から所定の頻度以上の頻出サブグラフをマイニングする(S13)。この頻出サブグラフがコード変更パターンに相当する。
【0024】
[PDGの変化としてコード変更パターンをマイニングする詳細処理]
図4は、PDGの変化としてコード変更パターンをマイニングする詳細処理のフローチャートを示す図である。
図4のフローチャートは、
図2のコード変更パターンのマイニング処理S1のフローチャートであり、
図4中の処理S20~S23は、
図3のメソッドmの変更差分からチェンジグラフCGmを計算する処理に対応する。以下、具体例を示しながら
図4のフローチャートを説明する。
【0025】
図4、S20:コード変更パターンのマイニング処理では、開発履歴群10内の複数のソースコードをそれぞれASTに変換し、AST群50に蓄積する。
【0026】
図5は、ソースプログラム例に対するAST例を示す図である。ソースプログラムSP10の例は、メインメソッドm()のブロック{ }内にメソッド文send(readLines(“a.csv”))が含まれる。
図5には、このソースプログラムSP10のASTの例が示される。ASTは、ソースコードをプログラミング言語で規定される構文構造に基づいて解析し、木構造に表現したものである。一般に、ASTは、ソースコード内のスペース等、プログラミング言語上意味を持たない要素が除去された状態になる。
【0027】
図5のASTの例には、各ノードの先頭に構文要素の種別の略称が示される。それぞれの略称の種別は以下の通りである。
MD: method declaration(メソッド宣言)
BLK: block(JAVAのブロック)
ES: expression statement(式の文)
MI: method invocation(メソッド呼び出し)
A: Assignment(代入)
SN: simple name(名前)
L: literal(固定値)
【0028】
図5のASTには、ノードとして、上からメソッド宣言MD:m()、ブロックBLK:{…}、式の文ES:send(…)、メソッド呼び出しMI:send(…)、名前SN:send、メソッド呼び出しMI:readLines(…)、名前SN:readLines、固定値L:“a.csv”が含まれる。ノード間の矢印方向のノードは子ノード、矢印反対方向のノードは親ノードである。
【0029】
図4、S21:コード変更パターンのマイニング処理では、AST差分計算アルゴリズムにより、コード変更前後のAST間の対応関係51が計算される。
【0030】
図6は、コード変更前のASTと変更後のASTと両AST間の対応関係の具体例を示す図である。コード変更前(before)のASTbは、
図5と同じである。コード変更後(after)のASTaは、ASTbのソースコードが、コード差分CD1に示したように行先頭「-」の文を行先頭「+」の文に変更した変更後のソースコードのASTである。
【0031】
AST差分計算アルゴリズムは、ノード種別の類似性、木構造の類似性等、複数の類似性基準を総合して、対応するノードの組を特定する。例えば、AST差分計算アルゴリズムは、ノード種別の類似度と木構造の類似度が共に0.7以上のノードの組に、ノード間の対応関係(map辺)を付与する。
図6のノードSN:readLinesとノードSN:readCSVは、例えば、ASTの根ノードMD:m()からの距離が共に5、ラベル(readLine、readCSV)の文字列が類似、子ノードの数が共に0と同じ、等の類似性があるため、両ノード間に対応関係を示すmap辺が付与される。それ以外の2つのmap辺も、同等の類似性があるため付与される。AST差分計算アルゴリズムは、例えば、Diff/TSなどが知られている。
【0032】
上記のとおり、AST差分計算アルゴリズムは、対応関係の基準(類似性が一定以上)を満たしたノード間にのみ対応関係を示すmap辺を付与する。類似性の計算については、AST差分計算アルゴリズムに依存して異なり、それぞれの類似性の計算には一長一短があり、完全に正確な対応関係を計算できるアルゴリズムはほとんどない。
【0033】
図4、S22:コード変更パターンのマイニング処理では、変更前後のコードを細粒度PDG(fgPDG: fine-grained Program Dependence Graph)に変換し、fgPDG群52に蓄積する。
【0034】
図7は、ソースプログラムのコードから変換したfgPDGの例を示す図である。ソースプログラムSP11は、メインメソッドm()内に代入文n = graph.getName()を有する。PDGは、プログラムコード内の文(statement)や式(expression)等の要素と、要素間の依存関係をグラフ表現したものである。通常のPDGの場合、要素のノードには文や条件式が、ノード間の依存関係にはデータ依存や制御依存が、それぞれ用いられる。それに対して、細粒度PDG(fgPDG)では、ノードには文や条件式よりも単位が細かい式や演算子が用いられ、依存関係にはreceive(recv:受信)、parameter(para:パラメータ)、define(def:定義)、contorol(cont:制御)などの、データ依存や制御依存を細分化したものが用いられる。
【0035】
通常のPDGとは異なり、細粒度PDGは、データ依存や制御依存を文や条件式より細分化したコード間で表現でき、文や条件式の一部のみが変更されるようなコード変更パターンも容易に抽出できる。
【0036】
図7に示したソースプログラムのコードSP11から変換されたfgPDGは、代入文n = graph.getName()を細分化したノードgraph, getName, =, n等と、ノード間のデータ依存recv、para、defを有する。
【0037】
図4、S23:コード変更パターンのマイニング処理では、変更前後のコードからそれぞれ変換した変更前後のfgPDGに、ASTノード間のmap辺を追加してチェンジグラフを生成し、チェンジグラフ群53に蓄積する。
【0038】
図8は、チェンジグラフの例を示す図である。変更前のプログラムコードSP11とそれから変換された変更前のfgPDGbは、
図7の例と同じである。一方、変更後のプログラムコードSP12は、変更前のプログラムコードSP11の代入文n = graph.getName()が、n = resolve(graph)に変更されたものである。変更前の代入文n = graph.getName()は、インスタンスgraphに対してメソッドgetName()が名前を返して、変数nに代入する命令である。一方、変更後の代入文n = resolve(graph)では、メソッドgetNameが式graphを引数(パラメータ)とする。その結果、変更後のコードに対するfgPDGaは、引数graphとメソッドgetNameとの間のデータ依存関係がパラメータparaになることが、変更前のコードに対するfgPDGbと異なる。
【0039】
チェンジグラフCG1は、変更前のコードに対するfgPDGbと変更後のコードに対するfgPDGaに、両fgPDGのノード間の対応関係を示すmap辺が追加されたグラフ表示である。このmap辺は、図示しない変更前コードのASTbと変更後コードのASTaについて算出したノード間の対応関係mapのうち、チェンジグラフCG1内のノード間に対応するmap辺を追加されたものである。
【0040】
図8に示したチェンジグラフは、開発履歴群内の複数の変更前後のプログラムコードについてそれぞれ生成される。
【0041】
図4、S24:コード変更パターンのマイニング処理では、チェンジグラフのPDGノード間の対応関係(map辺)に基づいて、map辺を持つPDGノードを有するサブグラフのうち、複数のチェンジグラフ内に所定の頻度以上で含まれるサブグラフを、コード変更パターンとして抽出する。この結果、単数または複数のコード変更パターン11が生成される。
【0042】
図9は、複数のチェンジグラフから所定の頻度以上のサブグラフをコード変更パターンとして抽出する例を示す図である。
図9には、
図1のバージョンv1とv2のソースプログラムSP1、SP2と、それらのソースコードの変更前後のコードに対するチェンジグラフCG11、CG12が示される。バージョンv1でのチェンジグラフCG11は、コード変更前の代入文s=File.read(“a.txt”)と、コード変更後の代入文s=IO.read(“b.txt”)に対するfgPDGbとfgPDGaと、ノード”=”間のmap辺とを有する。同様に、バージョンv2でのチェンジグラフCG12は、コード変更前の代入文u=File.read(path)と、コード変更後の代入文u=IO.read(path)に対するfgPDGbとfgPDGaと、ノード”=”間のmap辺とを有する。
【0043】
そして、上記2つのチェンジグラフCG11、CG12の共通する部分が頻出サブグラフ、つまりコード変更パターンPTNとして抽出される。
【0044】
図2のS2、S3に示したとおり、マイニングされたコード変更パターンに基づいて、コード変更前のプログラムコード内のコード変更パターンの適用箇所の検出(S2)と、検出された適用箇所のコードをコード変更パターンに基づいてコード変更すること(S3)が行われる。
【0045】
図10は、コード変更パターンの適用箇所の検出とコード変更の例を示す図である。
図10には、
図1のバージョンv4のソースプログラムSP4とコード変更パターンPTNとが示される。変更後(after)のソースプログラムSP4に示すとおり、ソースプログラムSP4内の代入文t=File.read(“b.txt”)は、バージョンv1,v2と同様の変更が必要である。
【0046】
まず、コード変更前のソースプログラムSP4のコードから、コード変更パターンPTNの変更前(before)のPDGグラフと一致するコード辺t=File.read(“b.txt”)が、コード変更パターンPTNの適用箇所として検出される(S2)。次に、適用箇所のコード辺t=File.read(“b.txt”)が、コード変更パターンPTNの変更後(after)のPDGグラフに基づいて、コード辺t=IO.read(“b.txt”)に書き換えられる。つまり、map辺が形成されているノード”=”に繋がっているノードが、”File.read”から”IO.read”に書き換えられる。
【0047】
上記のように、チェンジグラフ群からマイニングしたコード変更パターンPTNを利用して、コード未変更のプログラム内の変更漏れを検出し、自動的にコード変更を行うことができる。
【0048】
[チェンジグラフ内のPDGノード間の対応関係が十分な例及び不十分な例]
コード変更パターンは、チェンジグラフ内のPDGノード間の対応関係(map辺)に基づいてマイニングされる。従って、PDGノード間の対応関係が十分な場合は、チェンジグラフ内のコード変更を追跡することができるが、不十分な場合は、コード変更を追跡することが困難または正確にできない。
【0049】
図11は、対応関係が十分でコード変更の追跡が容易な例と困難な例を示す図である。
図11には、コード変更が行頭の「-」(消去)と「+」(追加)で示されたソースプログラムSP21、SP22と、それぞれのソースプログラムに対するチェンジグラフの例CG21、CG22が示される。
【0050】
(A)のチェンジグラフCG21の場合は、beforeとafterのPDG内のノードsend(…)間にmap辺が生成されている。一方、(B)のチェンジグラフCG22の場合は、beforeのPDG内のノードsend(…)とafterのPDG内のノードpublish(…)との間にmap辺が生成されていない。このような場合、(A)のチェンジグラフCG21では、map辺が生成されたノードのsendの引数をreadLines(“a.csv”)からreadCSV(“b.csv”, …)に変更するパターンがチェンジグラフCG21から一意に読み取れる。一方、(B)のチェンジグラフCG22では、map辺が存在しないため、変更パターンがチェンジグラフから一意に読み取れない。例えば、before側のノードa, bがafter側のreadCSV, publishに変更するとも、”b.csv”, readCSVに変更するとも、before側のノードreadLines, sendがafter側のreadCSV, publishに変更するとも考えられ、変更パターンをグラフから一意に読み取れない。
【0051】
図12は、変更の追跡が容易にできる例のコード差分とAST差分計算結果の例を示す図である。
図13は、
図12のコード差分とAST間の対応関係から生成されたチェンジグラフの例を示す図である。
【0052】
図12のコード差分CD2の例は、コード変更が行頭の「-」(消去)と「+」(追加)で示されるとおり、メソッド宣言(MD)と、ブロック(BLK)と、メソッドsendとが対応し、AST差分計算結果では、ノードMD:m(), BLK:{…}, ES:..., ES:send(…), MI:send(…), SN:send, SN:readLinesとSN:readCSVにmap辺が生成される。
【0053】
前述したとおり、map辺はAST差分計算アルゴリズムによりノード種別、構造等の類似性から計算され、AST差分計算アルゴリズムによりmap辺の付与され方が異なる。
図12のコード差分の例では、同一ラベル名を持つノードが多いためmap辺も多く張られる。但し、AST差分計算では、ラベル名だけでなく、ノード種別、ツリー構造等を総合的に考慮してmap辺を張るか否かが決定されるので、ラベル名が同じの場合常にmap辺が生成されるとは限らない。また、
図12において、ノードSN:readLinesとSN:readCSVにmap辺が生成されたのは、それらのラベルが類似し、それらを引数とするメソッドsendが同じだからである。
【0054】
図13のチェンジグラフは、
図12のコード差分とAST間の対応関係から生成される。具体的には、(1)ASTノードを基にfgPDGノードを生成する。この場合、ASTノードよりfgPDGノードの方が抽象度が高いので、ASTノードの一部のみに対応するfgPDGノードが存在する。例えば、
図12のAST上のMD, BLK, ES, MI直下のSNはfgPDGノードとはならず、AST上のMI, LはfgPDGノードとなる。(2)次に、ASTノード間にmap辺が存在する場合、対応するfgPDGノード間にもmap辺が付与される。ASTノード間にmap辺が存在しない場合、対応するfgPDGノード間にもmap辺は付与されない。
【0055】
その結果、
図13のチェンジグラフでは、ノードMI:send(…)間のmap辺が残っている。但し、ノードMI:readLines、MI:readCSV間にはmap辺は存在しない。AST上の他のmap辺は、map辺が張られたASTノードがfgPDGノードとして残らなかったため、それらmap辺はチェンジグラフ内には残っていない。例えば、AST上のノードSN:readLines、SN:readCSV間のmap辺は、チェンジグラフ上にはない。但し、
図13のチェンジグラフでは、ノードMI:send(…)間のmap辺に基づいて、コード変更パターンを一意にマイニングすることができる。
【0056】
ASTノード間のmap辺(対応関係)を対応するfgPDGノード間に付与するとき、チェンジグラフのfgPDGノードとASTノードとの対応関係が明らかである必要がある。一般にPDG, fgPDGは、ソースコードを構文解析したASTを基に作成される。この場合、各ASTノードを分解、削除してfgPDGノードが生成される。このため、ASTからfgPDGを作成すると同時に、どのfgPDGノードがどのASTノードに対応するのかという対応情報が得られる。この対応情報を利用することで、fgPDGノードに対応するASTノードにmap辺があるか否かを調べて、map辺を持つASTノードからそれと対応するfgPDGノードへmap辺が転写される。
【0057】
図14は、変更の追跡が困難な例のコード差分とAST差分計算結果の例を示す図である。
図15は、
図14のコード差分とAST間の対応関係から生成されたチェンジグラフの例を示す図である。
【0058】
図14のコード差分の例は、コード変更が行頭の「-」(消去)と「+」(追加)で示されるとおり、メソッド宣言(MD)と、ブロック(BLK)とが対応し、AST差分計算結果では、ノードMD:m(), BLK:{…}, SN:readLinesとSN:readCSVに3つのmap辺map20, map21, map22がそれぞれ生成されている。このように生成されたmap辺が3個しかない理由は、ASTのBefore, After間では、異なるラベル名を持つノードが多く、AST差分計算アルゴリズムがノード間の類似度が低いと判定したことによる。
【0059】
図15のチェンジグラフでは、fgPDGノードMI:send(…)とMI:publish(…)間にはmap辺が存在しない。これらのfgPDGノードに対応するASTノード間にmap辺が張られなかったからである。また、AST上でmap辺が生成されたASTノードは、チェンジグラフでfgPDGノードとして生成されなかったため、それらのmap辺もチェンジグラフには残っていない。その結果、
図15のチェンジグラフでは、map辺が張られていないため、コード変更パターンをマイニングすることは困難である。
【0060】
[本実施の形態]
従来のAST差分計算アルゴリズムは、ノードのラベル名、ノード種別、ツリー構造等を総合的に考慮してASTノード間にmap辺を生成するか否かを判定する。そして、チェンジグラフの変更前のfgPDGbと変更後のfgPDGaとの間では、map辺が生成されたASTノード間に対応するfgPDGノード間にmap辺を生成する。また、チェンジグラフ内のmap辺の数が少ない場合、コード変更パターンを一意に追跡することが困難な場合がある。
【0061】
本実施の形態では、チェンジグラフ内のmap辺の数を増やしてコード変更パターンを一意に追跡することを容易にする。チェンジグラフにおける変更前fgPDGbと変更後fgPDGaの間のmap辺は、従来技術では非変更ノード間に生成される傾向がある。例えば、
図13のチェンジグラフに示したノードMI:send(…)間のmap辺は、非変更ノード間に張られている。本実施の形態では、チェンジグラフにおける変更前fgPDGbと変更後fgPDGaの間のmap辺が、変更ノード間、非変更ノード間のいずれにも生成される。
【0062】
図16は、本実施の形態におけるチェンジグラフの例を示す図である。
図16のチェンジグラフの例では、チェンジグラフのfgPDGノードm1間に図示しないASTノード間のmap辺が引き継がれている。このmap辺は非変更ノード間の対応関係である。一方、チェンジグラフのfgPDGノードm2、m3間は変更ノード間である。本実施の形態では、この変更ノード間にもmap辺map2_3が生成される。
【0063】
これを可能にするために、本実施の形態では、(1)AST上でmap辺を親ノード及び子ノードに伝搬してmap辺の数を増加させる。これにより、チェンジグラフ上でのfgPDGノード間のmap辺を増加させる。(2)更に、必要があれば、チェンジグラフ上でラベル同一性に基づいてmap辺を補足する。
【0064】
図17は、本実施の形態により増加されたチェンジグラフ上でのfgPDGノード間のmap辺の例を示す図である。
図17の(A)は、
図15のチェンジグラフと同じであり、fgPDGノード間のmap辺は生成されていない。一方、
図17の(B)は、本実施の形態によりfgPDGノード間のmap辺が生成されたチェンジグラフの例である。本実施の形態によれば、上記の(1)(2)の処理によりfgPDGノード間のmap辺が増えるので、チェンジグラフからコード変更パターンを一意にマイニングすることが容易になる。
【0065】
図18は、本実施の形態における開発支援装置の構成例を示す図である。開発支援装置1は、サーバ、パーソナルコンピュータ、タブレット端末などである。開発支援装置1は、プロセッサ30、メインメモリ32、ネットワークインターフェース34、バス36、及び大容量のストレージである補助記憶装置20を有する。ストレージ20には、開発支援プログラム21、開発履歴群(ソースコード群)10、コード変更パターン11、変更対象プログラム12、変更済みプログラム13がそれぞれ格納される。プログラム開発を支援する開発支援プログラム21は、コード変更パターンをマイニングするコード変更パターンマイニングプログラム21Aと、コード変更パターンに基づいて変更対象プログラム26の一部のコードを変更して変更済みプログラム28を生成するコード変更プログラム21Bとを有する。
【0066】
ネットワークインターフェース34は、例えばインターネットなどのネットワークNWを介して、クライアント端末装置40、42からアクセス可能である。プログラム開発の支援を受けたいユーザは、クライアント端末装置から開発支援装置1にアクセスし、コード変更パターンのマイニングと、コード変更パターンに基づくコード変更の支援を受ける。
【0067】
[本実施の形態におけるコード変更パターンのマイニング処理]
図19は、本実施の形態におけるコード変更パターンをマイニングする詳細処理のフローチャートを示す図である。開発支援装置1のプロセッサ30が、コード変更パターンマイニングプログラム21Aを実行して、
図19に示す各処理を実行する。
図19には、
図4に示したコード変更パターンのマイニングの詳細処理フローチャートに、AST上でmap辺を伝搬しmap辺を追加する処理S21Aと、チェンジグラフ上でラベル同一性に基づきmap辺を補足する処理S23Aとが追加されている。この2つの処理S21AとS23A以外の処理は
図4と同じであるので、
図4の説明を参照する。
図19では2つの処理S21AとS23Aについて説明する。
【0068】
[AST上でmap辺を伝搬してmap辺を追加する処理S21A]
図20は、AST上でmap辺を伝搬しmap辺を追加する処理S21Aのフローチャート例を示す図である。
図19に示すとおり、プロセッサ30は、コード変更パターンマイニングプログラム21Aを実行し、開発履歴群10内のソースコードをASTに変換し(S20)、コード変更前後のAST間の対応関係をAST差分計算アルゴリズムにより計算する(S21)。
【0069】
そして、プロセッサは、AST上に生成されたmap辺を伝搬しAST上のmap辺を増加する(S21A)。AST上のmap辺の伝搬では、親ノード及び子ノードへ再帰的に伝搬させる。このmap辺の伝搬処理では、例えば、あるmap辺mがAST上のノードn1, n2間に存在するとき、そのmap辺mを、ノードn1,n2の親ノードへ伝搬し(map辺を親ノード間に生成し)、子ノードにも伝搬する(map辺を子ノード間に生成する)。そして、親ノードへの伝搬と、子ノードへの伝搬は、AST上のmap辺が十分に生成されるまで再帰的に繰り返す。例えば、map辺の伝搬によるmap辺の増加が飽和し、map辺の数が変化しなくなるまで繰り返す。あるいは所定数又は所定割合map辺が増加するまで繰り返す。
【0070】
図20に示すとおり、プロセッサは、AST上で伝搬可能なmap辺がなくなるまで処理S31~S33を繰り返す(S30)。プロセッサは、まず、AST上でのmap辺eをそのmap辺が生成されたASTノードの親ノードへ伝搬し、親ノード間に新たなmap辺を生成し、新たなmap辺をmap辺集合E内に追加する(S31)。
【0071】
図21は、AST上での親ノードへのmap辺の伝搬処理例を示す図である。
図21のASTは、
図12のASTの一部を示す。
図21は、AST差分計算アルゴリズムによりASTノードn1, n2(SN:readLines、SN:readCSV)間にmap辺map1が生成された例である。この場合、プロセッサは、ASTノードn1, n2の親ノードp(n1), p(n2)間にmap辺が存在しなければ、ASTノードn1, n2間に生成されたmap1を、そのASTノードn1, n2の親ノードp(n1), p(n2)(MI:readLines(…)、MI:readCSV(…))間に伝搬し、親ノードp(n1), p(n2)間に新たなmap辺map2を生成する。この結果、AST上のmap辺は、1つから2つに増加する。
【0072】
図20に示すとおり、次に、プロセッサは、AST上でのmap辺eをそのmap辺が生成されたASTノードの子ノードへ伝搬し、子ノード間に新たなmap辺を生成し、新たなmap辺をmap辺集合E内に追加する(S32)。更に、プロセッサは、伝搬先の子ノード以下の部分ASTに対して、AST差分計算を実行する(S33)。
【0073】
図22は、AST上での子ノードへのmap辺の伝搬処理例を示す図である。
図22は、AST差分計算アルゴリズムによりASTノードn1, n2(BLK:{…}、BLK:{…})間にmap辺map10が生成され、更に、ASTノードn1, n2の子ノードc(n1), c(n2)間にmap12, map13が生成された例である。この場合、プロセッサは以下の処理(A)(B)を実行する。
【0074】
(A)プロセッサは、次の条件が全て成立するとき、子ノードc1,c2間に新たなmap11を生成する(S32)。
(1)ノードn1, n2間にmap辺が存在する。
(2)ノードn1の子ノードc(n1)の中でmap辺がない子ノードが1つだけ存在する。
(3)ノードn2の子ノードc(n2)の中でmap辺がない子ノードが1つだけ存在する。
【0075】
図22の例では、ノードn1, n2にそれぞれ3つの子ノードc(n1)、c(n2)が存在し、3つの子ノードそれぞれの左側2つの子ノード間にはそれぞれmap12, map13が存在し、それぞれの右端の1つの子ノードc(n1) =c1、c(n2) =c2間にはmap辺がない。そこで、プロセッサは、右端の1つの子ノードc(n1)=c1、c(n2)=c2間に新たなmap11を追加し、新たなmap辺をmap辺集合Eに追加する(S32)。
【0076】
(B)プロセッサは、子ノードc1, c2間に新たなmap11が追加されたとき、子ノードc1, c2の子孫ノードにmap辺が存在しない場合、子ノードc1,c2をASTの根(root)とする部分AST(c1), AST(c2)について、AST差分計算を実行する(S33)。AST差分計算により部分AST(c1)、AST(c2)内に新たなmap辺が追加されたら、そのmap辺をmap辺集合Eに追加する。
【0077】
図22の例では、子ノードc1, c2の子孫ノードにmap辺が存在しないので、子ノードc1,c2をASTのrootとする部分AST(c1), AST(c2)について、AST差分計算が実行される。子ノードc1,c2の子孫ノードにmap辺が存在していた場合、部分AST(c1)、AST(c2)間でAST差分計算を実行して、既存のmap辺が張られている子孫ノードとは異なる子孫ノード間に新たなmap辺が追加されると、新旧のmap辺の間で矛盾することになる。そのため、子ノードc1, c2の子孫ノードにmap辺が存在しない場合に、部分AST(c1)、AST(c2)間でAST差分計算を実行する。
【0078】
上記のAST上でmap辺を伝搬してmap辺を追加する処理では、AST差分計算アルゴリズムで類似度が基準未満であるためmap辺が生成されなかったASTノード間に、新たなmap辺を生成する。従って、AST上でのmap辺の親ノード及び子ノードへの伝搬で生成されたmap辺は、類似度が基準値未満であり、信頼性の低い不正確なmap辺の可能性がある。しかし、AST上で生成された不正確なmap辺がチェンジグラフに生成されたとしても、その後、複数のチェンジグラフにおいて頻出サブグラフ(頻出するノード対とmap辺)を抽出する処理で、信頼性が低く不正確なmap辺は抽出されない。その結果、頻出サブグラフのマイニング処理で不正確なmap辺が除外され、頻出サブグラフとして抽出されるコード変更パターンは、信頼性が高く正確なmap辺に基づくものとなる。
【0079】
[AST上で親ノード及び子ノードへのmap辺の伝搬の具体例]
図23~
図25を参照して親ノード及び子ノードへのmap辺の伝搬の具体例を説明する。
図14(コード変更の追跡が困難な例)のコード差分とAST差分計算結果の例について、親ノード及び子ノードへのmap辺の伝搬を行う例を説明する。
図14では、AST差分計算の結果、ASTノード間にmap20, map21, map22が生成されている。
【0080】
図23は、
図14のAST上で親ノードへmap辺を伝搬した例を示す図である。
図23に示すとおり、プロセッサが、AST差分計算で生成されたmap辺map22を、親ノード方向へ3回再帰的に伝搬した結果、AST上に新たなmap辺map23, map24, map25を生成する。
【0081】
図24は、
図23のAST上で子ノードへmap辺を伝搬した例を示す図である。map21が生成されたノードBLK:{…}それぞれの子ノードにmap辺が形成されていない単一の子ノードES:…がそれぞれ存在している。そこで、プロセッサは、ノードBLK:{…}間のmap21を、子ノードES: ES:…間に伝搬して新たにmap26を生成する。更に、プロセッサは、map26を子ノードに伝搬して新たにmap27を生成する。そして、プロセッサは、map24を子ノードに伝搬して新たにmap28を生成する。
【0082】
図25は、
図24のAST上のmap辺に基づいてmap辺が生成されたチェンジグラフの例を示す図である。チェンジグラフは、プログラムのデータや制御のフローに必要なノードを有するfgPDGを、変更前後のソースコードに対して生成したfgPDGb, fgPDGaを有する。
図14のASTのグラフに対するチェンジグラフを示す
図15には、map辺が生成されていなかったが、
図25では、
図24中のmap23, map24, map27が残されている。
図25のチェンジグラフは、
図15のmap辺が何も生成されてないチェンジグラフより、コード変更パターンを一意に追跡することが容易になっている。
【0083】
図13で述べたとおり、
図25のチェンジグラフでは、
図24のAST上のMD, BLK, ES, MI直下のSNはfgPDGノードとはならず、AST上のMI, LがfgPDGノードとなる。しかし、
図25には十分な数のmap辺が残っている。その結果、プロセッサは、
図14のコード差分に示した変更前後のコードsend(readLines(“a,csv”)、publish(readCSV(“b.csv”, …)のコード変更に必要なコード変更パターンを容易に抽出できる。
【0084】
[チェンジグラフ上でラベル同一性に基づきmap辺を補足する処理S23A]
図26は、チェンジグラフ上でラベル同一性に基づきmap辺を補足する処理S23Aのフローチャート例を示す図である。プロセッサは、チェンジグラフ上のmap辺が生成されたfgPDGノード対na, nbから、親ノード方向又は子ノード方向の同じ依存辺をたどり所定ホップ数以内に同じラベルを持つfgPDGノード対に到達できる場合、到達したfgPDGノード対に新たなmap辺を追加する(S41)。プロセッサは、チェンジグラフ上のmap辺が生成されたfgPDGノード対毎に、前記処理S41を繰り返す(S40)。所定のホップ数は、パラメータであり、取得したいコード変更パターンの大きさに応じて調整または設定される。依存辺とは、fgPGDでのデータ又は制御の依存を示す矢印である。
【0085】
図27は、チェンジグラフ上でラベル同一性に基づきmap辺を補足する処理S23Aの具体例を説明するASTの図である。
図28は、チェンジグラフ上でラベル同一性に基づきmap辺を補足する処理S23Aの具体例を説明するチェンジグラフの図である。
【0086】
まず、
図27に示す通り、変更前のソースプログラムSP31は、ブロック内に2つの文val=xxx, send(val)を含む。これらの文(Sentence)はそれぞれ式(Expression)を有する。一方、変更後のソースプログラムSP32は、ブロック内に文if(…){}が追加され、{}内に文val=yyyを有する。この文は、文val=xxxから変更されたものである。さらに、文send(val)から変更された文publish(…, val)を有する。
【0087】
上記の変更前後のプログラムからそれぞれ生成されたAST間には、AST差分計算アルゴリズムにより、実線で示した対応関係map30, map31が生成されたものとする。そして、前述のAST上でmap辺を伝搬してmap辺を追加する処理S21Aにより、破線で示した対応関係map32, map33が追加されたものとする。AST上のノードn11、n12の間にはmap31が生成されるが、代入文val=xxxとval=yyyとはコード変更前後の文ではあるが、ノードn13, n14との間にはmap辺は生成されていない。その理由の1つは、ノードn13はノードBLK:{…}から3ホップ下に位置し、ノードn14はノードBLK:{…}から5ホップ下に位置することから、AST構造上の乖離が大きいため、AST差分計算アルゴリズムでは類似性が低いと判定されたことである。
【0088】
図28に示す通り、チェンジグラフでは、
図27のAST上生成されたmap31, map32が残されている。そこで、プロセッサが、チェンジグラフ上でラベル同一性に基づきmap辺を補足する処理S23Aを実行すると、map31が生成されているノード対n11, n12から親ノード方向の依存辺refをたどり、同一ノード対n13, n14間のmap34と、同一ノード対n15, n16間のmap35とをそれぞれ追加する。
【0089】
変更前後のソースプログラム内の代入文val=xxxとval=yyyは、共に、メソッドsend(val)とpublish(…, val)の引数valである。AST上では構造上離れた位置にあったが、チェンジグラフ上では、上下のノードSN:valが依存辺refで繋がっている。この関係により、同一ノード対n13, n14間のmap34と、同一ノード対n15, n16間のmap35とが追加生成される。この結果、代入式A:=のノードn15, n16周辺の変化を追跡できるようになる。
【0090】
上記のチェンジグラフ上でラベル同一性に基づきmap辺を補足する処理S23Aは、AST上でmap辺を伝搬してmap辺を追加する処理S21Aで十分なmap辺を生成できない場合の補足する処理である。処理S23Aで生成される新たなmap辺も、類似性が低く不正解なmap辺の可能性がある。しかし、処理S21Aでの説明と同様に、複数のチェンジグラフ内の頻出サブグラフをマイニングする処理によって、類似性が低く不正解なmap辺は除去されていくので、コード変更パターンとして抽出されない。
【0091】
以上の通り、本実施の形態によれば、コード変更前後のソースコードから生成した変更前後のAST間に生成した類似するASTノード間の対応関係(map辺)を、AST上で親ノードまたは子ノード方向に伝搬してmap辺を追加する。これにより、チェンジグラフ上のmap辺を増やすことができる。その結果、チェンジグラフ上でコード変更をより正確に追跡することができ、チェンジグラフから一意に抽出できるコード変更パターンを増やすことができる。
【符号の説明】
【0092】
AST:抽象構文木
PDG:プログラムディペンデンスグラフ
1:開発支援装置
10:開発履歴
11:コード変更パターン
12:変更対象プログラム
13:変更済みプログラム
21:開発支援プログラム
21A:コード変更パターンマイニングプログラム
21B:コード変更プログラム