(57)【特許請求の範囲】
【請求項１】
構文解析手段が、ソースコードの命令文の意味を解析して抽象構文木を生成する構文解析工程と、
依存関係分析手段が、前記抽象構文木に含まれる命令文を検索し命令文同士の繋がりを分析することで、前記命令文の依存関係を生成する依存関係分析工程と、
影響波及分析手段が、影響元の命令文と影響先の命令文を特定した前記依存関係に基づいて、影響元の命令文から影響先の命令文を辿り、さらに当該影響先の命令文を影響元の命令文として他の命令文を影響先の命令文として辿ることを、抽象構文木内の命令文について基点から繰り返すことで、影響波及範囲を特定する影響範囲分析工程と、
を行う影響範囲調査方法。
【請求項２】
ソースコードの文法を解析して抽象構文木を生成する構文解析手段と、
前記抽象構文木に含まれる命令文を検索し命令文同士の繋がりを分析することで、前記命令文の依存関係を生成する依存関係分析手段と、
影響元の命令文から前記依存関係に基づいて影響先の命令文を特定し、当該影響先の命令文を影響元の命令文として前記依存関係に基づいて他の命令文を影響先の命令文として特定することを、抽象構文木内の命令文について基点から繰り返すことで、影響波及範囲を特定する影響範囲分析手段と、
を備えた影響範囲調査装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムの影響範囲調査方法及び影響範囲調査装置に関する。
【背景技術】
【０００２】
大規模システムの改修の時にプログラムの改修に伴なって他のプログラムへの影響波及調査の精度向上と作業効率向上が求められる。
【０００３】
従来、影響波及調査のために「メソッドの呼出関係」を中心とした影響波及洗い出し方法が用いられて来た。
【０００４】
特許文献１には、設計上の論理構造であるモジュール、ファイル、関数、ソースコードの階層構造ごとに比較すべき項目を定義し、比較を行うことが記載されている。
【０００５】
特許文献２には、従来、分析ルールを規定し、これに基づいて変更の影響度分析を行うこと、この方法ではルールの作成に時間がかかるので、ソースコードの変更対象項目毎にその変更で想定されるすべての検証方法が記載された影響度分析図を記憶することが記載されている。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２００６−２７７１２７号
【特許文献２】特開２００９−１５７５０５号
【発明の概要】
【発明が解決しようとする課題】
【０００７】
従来のメソッドの呼出関係による影響波及の洗い出しでは、影響のないクラス／メソッド大量に抽出される、呼出関係を辿る階層を指定する必要があるなどの問題がある。
【０００８】
また、影響度分析図を記憶する方法では、この影響度分析図の構成に多大な時間を要するなどの問題がある。
【０００９】
本発明は、かかる点に鑑みて影響波及のないクラス及びメソッドは抽出することがなく、影響波及の範囲を機械的に設定することができ、大規模システムの改修の時に、影響波及調査の精度向上を図り、作業効率向上を図ることができるようにすることを目的とする。
【課題を解決するための手段】
【００１０】
本発明は、構文解析手段が、ソースコードの命令文の意味を解析して抽象構文木を生成する構文解析工程と、
依存関係分析手段が、前記抽象構文木に含まれる命令文を検索し命令文同士の繋がりを分析することで、前記命令文の依存関係を生成する依存関係分析工程と、
影響波及分析手段が、影響元の命令文と影響先の命令文を特定した前記依存関係に基づいて、影響元の命令文から影響先の命令文を辿り、さらに当該影響先の命令文を影響元の命令文として他の命令文を影響先の命令文として辿ることを、抽象構文木内の命令文について基点から繰り返すことで、影響波及範囲を特定する影響範囲分析工程と、
を行う影響範囲調査方法を提供する。
【００１１】
本発明は、ソースコードの文法を解析して抽象構文木を生成する構文解析手段と、
前記抽象構文木に含まれる命令文を検索し命令文同士の繋がりを分析することで、前記命令文の依存関係を生成する依存関係分析手段と、
影響元の命令文から前記依存関係に基づいて影響先の命令文を特定し、当該影響先の命令文を影響元の命令文として前記依存関係に基づいて他の命令文を影響先の命令文として特定することを、抽象構文木内の命令文について基点から繰り返すことで、影響波及範囲を特定する影響範囲分析手段と、
を備えた影響範囲調査装置を提供する。
【００１２】
なお、本発明では、ソースコードをインプットすることとしているが、ここではバイトコードを含む概念で使用する。バイトコードとは、特定のＯＳやハードウェアに依存しないように定義された命令によって記述された実行形式のプログラムを意味し、人間の書いた設計図であるソースコードと実際にコンピュータで実行可能なネイティブコードの中間に当たる形式のものであり、ここではソースコードとして取り扱って差しつかえない。
【発明の効果】
【００１３】
本発明によれば、上述したようにソースコードの構文解析によって命令文同士の依存関係を付与し、影響波及範囲の設定及び特定を行うようにしているので、影響のないクラス／メソッドを抽出することがなく、影響波及の範囲を命令文から機械的に設定でき、大規模システムの改修の時に、影響調査の精度向上を図り、作業効率の向上を図ることができる。
【図面の簡単な説明】
【００１４】
【図１】本発明の実施例の構成をブロックで示す図。
【図２】本実施例で採用されるエンジンの構成を示す図。
【図３】本実施例の処理の流れを示す図。
【図４】構文の解析例を示す図。
【図５】命令文同士の依存関係の付与の例を示す図。
【図６】影響波及範囲の設定による依存関係グラフを示す図。
【図７】図６にクラス及びメソッド関係を加えた図。
【図８】図６に示す命令文と命令文の繋がりの具体例を示す図。
【図９】依存関係を辿った影響波及調査の例を示す図。
【図１０】影響波及範囲の結果を示す図。
【図１１】従来例による影響波及の結果を示す図。
【図１２】従来例による影響波及の結果を示す図。
【図１３】従来例による影響波及の結果を示す図。
【図１４】本実施例による影響波及の結果を示す図。
【発明を実施するための形態】
【００１５】
以下、本発明の実施例を図面に基づいて説明する。
【実施例】
【００１６】
図１は、本発明の実施例のプログラムの影響範囲設定装置の構成をブロックで示す図である。
【００１７】
図１において、プログラムの影響範囲設定装置１００は、入力手段１、演算処理手段２、出力手段３及びデータベース４から構成される。
【００１８】
入力手段１には、外部から大規模システムの時に改修対象となるプログラム５及び基点となる命令文６が入力される。
【００１９】
演算処理手段２は次のような処理手段（機能）を備える。
【００２０】
・ソースコードの構文解析（すなわち文法解析）
・抽出構文木分析
・命令文検索
・命令文繋がりの形成
・共有命令文の抽出
・命令文による依存関係
・グラフの形成
・影響範囲の設定
・影響範囲の特定
出力手段３は、
・依存関係の辿り
・設定された影響範囲
・特定された影響範囲
を出力し、画面表示装置７の画面８に表示する。
【００２１】
データベース４は、演算処理手段２で演算処理されることで生成された命令文による依存関係グラフ（すなわちデータ）を格納する。
【００２２】
演算処理手段２について説明する。
【００２３】
ソースコードの構文解析手段は、プログラムのソースコードを構文解析する。
【００２４】
抽象構文木分析手段は、構文解析に基づいて階層構造としての抽象構文木に分析する。
【００２５】
命令文検索手段は、抽象構文木を形成する命令文を検索する。抽象構文木に表現されている全てのノード（行、命令文）について依存関係を分析し、命令文を検索する。
【００２６】
命令文繋がり作成手段は、検索された命令文から命令文の依存関係に従って命令文の繋がりを形成する。命令文の繋がりは複数のソースコードについて形成される。
【００２７】
共有命令文の抽出手段は、同一であるときに当該命令文はそれぞれのソースコードに共有された命令文として抽出する。
【００２８】
命令文による依存関係グラフの形成手段は、他のプログラムとの関係で、共有された命令文と依存関係で繋がった命令文との組み合わせを含んで複数のソースコードについて命令文による依存関係グラフを形成する。
【００２９】
影響波及範囲設定手段は、依存関係グラフを基にして、依存関係にある影響波及範囲を設定する。
【００３０】
影響波及範囲特定手段は、設定された影響波及範囲を基に、影響波及範囲を特定する。
【００３１】
図２は、本実施例を用いるエンジンの構成を示す。
【００３２】
エンジンは、言語依存部分と言語非依存部分とから構成される。（１）構文解析に際しては、各種のプラグイン、例えばＡ分析プラグイン、Ｂ分析プラグイン、Ｃ分析プラグインが用いられる。１つのプラグインでもよい。
【００３３】
図２に示すように、構文解析がなされ、抽出構文木が解析され、（２）依存関係分析がなされる。この分析によって依存関係が形成され、次いで（３）影響波及分析がなされる。この分析によって影響波及結果が生成される。
【００３４】
図３は、処理の流れを示す。
【００３５】
ソースコードについて（１）文法解析を行う（Ｓ１）。ソースコードだけでは不足する型情報等をバイトコードなどの補完情報で補完するようにしてもよい。ここで補完するとは、ソースコードだけでは不足する情報を補うための補足情報をいう。例えばJava（登録商標）言語におけるclassやjarファイルの情報を指す。
（１）構文解析に基づいて抽象構文木を形成し（Ｓ２）、（２）依存関係分析を行う（Ｓ３）。この分析結果により依存関係を形成し（Ｓ４）、影響の基点を基に、（３）影響波及分析を行う（Ｓ５）。この分析結果により影響波及結果を生成する（Ｓ６）。
【００３６】
図４は、ソースコードの構文解析手段及び抽象構文木分析手段によってソースコードの文法を解析し、抽象構文木を分析し形成することを示す。ここでは、人間の目で追うことに近付けるために、ソースコードの各命令文の意味を解析し、その結果を抽象構文木に変換する。抽象構文木を分析し、命令用語から命令文を検索する。
【００３７】
図５は、命令文同士の繋がりを分析することを示す。
【００３８】
例えば、メソッド呼出し文は、呼出先のメソッド宣言に繋がる。このように、メソッド呼出しだけでなく、変数の利用と宣言など、全ての命令文について繋がりを付与する。これを依存関係と呼ぶ。
【００３９】
依存関係は影響波及を辿る道筋として用いる。
【００４０】
図６は、影響波及範囲の設定及び影響波及範囲の特定を示す。
【００４１】
図６には、命令文１及び命令文２を基点とするソースコードの一連の命令文の繋がりが記載されている。
【００４２】
命令文１を起点とするソースコードと命令文２を起点とするソースコードは、命令文５は同一であると、それぞれのソースコードに共有された命令文となっていることを示す。
【００４３】
命令文５は命令文７、命令文８が繋がり、命令文７には命令文９が繋がる。
【００４４】
図に示すように命令文５、命令文７、命令文９は、他のプログラムとの関係で、それぞれのソースコードに共有された命令文の繋がりを形成している。
【００４５】
共有された命令文と依存関係で繋がった命令文との組み合わせを含んで複数のソースコードについての命令文による依存関係グラフが形成され、影響波及範囲が設定される。影響波及の調査は、命令文同士の依存関係を辿ることで行う。今、起点とされたソースコードの内、命令文２についてのソースコードを基点のソースコードとする。基点となる命令文２を指定し、基点となる命令文の依存関係を辿ることで設定された影響波及範囲が特定される。
【００４６】
図７は、図６に示す状態でクラスやメソッドとの関係を示す。
【００４７】
図７において、命令文はクラスやメソッドに所属している。
【００４８】
よって命令文を辿ることで、所属しているクラスやメソッドを特定することができる。例えば、命令文１はクラスＡのメソッドαに所属している。
【００４９】
図８は、図６に示す命令文と命令文の繋がりを具体例で示す。
【００５０】
図８において、ソースコードの命令文単位で影響波及のルートが示され、影響波及対象の命令文は命令用語から自動的に抽出される。
【００５１】
図９は、依存関係を辿った影響波及調査の例を示す。
【００５２】
図９は、UseInfoクラスに定義されたnameプロパティが及ぼす影響範囲を特定する例を示す。この例では、nameプロパティが持つ値の変更に伴なって、改修またはテストが必要となる範囲を特定する。例えば、従来３桁で表現していた値を、１０桁で表現するように修正する場合である。
【００５３】
図９の説明は次の通りである。
【００５４】
UserInfoクラスのフィールドに定義されたnameプロパティの変更に対する影響波及を調査する。 
〔UserInfoクラスの影響波及〕
１．nameプロパティは、getName()メソッドおよびsetName(String)メソッドで用いられている。
【００５５】
getName()メソッドのreturn文でnameプロパティが返却されるため、getName()メソッドの呼出元に影響が波及する。 
⇒UtilityクラスのmakeKey(Date, String)メソッドへ。 
２．setName(String)メソッドでは、setName(String)メソッドの引数の値をnameプロパティに上書きするため、nameプロパティの変更に対する影響はなく、これ以上の波及はしない。 
〔Utilityクラスの影響波及〕
１．userInfo.getName()の値に影響があるため、その値を用いた計算結果を格納するstring変数に影響が波及する。 
２．string変数は、encryption.encrypt(String)メソッドに渡されるため、その計算結果であるencryptedString変数、およびencrypt(String)メソッドに影響が波及する 
⇒Encryptionクラスのencrypt(String)メソッドへ。 
３．encryptedString変数はmakeKey(Date, String)メソッドの戻り値となるため、makeKey(Date, String)メソッドの呼出元へ影響が波及する。 
⇒Logicクラスのlogic()メソッドへ。 
〔Encryptionクラスの影響波及〕
１．encrypt(String)メソッドのstring引数に影響があるため、その値を用いた命令文「process(string)」の引数に影響がある。 
２．process(String)メソッドの引数のstring変数に影響があるため、その値を用いている「return string」命令文に影響がある。return文に影響があるため、process(String)メソッドの戻り値に影響するため、process(String)メソッドの呼出元に影響が波及する。 
⇒Encryptionクラスのencrypt(String)メソッド（３）へ。 
３．encryptedString変数をreturn文で返却しているため、encrypt(String)メソッドの呼出元に影響が波及する。 
⇒UtilityクラスのmakeKey(Date, String)メソッドへ。 
〔Logicクラスの影響波及〕
UtilityクラスのmakeKey(Date, String)の戻り値に影響があるため、その値をセットしているkey変数に影響がある。 
key変数はその後に用いられていないため、ここで影響波及は終了となる。
【００５６】
図１０は、本実施例による影響波及範囲調査による結果を呼出関係による影響波及調査との比較によって示す。呼出関係による影響波及調査方法では、影響のないクラス／メソッドが大量に抽出されるため、どこまで辿るかを人間が判断し、絞り込むことが必要となる。これに対して、本実施例では、影響波及調査された結果は、必要充分な結果であるため、どこまで辿るかという判断を必要としない。
【００５７】
本実施例によれば、文法を命令文単位に構文解析することで、
・命令文同士の依存関係を分析できる
・処理の流れを分析できる
という特徴を得ることができる。これにより、影響する命令文を辿ることができ、例えば「呼出関係」を中心とした影響波及調査の問題を解決できる。そして、図６、図７に示すように、影響の終着点を機械的に判断することができる。スパゲティコードのような場合にあっても必要な命令文関係を抽出することができる。
【００５８】
図１１から図１４は、本実施例による影響波及範囲調査による結果を呼出関係による影響波及調査との比較を具体的に示す。
【００５９】
図１１から図１３は、従来の呼出関係による影響波及調査の結果を示す。詳細内容は、これらの図に記述した。
【００６０】
図１４は、本実施例による影響波及調査の結果を示す。
【００６１】
したがって、これらの比較から本実施例によれば、影響のないクラス及びメソッドが大量に抽出されることはなく、命令文と命令文の繋ぎによる依存関係を辿ることで影響波及範囲を特定することができる。
【００６２】
このように、本実施例は、大規模なシステムの改修の時に実施する影響波及調査の制度を向上させ、作業効率を向上させることができる。
【符号の説明】
【００６３】
１…入力手段、２…演算処理手段、３…出力手段、４…データベース、５…プログラム、６…基点となる命令文、７…画面表示装置、８…画面、１００…プログラムの影響波及範囲設定装置。
【図１】
0006011988.tif 000002
【図２】
0006011988.tif 000003
【図３】
0006011988.tif 000004
【図４】
0006011988.tif 000005
【図５】
0006011988.tif 000006
【図６】
0006011988.tif 000007
【図７】
0006011988.tif 000008
【図８】
0006011988.tif 000009
【図９】
0006011988.tif 000010
【図１０】
0006011988.tif 000011
【図１１】
0006011988.tif 000012
【図１２】
0006011988.tif 000013
【図１３】
0006011988.tif 000014
【図１４】
0006011988.tif 000015