本発明については多様な変形や様々な形態にて実現することが可能であるが、その一例として、図面に示すような特定の実施の形態について、以下に詳細に説明する。図面及び実施の形態は、本発明をここに開示した特定の形態に限定するものではなく、添付の請求の範囲に明示されている範囲内においてなされる全ての変形例、均等物、代替例をその対象に含むものとする。
(第1の実施の形態)
図1に示されるように、本発明の第1の実施の形態による比較装置(装置)10は、装置本体20と、記憶装置(記憶手段)30と、入力装置40と、表示装置50とを備えている。比較装置10は、プログラム言語によって記述された1以上の文から夫々なる2つのモジュール(ソースプログラム)を比較するものである。
本実施の形態によるプログラム言語はCOBOLである。しかしながら、本発明はCOBOL以外のプログラム言語にも適用可能である。
本実施の形態によるモジュールは、文字、数字、記号等を組み合わせたモジュール名によって特定可能である。
モジュールには、1以上の文から構成される処理単位を記述することができる。本実施の形態による処理単位は、COBOLにおけるセクションである。セクションの夫々は、セクション名(処理単位名)によって特定することができる。但し、処理単位は、セクションでなくてもよい。例えばプログラム言語がJAVA(商標)である場合、処理単位は、関数名(処理単位名)によって特定可能な関数であってもよい。
モジュールは、他のモジュール又は当該モジュール自身を呼び出すことができる。また、モジュールのセクションは、他のセクション又は当該セクション自身を実行することができる。より具体的には、モジュールには、文として、セクションをセクション名によって特定して実行するための処理単位実行文と、モジュールの一つをモジュール名によって特定して実行するためのモジュール呼び出し文とを記述することができる。本実施の形態によれば、処理単位実行文はPERFORM文であり、モジュール呼び出し文はCALL文である。他のプログラム言語における処理単位実行文及びモジュール呼び出し文の夫々は、例えば関数名を指定した文である。モジュール呼び出し文が関数名を指定した文である場合、モジュール呼び出し文によって、モジュールのうちの指定された関数部分(即ち、モジュールの一部)が実行される。この場合、モジュール呼び出し文においてモジュール名が明示的に記述されないことがありうる。即ち、関数名によってモジュール名が間接的に特定されることがありうる。
更に、モジュールには、文の一つである条件文を記述することができる。条件文は、条件式を備えており、条件文の中に成立時実行文及び/又は不成立時実行文を記述可能である。換言すれば、条件文は、成立時実行文及び/又は不成立時実行文を含むことができる。成立時実行文は、条件文の条件式が成立する場合に実行される文である。不成立時実行文は、条件式が成立しない場合に実行される文である。本実施の形態による条件文は、IF文及びEVALUATE文である。IF文においては、成立時実行文はTHEN句に記述される文であり、不成立時実行文は、ELSE句に記述される文である。同様に、EVALUATE文においては、成立時実行文はWHEN句に記述される文である。
本実施の形態による条件文のうちの少なくとも1つは、成立時実行文及び/又は不成立時実行文として更に条件文を含むことができ、これにより条件文による文の階層化が可能である。例えば、IF文の成立時実行文として、更にIF文を記述することができる。換言すれば、モジュールは、条件文によって階層化可能な1以上の文からなり、これにより所定の階層構造(即ち、条件文による階層構造)を有している。容易に理解されるように、モジュールの文を解析することにより、階層化によるモジュールの階層構造を特定することができる。
図1に示されるように、記憶装置30は、例えば磁気ディスク装置である。記憶装置30は、例えばフォルダ(図示せず)によって階層化された様々なファイルを記憶することができる。記憶装置30は、装置本体20と通信可能に接続されており、装置本体20からの指示に従ってファイルの読込(取得)や書込(記憶)を行うことができる。本実施の形態による記憶装置30には、2以上のモジュール31が記憶されている。また、記憶装置30には、階層構造36を記憶することができる。
モジュール31は、例えばプログラミングツール(図示せず)を使用して作成される。モジュール31の夫々が一つのファイルであってもよい。複数のモジュール31が一つのファイルとして記憶されていてもよい。階層構造36は、モジュール31の階層構造を記憶するものである。本実施の形態によれば、モジュール31の夫々について、階層構造36が作成される。
入力装置40は、例えばキーボードやマウスである。入力装置40は、装置本体20と通信可能に接続されており、キーボードから入力された文字やマウスによって指示された位置を装置本体20に通知することができる。
表示装置50は、例えばディスプレイやプリンタである。表示装置50は、装置本体20と通信可能に接続されており、装置本体20から転送されたデータ(例えば、文字や図形)を表示又は印刷することができる。
装置本体20は、例えばPC(Personal Computer)の本体である。装置本体20は、CPU(Central Processing Unit)、主記憶装置等を備えている(図示せず)。記憶装置30には様々なプログラムの実行形式ファイルが記憶されている(図示せず)。CPUは、実行形式ファイルを主記憶装置にローディングし、実行形式ファイル内の命令語を実行することで様々な機能を実現する。CPUが命令語を実行する過程において、記憶装置30に記憶された所定のファイルが、主記憶装置内のバッファ領域を経由してプログラムの変数領域に読み込まれる。プログラムの変数領域に読み込まれたファイルの内容は、必要に応じて主記憶装置内のバッファ領域を経由して記憶装置30に書き込まれる。上記の説明から理解されるように、記憶装置30及び主記憶装置の夫々は、本実施の形態における読み込み及び書き込み可能な記憶手段として機能する。換言すれば、本実施の形態による記憶手段は、記憶装置30及び主記憶装置の一方であってもよいし、双方であってもよい。以降の説明においては、記憶手段として記憶装置30を使用する。
本実施の形態による記憶装置30には、比較プログラム等の様々なプログラムが記憶されている(図示せず)。上記のプログラムは、主記憶装置にローディングされ、CPUによって実行され、これによってコンピュータは、様々な手段として(即ち、装置として)機能する。例えば、比較プログラムは、コンピュータを、記憶装置30に記憶されたモジュール31のうちの第1モジュール31と第2モジュール31とを比較する比較手段23(比較装置10)として機能させる。換言すれば、本実施の形態による装置10の装置本体20は、比較手段23を備えている。
図2に示されるように、本実施の形態によるモジュール31は、n個(n≧1)の行310から構成される。本実施の形態によるモジュール31は、テキストファイルである。但し、モジュール31は、例えば、MICROSOFT EXCEL(商標)のワークシートであってもよい。モジュール31がワークシートである場合、比較手段23は、例えばEXCELマクロによって実現することができる。本実施の形態による行310は、一連番号(行識別)311と文312とから構成される。一連番号311は、行310を特定すると共に、行310の並び順を判断するためのものである。一連番号311は、数字だけでなく文字や記号を含んでいてもよい。文312には、文(例えば、データ定義文、実行文、コメント文)が記述されている。文312には、一つの完結した文全体が記述されていてもよい。文312には、一つの文の一部が記述されていてもよい。例えば、MOVE文が2つの行310の文312に分けて記述されていてもよい。
図3に示されるように、本実施の形態による階層構造36は、m個(m≧1)の行360から構成される。本実施の形態による階層構造36は、MICROSOFT EXCEL(商標)のワークシートである。但し、階層構造36は、例えばテキストファイルであってもよい。階層構造36は、比較手段23がモジュール31の階層構造を解析することによって作成され、モジュール31と関連付けて記憶される。具体的には、例えば、階層構造36のファイル名は、対応するモジュール31のファイル名と同一である。あるいは、互いに対応するモジュール31及び階層構造36は、同一のワークブックの異なるワークシートであってもよい。
本実施の形態による行360は、一連番号(行識別)361と、階層の深さ362とから構成される。一連番号361には、対応するモジュール31の行310の一連番号311が設定される。階層の深さ362には、一連番号361(即ち、一連番号311)に対応する文312の階層の深さが設定される。即ち、階層構造36は、文312の階層化による階層の深さ362を有している。
例えば、図6に例示されたモジュール31を参照すると、一連番号311が”0001”であるACCEPT文から一連番号311が”0004”であるACCEPT文までの文312の階層の深さは1である。一連番号311が”0005”であるIF文の階層の深さも1である。一連番号311が”0006”であるTHEN句の階層の深さは2である。以上の説明から理解されるように、モジュール31の先頭の文312の階層の深さ362は1である。また、文312を順次参照したとき、THEN句が出現するたびに階層の深さ362はインクリメント(+1)される。また、一連番号311が”0014”、”0017”、”0020”である文312の階層の深さ362から理解されるように、END-IFが出現するたびに階層の深さ362はデクリメント(−1)される。
上述のように、本実施の形態によれば、階層の深さ362は数値である。しかしながら、階層の深さ362は、階層構造における階層の深さを比較できる限り、数値でなくてもよい。更に、THEN句の検出によって更新された階層の深さ362が、対応するEND-IFの検出によって更新前の値に戻るように設計されていれば十分である。階層レベルは、実行文が記述された行についてのみ付与してもよい。更に、階層レベルは、IF文の先頭行及び終了行と、THEN句又はELSE句が記述された行のみに付与してもよい。
以下、本実施の形態による装置10の機能及び動作について、図6乃至図8に示される例を参照しつつ、図5を使用して詳細に説明する。まず、条件文としてIF文のみがモジュール31に含まれる場合(図6及び図7参照)を例にして説明する。次に、モジュール31にIF文以外の条件文が含まれる例(図8参照)について説明する。
図5に示されるように、本実施の形態による比較手段23は、例えば入力装置40から入力された起動指示によって起動された後、モジュール31のうちの第1モジュール31を特定するための第1モジュール名、及び第2モジュール31を特定するための第2モジュール名取得する(S500)。例えば、第2モジュール31は、第1モジュール31をメンテナンスしたものである。第1モジュール名及び第2モジュール名の夫々は、例えば起動パラメータの一部として入力すればよい。
次に、比較手段23は、取得した第1モジュール名によって特定される第1モジュール31を記憶装置30から読み込む(S502)。このとき、例えば所定のフォルダに記憶されたモジュール31のみが読み込み対象であってもよい。第1モジュール31が記憶装置30に記憶されていない場合、比較手段23は処理を終了する(図示せず)。
次に、比較手段23は、第1モジュール31の各文312の階層の深さを得て、第1の階層構造36を作成する(S504)。具体的には、比較手段23は、第1モジュール31の行310を1行目から最終行まで順次取得し、行310の夫々に階層の深さを付与する。このとき、比較手段23は、1行目の階層の深さを1とし、IF文のTHEN句を検出するたびに階層の深さをインクリメントする。一方、比較手段23は、IF文のEND-IF(即ち、IF文の終了)を検出するたびに階層の深さをデクリメントする。THEN句やEND-IFの記述を省略することが可能な場合は、IF文における文の並び等を解析して階層レベルを設定すればよい。比較手段23は、行310の一連番号311と上述のようにして得た階層の深さとを組み合わせて、階層構造36を作成する。
図6の例を参照すると、比較手段23は、第1モジュール31の先頭の実行文(即ち、一連番号311が”0001”の文312)から最後の実行文(即ち、一連番号311が”0020”の文312)までの文312に対して階層の深さ362を付与している。比較手段23は、一連番号311と階層の深さ362とを組み合わせて第1の階層構造36を作成している。
次に、図5に示されるように、比較手段23は、取得した第2モジュール名によって特定される第2モジュール31を、第1モジュール31と同様に、記憶装置30から読み込む(S506)。
次に、比較手段23は、第1モジュール31と同様に、第2モジュール31の各文312の階層の深さを得て、第2の階層構造36を作成する(S508)。
図7の例を参照すると、比較手段23は、第2モジュール31の先頭の実行文(即ち、一連番号311が”0001”の文312)から最後の実行文までの文312(即ち、一連番号311が”0014”の文312)に対して階層の深さ362を付与している。比較手段23は、一連番号311と階層の深さ362とを組み合わせて第2の階層構造36を作成している。
図5に示されるように、本実施の形態による比較手段23は、作成した第1の階層構造36及び第2の階層構造36を、記憶装置30に書き込む(S510)。但し、第1の階層構造36及び第2の階層構造36は、装置本体20の主記憶装置(図示せず)のみに記憶されていてもよい。換言すれば、階層構造36は、記憶装置30ではなく主記憶装置(図示せず)に記憶されていてもよい。
次に、比較手段23は、第1の階層構造36と第2の階層構造36とを比較する(S512)。例えば、比較手段23は、第1の階層構造36の階層の深さ362と第2の階層構造36の階層の深さ362とを1行目から順次比較し、階層の深さ362の変化が一致するか否かを判定する。
図6及び図7に例示する第1の階層構造36及び第2の階層構造36を参照すると、第1の階層構造36(図6参照)における階層の深さ362は、変化していない箇所を除き、1,2,3,4,3,2,1の順に変化している。一方、第2の階層構造36(図7参照)における階層の深さ362は、変化していない箇所を除き、1,2,3,2,1の順に変化している。従って、第1の階層構造36の階層の深さ362の変化は、第2の階層構造36の階層の深さ362の変化と一致しない。この場合、比較手段23は、第1モジュール31の第1の階層構造36が第2モジュール31の第2の階層構造36と一致していないことを示すメッセージを作成する。一方、仮に第2の階層構造36の階層の深さ362が、1,2,3,4,3,2,1の順に変化している場合、第1の階層構造36の階層の深さ362の変化は、第2の階層構造36の階層の深さ362の変化と一致する。この場合、比較手段23は、第1モジュール31の第1の階層構造36が第2モジュール31の第2の階層構造36と一致していることを示すメッセージを作成する。
即ち、比較手段23は、第1の階層構造36と第2の階層構造36との比較結果(メッセージ)を作成する(図5のS512)。本実施の形態による比較手段23は、作成したメッセージを表示装置50に表示する(S512)。
第1の階層構造36及び第2の階層構造36は、本実施形態と異なる方法で比較してもよい。例えば、図6及び図7から理解されるように、IF文、THEN句、ELSE句及びEND-IFについてのみ、一連番号361及び階層の深さ362を作成してもよい(図6及び図7において階層の深さ362を丸で囲んだ箇所参照)。この場合、第1の階層構造36の階層の深さ362を、第2の階層構造36の階層の深さ362と1行目から順次比較することで、第1の階層構造36と第2の階層構造36とを比較することができる。
また、図8から理解されるように、第1モジュール31及び第2モジュール31のうちの少なくとも一方にIF文以外の条件文が含まれていてもよい。例えば、EVALUATE文が含まれている場合、比較手段23は、EVALUATE文の最初のWHEN句を検出したときに階層の深さを更新し、EVALUATE文に対応するEND-EVALUATEを検出したときに階層の深さを更新前に戻せばよい。IF文、EVALUATE文以外の条件文についても同様に処理することができる。容易に理解されるように、階層構造36(第1の階層構造36及び第2の階層構造36)を作成した後の比較手段23の機能・動作は、モジュール31に条件文としてIF文のみが含まれている場合と同じである。
前述のように、本実施の形態による比較手段23は、第1の階層構造36が第2の階層構造36と一致していない場合だけでなく、一致している場合もメッセージを作成する。しかしながら、比較手段23は、第1の階層構造36が第2の階層構造36と一致している場合及び一致していない場合のうちの一方の場合にのみメッセージを作成してもよい。また、比較手段23が作成するメッセージは、第1モジュール31の第1の階層構造36が第2モジュール31の第2の階層構造36と一致しているか否か示すだけでなく、第1の階層構造36と第2の階層構造36との相違箇所を示してもよい。この場合、以下に説明するように、比較手段23は、階層構造36に代えて、階層構造36a(図4参照)を作成してもよい。
図4に示されるように、階層構造36aは、ma個(ma≧1)の行360aから構成される。階層構造36aは、階層構造36と同様に、比較手段23がモジュール31の階層構造を解析することによって作成され、モジュール31と関連付けて記憶される。
階層構造36aの行360aは、対応するモジュール31の条件文に対応して夫々作成される。例えば、図6の例を参照すると、第1モジュール31の条件文(IF文)は、一連番号311が”0005”、”0007”及び”0009”の3つの行310に記述されている。このため、図9の上段に示すように、第1モジュール31の第1の階層構造36aは、3つの行360aを有する。一方、図7の例を参照すると、第2モジュール31の条件文(IF文)は、一連番号311が”0004”及び”0006”の2つの行310に記述されている。このため、図9の下段に示すように、第2モジュール31の第2の階層構造36aは、2つの行360aを有する。
図4に示されるように、行360aは、一連番号(行識別)361と、階層パターン363と、終了行(一連番号)364とから構成される。一連番号361には、対応するモジュール31の一連番号311が設定される。終了行364には、一連番号361(一連番号311)の行310に記載された条件文の終了箇所(例えば、IF文に対応するEND-IFが記述された行310)の一連番号311が設定される。階層パターン363には、以下に説明するように、一連番号361から終了行364までの範囲についての階層構造を特定可能なデータが設定される。
例えば、図6の例および図9の上段の例を参照すると、一連番号311が”0005”の行310に記述された最初のIF文は、一連番号311が”0020”の行310で終了する。従って、第1の階層構造36aの1行目の一連番号361及び終了行364には、”0005”及び”0020”が、夫々設定される。また、この場合、比較手段23は、一連番号311が”0005”の行310から一連番号311が”0020”の行310の間に記述されたIF文、THEN句、ELSE句及びEND-IFの階層の深さを連結して、圧縮前の階層パターン(”1 2 2 3 3 4 4 3 3 2 2 1”)を作成する。次に、比較手段23は、圧縮前の階層パターン内の連続する同一の階層の深さを1つに圧縮して圧縮後の階層パターン363(”1 2 3 4 3 2 1”を作成する。比較手段23は、一連番号311が”0007”の行310に記述されたIF文、及び一連番号311が”0009”の行310に記述されたIF文についても、同様に圧縮後の階層パターン363を作成する。以上の説明から理解されるように、比較手段23は、第1モジュール31の条件文の夫々の一連番号361、終了行364及び階層パターン363を得て、第1の階層構造36aを作成する(図5のS504参照)。
同様に、図7の及び図9の下段の例から理解されるように、比較手段23は、第2モジュール31の条件文の夫々の一連番号361、終了行364及び階層パターン363を得て、第2の階層構造36aを作成する(図5のS508参照)。
本変形例による比較手段23は、上述のように作成した第1の階層構造36aと第2の階層構造36aとを比較し、比較結果を表示する(図5のS510)。例えば、比較手段23は、第1の階層構造の階層パターン363と、第2の階層構造の階層パターン363とを順次比較する。このとき、比較手段23は、階層の深さが1で始まる階層パターン363のみを比較してもよい。例えば、図9の例を参照すると、第1の階層構造36aのうち一連番号361が”0005”である階層パターン363と、第2の階層構造36aのうち一連番号361が”0004”である階層パターン363とを比較すればよい。
上述した変形例によれば、第1の階層構造36a(即ち、第1モジュール31)の階層パターン363が第2の階層構造36a(即ち、第2モジュール31)の階層パターン363と一致しない場合、一致しないことを示すメッセージと共に、一致しない箇所を表示装置50に表示することができる。具体的には、例えば、不一致の階層パターン363の夫々に対応する一連番号311及び終了行364を表示装置50に表示すればよい。
比較手段23は、階層の深さが1で始まる階層パターン363だけでなく、全ての階層パターン363を比較してもよい。この場合、第1モジュール31と第2モジュール31との一致しない箇所をより狭い範囲に特定することができる。
上述のように、本実施の形態(変形例を含む)による比較手段23は、メッセージを表示装置50に表示する。但し、比較手段23は、メッセージを表示装置50に表示すると共に、記憶手段30に記憶してもよい。更に、比較手段23は、メッセージを表示装置50に表示せずに、記憶手段30に記憶してもよい。更に、比較手段23は、メッセージを他の装置や手段に送信してもよい。
本実施の形態による比較手段23は、上述した変形例に加え、以下に説明するように、様々に変形することが可能である。
例えば、第1モジュール31及び第2モジュール31のうちの少なくとも一方は、複数のモジュール31を連結したものであってもよい。例えば、複数のモジュール31を、夫々の開始行から終了行まで単純に順に連結して、第1モジュール31又は第2モジュール31としてもよい。このようにすることで、複数のモジュール31からなる1つのプログラム全体を纏めて比較することができる。複数のモジュール31は、以下に説明する第2の実施の形態のように連結することも可能である。
(第2の実施の形態)
図10に示されるように、本発明の第2の実施の形態による比較装置(装置)10′は、装置本体20′と、記憶装置(記憶手段)30′と、入力装置40と、表示装置50とを備えている。装置10′は、第1の実施の形態による装置10と同様に、プログラム言語によって記述された1以上の文から夫々なる2つのモジュール(ソースプログラム)を比較するものである。第2の実施の形態によるプログラム言語、モジュール、入力装置40及び表示装置50は、第1の実施の形態と同様に夫々構成されている。
図10に示されるように、記憶装置30′は、記憶装置30と同様な磁気ディスク装置である。記憶装置30′には、第1の実施の形態と同様に、2以上のモジュール31が記憶されている。また、記憶装置30′には、2以上の二次的モジュール(モジュール)32が記憶される。本実施の形態による二次的モジュール32は、1つのモジュール31を変換して作成されるか、又は2以上のモジュール31を連結し変換して作成される。
装置本体20′は、装置本体20と同じく、例えばPCの本体である。装置本体20′は、CPU、主記憶装置等を備えている(図示せず)。第1の実施の形態と同様に、記憶装置30′と主記憶装置とは、本実施の形態における読み込み及び書き込み可能な記憶手段として夫々機能する。以降の説明における記憶手段としては記憶装置30′を例示する。
本実施の形態による記憶装置30′には、変換プログラムと、加工プログラムと、比較プログラムとが記憶されている(図示せず)。上記のプログラムは、主記憶装置にローディングされ、CPUによって実行され、これによってコンピュータは、変換手段21、加工手段22、及び比較手段23′として夫々機能する。即ち、上記のプログラムは、コンピュータをプログラム言語によって記述された1以上の文から夫々なる2つのモジュールを比較する装置10′として機能させるためのものである。換言すれば、本実施の形態による装置10′の装置本体20′は、変換手段21と、加工手段22と、比較手段23′とを備えている。
本実施の形態による変換手段21は、記憶装置30′に記憶されたモジュール31のうちの所定のモジュール31を二次的モジュール32に変換して記憶装置30′に記憶する。加工手段22は、記憶装置30′に記憶された二次的モジュール32(第1モジュール32及び/又は第2モジュール32)を加工する。比較手段23′は、第1の実施の形態の比較手段23と同様に、記憶装置30′に記憶された第1モジュール32と第2モジュール32とを比較する。但し、本実施の形態による比較手段23′は、2つのモジュール31を比較するのでなく、2つのモジュール31から夫々作成された2つの二次的モジュール32(第1モジュール32及び第2モジュール32(二次的モジュール32)を比較する。
図11に例示されるように、記憶装置30′には、例えばモジュール名がXXXであるモジュール31(XXXモジュール)と、モジュール名がAAAであるモジュール31(AAAモジュール)と、モジュール名がBBBであるモジュール31(BBBモジュール)と、モジュール名がCCCであるモジュール31(CCCモジュール)とが記憶されている。モジュール31の夫々は、一連番号311と文312とからなる複数の行310から構成されている。以下、この例を参照しつつ、モジュール31の構造をより具体的に説明する。
XXXモジュールは、メインモジュール(即ち、処理の起点となるモジュール)である。XXXモジュールは、AAAモジュールとBBBモジュールとをモジュール名によって特定して呼び出すためのCALL文が夫々記述された行310を有している。AAAモジュールは、CCCモジュールを呼び出すCALL文が記述された行310を有している。
図11に例示されたモジュール31の夫々は、1以上のセクションから構成されている。例えば、XXXモジュールは、メインセクション(即ち、モジュールにおける処理の起点となる主たる処理単位)と、従たるセクション(従たる処理単位)とを有している。メインセクションは、”PROCEDURE DIVISION.”が記述された行310の次の行310から、”STOP RUN.”が記述された行310までの行310から構成されている。従たるセクション(サブセクション)のうちの1つは、”AAA-SUB SECTION.”が記述された行310から、”EXIT.”が記述された行310までの行310から構成されている。上述のサブセクションのセクション名(処理単位名)はAAA−SUBである。メインセクションは、AAA−SUBセクションをセクション名によって特定して実行する行310を有している。より具体的には、メインセクションは、”PERFORM AAA-SUB.”が記述された行310を有している。
図11に例示されたセクションのいくつかは、条件文が記述された行310を備えている。例えば、XXXモジュールのメインセクションは、5つのWHEN句を有するEVALUATE文が記述された行310と、THENおよびELSEを有するIF文が記述された行310とを備えている。CCCモジュールのメインセクションは、IF文のELSEにおいて更にIF文が記述された行310を備えており、これによって条件文による文312の階層化が行われている。
図12に示されるように、本実施の形態による二次的モジュール32は、複数の二次的行(行)320から構成される。本実施の形態による二次的モジュール32は、MICROSOFT EXCEL(商標)のワークシートである。但し、二次的モジュール32は、例えばテキストファイルであってもよい。本実施の形態による行320は、モジュール識別321と、行番号322と、階層構造323と、一連番号(行識別)326と、二次的文327とから構成される。
二次的モジュール32の夫々は、1以上のモジュール31から実行文等が記述された行310を集めて加工することによって生成されている。本実施の形態による二次的モジュール32は、変換手段21によって生成され、加工手段22によって加工される。加工された二次的モジュール32は、比較手段23′によって参照される。
図12に例示されるように、本実施の形態による二次的モジュール32は、例えば、XXXモジュール、AAAモジュール、BBBモジュール及びCCCモジュールのPROCEDURE DIVISIONの行310を集めて加工したものである。
図11及び図12から理解されるように、行310の文312に記述されているPERFORM文(例えば、図11の”PERFORM PGMAAAP-PROC”)は、行320の二次的文327においてコメント化されている。また、PERFORM文によって実行されるPERFORM PGMAAAP-PROCセクションの文312が、行320の二次的文327として展開されている。行320の二次的文327において、行310の文312に記述されているCALL文はコメント化されている(即ち、コメント文に変更されている)。CALL文によって呼び出されるAAAモジュールのPROCEDURE DIVISIONの文312は、行320の二次的文327として展開されている(即ち、展開されて、行320の二次的文327が生成されている)。更に、AAAモジュールからCALL文によって呼び出されるCCCモジュールのPROCEDURE DIVISIONの文312は、行320の二次的文327として展開されている。
また、文312に記述された条件文のうちIF文以外の条件文(本実施の形態においてはEVALUATE文)は、二次的文327においてIF文に変換されている。例えば、”EVALUATE WK-A-O”、”WHEN CS-1”、”MOVE CS-1 TO WK-B-I”が夫々記述された3つの文312は、”*#E EVALUATE WK-A-O”(コメント文)、”*#E WHEN CS-1”(コメント文)、”IF ( WK-A-O = CS-1 )”、”THEN”、”MOVE CS-1 TO WK-B-I”が夫々記述された5つの二次的文327に変換されている(図12の破線Aで囲まれた箇所参照)。本実施の形態によれば、上記の変換に加え、IF文におけるTHEN、ELSE及びEND IFの欠落を補うための二次的文327が生成される。また、否定の条件式は肯定の条件式に変換される。更に、ANDやORで連結された条件式を有するIF文は複数のIF文に分解されて、2つの評価対象オペランド間の関係を1つの論理演算子のみによって評価する単純な二次的条件式を有するIF文に変換される。但し、上記の変換の一部(例えば、ANDやORで連結された条件式の分解)は行わなくてもよい。
更に、複数の文312に分かち書きされている実行文(例えば、MOVE文)は、1つの二次的文327に纏められる。即ち、二次的モジュール32の行320の夫々は、モジュール31の行310に基づいて生成されている。より具体的には、二次的文327は、文312をそのままコピーしたものであるか、又は文312を加工および/又は展開することによって生成されたものである。
本実施の形態によるモジュール識別321は、夫々の行320がいずれのモジュール31に基づくものであるかを示すものである。より具体的には、モジュール識別321には、モジュール名(例えば、XXX)が設定される。但し、モジュール名に代えて、モジュール31を一意に識別可能な番号等を設定してもよい。
一連番号326には、二次的文327が文312のコピーである行320においては、コピー元の行310の一連番号311が設定される。換言すれば、行310と1対1に対応する行320(例えば、文312をコメント化した二次的文327の行320)については、一連番号326には、対応する行310の一連番号311が設定される。一方、生成された(追加された)行320の一連番号326には、生成された行320であることを識別可能な識別子(例えば、記号の組み合わせ)が設定される。このようにすることで、行320と行310とを容易に対応付けることができる。
本実施の形態による行番号322には、1から始まる通番が行320の並び順に沿って設定されている。但し、行番号322は、行番号322の大小関係を比較することが可能な限り、通番でなくてもよい。例えば、行番号322は文字や記号の組み合わせであってもよい。
本実施の形態による階層構造323は、分岐階層324と、階層の深さ325とから構成されている。分岐階層324は、条件文による階層を識別するために使用される。本実施の形態による分岐階層324は、1行目の行320における出発値として1を使用することにより設定される。換言すれば、1行目の行320の分岐階層324は1である。分岐階層324は、IF文のTHENが記述された行320において1.1に変更され、ELSEが記述された行320において1.2に変更される。分岐階層324は、IF文のEND IFが記述された行320の次の行から1に戻る。一般化すると、THENが記述された行320においては、直前の行320の分岐階層324の末尾に「.1」が加えられ、ELSEが記述された行320においては、直前の行320の分岐階層324の末尾「.1」が「.2」に変更され、END IFが記述された行320の次の行においては、END IFが記述された行320の分岐階層324の末尾「.2」が削除される。上記の場合を除き、分岐階層324には、直前の行320と同一の値が設定される。
本実施の形態による階層の深さ325は、分岐階層324と同様に、1行目の行320における出発値として1を使用することにより設定される。換言すれば、1行目の行320の階層の深さ325は、1である。階層の深さ325は、IF文のTHENが記述された行320において1.1に変更され、END IFが記述された行320の次の行から1に戻る。更に、その後のIF文のTHENが記述された行320において1.2に変更され、END IFが記述された行320の次の行から1に戻る。一般化すると、階層の深さ325は、1を出発値としており、THENが記述された行320において末尾に「.q」(qは1以上の整数)なる桁が加えられ、END IFが記述された行320の次の行において末尾の「.q」なる桁が削除される。「.q」におけるqの値は、桁の夫々について1を出発値としている。詳しくは、1桁目の「.q」(例えば1.2の「.2」)におけるqの値は、1を出発値としており、付加される毎にインクリメントされる。一方、2桁目以降の「.q」(例えば1.2.1の「.1」)におけるqの値は、当該桁を除いた階層の深さ325が同一値である行320が連続する範囲において1を出発値としており、当該連続する範囲において付加される毎にインクリメントされる。
行320は、以上に説明した項目に加えて様々な項目を備えることができる。例えば、行320が、対応する行310のセクション名を備える場合、行320と行310との対応を、より容易に把握することができる。
以下、本実施の形態による装置10′の機能及び動作について詳細に説明する。
図13から理解されるように、本実施の形態による変換手段21は、制御パラメータ取得機能(S1300)と、読込機能(S1302、S1304)と、変換機能(S1306〜S1312)と、書込機能(S1314)とを有している。制御パラメータ取得機能は、展開制御パラメータを取得する機能である。読込機能は、モジュール31のうち処理対象とする対象モジュール31を記憶装置30′から読み込む機能である。変換機能は、対象モジュール31を二次的モジュール32に変換する機能である。書込機能は、二次的モジュール32を記憶装置30′に記憶する機能である。
より具体的には、図13に示されるように、変換手段21は、例えば入力装置40から入力された起動指示によって起動されると、例えば起動指示の一部として入力された展開制御パラメータを取得する(S1300)。本実施の形態による展開制御パラメータには、展開指示を含ませることができる。展開指示は、実行対象のセクション又は呼び出し対象のモジュール31の文312に記述されている文の展開を初回のみに制限することを指示するものである。
次に、変換手段21は、対象モジュール31を特定するための対象モジュール名を取得する(S1302)。対象モジュール名は、展開制御パラメータと同様な方法で入力することができる。変換手段21は、取得した対象モジュール名によって特定される対象モジュール31を記憶装置30′から読み込む(S1304)。このとき、例えば所定のフォルダに記憶されたモジュール31のみが読み込み対象であってもよい。対象モジュール31が記憶装置30′に記憶されていない場合、変換手段21は、処理を終了する(図示せず)。
次に、変換手段21は、対象モジュール31の処理開始箇所の文312を取得する(S1306)。本実施の形態による処理開始箇所は、メインセクションの先頭である。変換手段21は、取得した文312について二次的文出力処理を行う(S1308)。次に、変換手段21は、処理終了箇所の文312を処理済みであるか判定する(S1310)。本実施の形態による処理終了箇所は、メインセクションの末尾である。処理が終了している場合(S1310においてYESの場合)、変換手段21は、作成した二次的モジュール32を記憶装置30′に書き込み(S1314)、処理を終了する。一方、処理が終了していない場合(S1310においてNOの場合)、変換手段21は、次に処理する文312(後続する行310の文312)を取得し(S1312)、取得した文312について二次的文出力処理を行う(S1308)。
図14は、図13に示した変換手段21の処理(機能)のうち、二次的文出力処理(S1308)をより詳細に示すフローチャートである。図14に示されるように、変換手段21は、二次的文出力処理において文312を二次的文327として出力する(S1400)。より具体的には、本実施の形態によれば、文312に記述されている実行文等をワークシートの所定の行・列にコピーする。このとき、前述したように、PERFORM文をコメント文にする等の加工が行われる。更に、変換手段21は、モジュール識別321と、行番号322と、一連番号326とに前述したような値を設定する。
次に、変換手段21は、文312に条件文が記述されているか判定する(S1402)。文312に記述されている実行文が条件文である場合(S1402でYESの場合)、変換手段21は、前述したようにIF文以外の条件文をIF文に変換する等の処理を行う。より具体的には、変換手段21は、条件文の条件式に基づいて、二次的文の一つである二次的条件文(IF文)が記述された二次的文327を生成し、二次的条件文によって二次的文327を階層化して二次的モジュールに出力し(S1404)、二次的文出力処理を終了する。
文312に記述されている実行文(即ち、対象文)が条件文でない場合(S1402でNOの場合)、変換手段21は、対象文が処理単位実行文(PERFORM文)であるか判定する(S1406)。対象文が処理単位実行文である場合(S1406でYESの場合)、変換手段21は、実行対象の処理単位の処理開始箇所の文312を取得する。本実施の形態においては、処理単位の処理開始箇所はセクションの先頭である。
対象文が処理単位実行文でない場合(S1406でNOの場合)、変換手段21は、対象文がモジュール呼び出し文(本実施の形態によれば、CALL文)であるか判定する(S1410)。対象文がモジュール呼び出し文である場合(S1410でYESの場合)、変換手段21は、CALL文によって特定される呼び出し対象のモジュール31を記憶装置30′から読み込み(S1412)、呼び出し対象のモジュール31の処理開始箇所の文312を取得する(S1414)。本実施の形態によれば、呼び出し対象のモジュール31の処理開始箇所は、当該モジュール31のメインセクションの先頭である。対象文がモジュール呼び出し文でない場合(S1410でNOの場合)、変換手段21は二次的文出力処理を終了する。
変換手段21は、実行対象のセクションの文312又は呼び出し対象のモジュール31の文312について、再帰的に二次的文出力処理を行う(S1416)。次に、変換手段21は、処理終了箇所の文312を処理済みであるか判定する(S1418)。本実施の形態による処理終了箇所は、実行対象のセクションについては当該セクションの末尾であり、呼び出し対象のモジュール31についてはメインセクションの末尾である。処理が終了している場合(S1418においてYESの場合)、変換手段21は、二次的文出力処理を終了する。一方、処理が終了していない場合(S1418においてNOの場合)、変換手段21は、次に処理する文312(後続する行310の文312)を取得し(S1420)、取得した文312について再帰的に二次的文出力処理を行う(S1416)。
変換手段21は、再帰的な(自分自身を実行する)PERFORM文については、実行対象のセクションの文312の展開を行わない。同様に、変換手段21は、再帰的な(自分自身を呼び出す)CALL文については、呼び出し対象のモジュール31の文312の展開を行わない。更に、変換手段21は、展開制御パラメータに展開指示が指定されている場合、既に二次的文出力処理を行ったセクションとセクション名が同一であるセクションを実行するPERFORM文については、二次的文出力処理を行わない(S1406)。同様に、変換手段21は、展開制御パラメータに展開指示が指定されている場合、既に二次的文出力処理を行ったモジュール31とモジュール名が同一であるモジュール31を呼び出すCALL文については、二次的文出力処理を行わない(S1410)。
以上の説明から理解されるように、変換手段21の変換機能は、対象モジュール31の所定の処理開始箇所から所定の処理終了箇所までに記述された文312の夫々を二次的文327として二次的モジュールに順次出力する。更に、変換手段21の変換機能は、文312が処理単位実行文又はモジュール呼び出し文である場合、実行対象の処理単位又は呼び出し対象のモジュール31に記述されている文312を展開することで二次的文327を生成して二次的モジュール32に出力する。更に、変換手段21の変換機能は、展開される文312における処理単位実行文又はモジュール呼び出し文についても展開を更に行う(即ち、再帰的に展開する)。従って、多数の処理単位やモジュール31に分散された機能を、対象モジュール31のメインセクションに手繰り寄せるようにして集めることができる。換言すれば、1つのプログラムの機能を1つの二次的モジュール32に集めることができる。
以上の説明から理解されるように、本実施の形態による変換手段21の変換機能は、展開制御パラメータに展開指示が指定されている場合、同一の処理単位については、実行対象の処理単位に記述されている文312の展開を初回の1回のみ行い(即ち、同一の処理単位を1回のみ展開し)、同一のモジュール31については、呼び出し対象のモジュール31に記述されている文312の展開を初回の1回のみ行う(即ち、同一のモジュール31を1回のみ展開する)。但し、変換手段21の変換機能は、展開指示が指定されていない場合に、同一の処理単位や同一のモジュール31を1回のみ展開してもよい。また、変換手段21の変換機能は、展開指示が指定されているか否には係らず、同一の処理単位や同一のモジュール31を1回のみ展開してもよい。更に、変換手段21の変換機能は、展開指示が指定されているか否には係らず、同一の処理単位や同一のモジュール31を繰り返し展開してもよい。
以上に説明したように、変換手段21によって、二次的文327からなる二次的モジュール32が記憶装置30′に記憶される。
図15から理解されるように、本実施の形態による加工手段22は、読込機能(S1500、S1502)と、階層構造付加機能(S1506)と、書込機能(S1510)とを有している。読込機能は、処理対象の二次的モジュール32を記憶装置30′から読み込む機能である。階層構造付加機能は、二次的モジュール32の二次的文327の少なくとも一部について階層構造323を付加する機能である。書込機能は、階層構造323が付加された二次的文327からなる二次的モジュール32を記憶装置30′に記憶する機能である。
より具体的には、図15に示されるように、加工手段22は、例えば変換手段21と同様に起動されると、処理対象の二次的モジュール32を特定するための二次的モジュール名を取得する(S1500)。加工手段22は、取得した二次的モジュール名によって特定される二次的モジュール32を記憶装置30′から読み込む(S1502)。処理対象の二次的モジュール32が記憶装置30に記憶されていない場合、加工手段22は、処理を終了する(図示せず)。
次に、加工手段22は、処理対象の二次的モジュール32の処理開始箇所の二次的文327を取得する(S1504)。本実施の形態による処理開始箇所は、二次的モジュール32の先頭である。
加工手段22は、取得した二次的文327について階層構造323を付加する(S1506)。より具体的には、本実施の形態による加工手段22は、処理対象の二次的モジュール32が記録されたワークシート(即ち、対象ワークシート)において行320の階層構造323と対応する行・列に、前述したような分岐階層324と階層の深さ325とを設定する。
次に、加工手段22は、処理終了箇所の二次的文327を処理済みであるか判定する(S1508)。本実施の形態による処理終了箇所は、二次的モジュール32の末尾である。処理が終了している場合(S1508においてYESの場合)、加工手段22は、加工した二次的モジュール32を記憶装置30′に書き込み(S1510)、処理を終了する。一方、処理が終了していない場合(S1508においてNOの場合)、加工手段22は、次に処理する二次的文327(後続する行320の二次的文327)を取得し(S1512)、取得した二次的文327について階層構造323の付加を行う(S1506)。
以上に説明したように、加工手段22によって、階層構造323が付加された二次的文327からなる二次的モジュール32が記憶装置30′に記憶される。以上の説明から理解されるように、変換手段21に、加工手段22の機能を備えることもできる。この場合、装置本体20′は、加工手段22を備えていなくてもよい。
本実施の形態による比較手段23′は、第1の実施の形態による比較手段23と同様な機能を備えている。以下、比較手段23と異なる機能を中心に、図17に示される例を参照しつつ、図16を使用して説明する。
比較手段23′は、比較手段23と同様に起動されると、二次的モジュール32のうちの第1モジュール32を特定するための第1モジュール名、及び第2モジュール32を特定するための第2モジュール名取得する(S1600)。例えば、第1モジュール32は、所定プログラムのメンテナンスする前のモジュール31を連結した二次的モジュール32であり、第2モジュール32は、所定プログラムのメンテナンスされた後のモジュール31を連結した二次的モジュール32である。
次に、比較手段23′は、取得した第1モジュール名及び第2モジュール名によって夫々特定される第1モジュール32及び第2モジュール32を記憶装置30から読み込む(S1602、S1604)。
図12(破線Aで囲まれた箇所参照)及び図17の上段に例示されるように、メンテナンス前のXXXモジュールには、5つのWHEN句を含むEVALUATE文が記述されている。このため、メンテナンス前の第1モジュール32は、このEVALUATE文から生成された4つのIF文を含んでいる(図17の上段参照)。
図17から理解されるように、メンテナンスによって、メンテナンス前のXXXモジュールの5つのWHEN句のうち、5つ目のWHEN句が削除されている。このため、メンテナンス後の第2モジュール32は、このEVALUATE文から生成された3つのIF文を含んでいる(図17の下段参照)。
図16に示されるように、比較手段23′は、第1モジュール32及び第2モジュール32を読み込んだ後、第1モジュール32の階層構造323と第2モジュール32の階層構造323とを比較する(S1606)。本実施の形態によれば、比較手段23′は、第1モジュール32の階層の深さ325と第2モジュール32の階層の深さ325とを1行目から順次比較し、階層の深さ325の変化が一致するか否かを判定する。
図17に例示する第1モジュール32及び第2モジュール32を参照すると、第2モジュール32における階層の深さ325は、行番号322が”60”の行320までは、第1モジュール32における階層の深さ325と同じである。一方、第2モジュール32の行番号322が”61”の行320の階層の深さ325("1.2.1.1”)は、第1モジュール32の行番号322が”61”の行320の階層の深さ325("1.2.1.1.1”)と異なる。このため、比較手段23′は、第1モジュール32の階層構造323が第2モジュール32の階層構造323と一致していないことを示すメッセージを作成する。即ち、比較手段23′は、比較手段23と同様に、第1モジュール32の階層構造323と第2モジュール32の階層構造323との比較結果(メッセージ)を作成する。本実施の形態による比較手段23′は、作成したメッセージを表示装置50に表示する。
以上の説明から理解されるように、本実施の形態による比較手段23′は、第1の実施の形態による比較手段23と同様に2つのモジュール(第1モジュール32及び第2モジュール32)の階層構造を比較することができる。更に、本実施の形態によれば、第1モジュール32及び第2モジュール32の夫々には、関連する複数のモジュール31が処理順に連結されている。従って、メンテナンス前後のプログラム全体を、纏めて比較することができる。
例えば、ランタイムシステム等のソフトウェアのバージョンアップに伴ってモジュールをメンテナンスする場合、基本的にはモジュールの階層構造は変わらない。また、このようなコンバージョンにおいては、コンバージョンツールを使用してモジュールをメンテナンスすることがある。しかしながら、一般的にコンバージョンツールは、モジュールを完全に適切にメンテナンスすることができない。このような場合、メンテナンス前後のモジュールから夫々作成した第1モジュール32及び第2モジュール32の階層構造323を比較することで、メンテナンスが適切に行われたか否かを知ることができる。
本実施の形態における階層構造323の比較方法は、第1の実施形態と同様に、様々に変形することができる。例えば、第1モジュール32の階層構造323と第2モジュール32の階層構造323とが一致しない箇所を表示装置50に表示することで、メンテナンスが適切に行われていない箇所を容易に知ることができる。
(第3の実施の形態)
図18に示されるように、本発明の第3の実施の形態による比較装置(装置)10″は、装置本体20″と、記憶装置(記憶手段)30″と、入力装置40と、表示装置50とを備えている。本実施の形態による記憶装置30″は、装置本体20″の主記憶装置である。装置本体20″は、第2の実施の形態による装置本体20′と同様に、変換手段21と、加工手段22と、比較手段23′とを備えている。
装置10″は、通信回線80を経由して、ファイルサーバ60と通信可能に接続されている。通信回線80は、例えばLAN(Local Area Network)であってもよいし、インターネットであってもよい。ファイルサーバ60は、変換手段21、加工手段22及び比較手段23′のうちの少なくとも一つを備えていてもよい。また、ファイルサーバ60は、記憶装置(記憶手段)70を備えている。記憶装置70は、モジュール31と、二次的モジュール32とを記憶することができる。従って、装置10″は、記憶装置70からモジュール31等を読み込み、記憶装置70にモジュール31等を書き込むことができる。
容易に理解されるように、本実施の形態によれば、第1及び第2の実施の形態と同様に、二次的モジュール32のうちの2つのモジュール(第1モジュール32及び第2モジュール32)を比較することができる。また、比較結果を、複数の装置10″によって共有することができる。
本発明の最良の実施の形態について説明したが、当業者には明らかなように、本発明の精神を逸脱しない範囲で実施の形態を変形することが可能であり、そのような実施の形態は本発明の範囲に属するものである。
一般的に、プログラムのメンテナンスが適切に行われたか否かを検証するために、メンテナンス前後のプログラムを比較して異なる箇所を見つけ出すという作業が行われている。例えば、特許文献1には、メンテナンス前後のプログラムの夫々から抽出したトークンの並び順を比較することで、メンテナンス前後のプログラムの異なる箇所を見つけ出すプログラム差分検出装置が開示されている。特許文献1のトークンは、予約語や文字定数等から構成される。特許文献1によれば、プログラム差分検出装置は、このようなトークンの並び順によってプログラムの異なる箇所を見つけ出すため、文の開始カラムの相違などの形式的な相違ではなく、意味的な相違によって異なる箇所を見つけ出すことができる。
上述のように、本実施の形態によれば、階層の深さ362は数値である。しかしながら、階層の深さ362は、階層構造における階層の深さを比較できる限り、数値でなくてもよい。更に、THEN句の検出によって更新された階層の深さ362が、対応するEND-IFの検出によって更新前の値に戻るように設計されていれば十分である。階層の深さは、実行文が記述された行についてのみ付与してもよい。更に、階層の深さは、IF文の先頭行及び終了行と、THEN句又はELSE句が記述された行のみに付与してもよい。
次に、比較手段23は、第1モジュール31の各文312の階層の深さを得て、第1の階層構造36を作成する(S504)。具体的には、比較手段23は、第1モジュール31の行310を1行目から最終行まで順次取得し、行310の夫々に階層の深さを付与する。このとき、比較手段23は、1行目の階層の深さを1とし、IF文のTHEN句を検出するたびに階層の深さをインクリメントする。一方、比較手段23は、IF文のEND-IF(即ち、IF文の終了)を検出するたびに階層の深さをデクリメントする。THEN句やEND-IFの記述を省略することが可能な場合は、IF文における文の並び等を解析して階層の深さを設定すればよい。比較手段23は、行310の一連番号311と上述のようにして得た階層の深さとを組み合わせて、階層構造36を作成する。
例えば、図6の例および図9の上段の例を参照すると、一連番号311が"0005"の行310に記述された最初のIF文は、一連番号311が"0020"の行310で終了する。従って、第1の階層構造36aの1行目の一連番号361及び終了行364には、"0005"及び"0020"が、夫々設定される。また、この場合、比較手段23は、一連番号311が"0005"の行310から一連番号311が"0020"の行310の間に記述されたIF文、THEN句、ELSE句及びEND-IFの階層の深さを連結して、圧縮前の階層パターン("1 2 2 3 3 4 4 3 3 2 2 1")を作成する。次に、比較手段23は、圧縮前の階層パターン内の連続する同一の階層の深さを1つに圧縮して圧縮後の階層パターン363("1 2 3 4 3 2 1")を作成する。比較手段23は、一連番号311が"0007"の行310に記述されたIF文、及び一連番号311が"0009"の行310に記述されたIF文についても、同様に圧縮後の階層パターン363を作成する。以上の説明から理解されるように、比較手段23は、第1モジュール31の条件文の夫々の一連番号361、終了行364及び階層パターン363を得て、第1の階層構造36aを作成する(図5のS504参照)。
本実施の形態による変換手段21は、記憶装置30′に記憶されたモジュール31のうちの所定のモジュール31を二次的モジュール32に変換して記憶装置30′に記憶する。加工手段22は、記憶装置30′に記憶された二次的モジュール32(第1モジュール32及び/又は第2モジュール32)を加工する。比較手段23′は、第1の実施の形態の比較手段23と同様に、記憶装置30′に記憶された第1モジュール32と第2モジュール32とを比較する。但し、本実施の形態による比較手段23′は、2つのモジュール31を比較するのでなく、2つのモジュール31から夫々作成された2つの二次的モジュール32(第1モジュール32及び第2モジュール32)を比較する。
図11及び図12から理解されるように、行310の文312に記述されているPERFORM文(例えば、図11の"PERFORM PGMAAAP-PROC")は、行320の二次的文327においてコメント化されている。また、PERFORM文によって実行されるPGMAAAP-PROCセクションの文312が、行320の二次的文327として展開されている。行320の二次的文327において、行310の文312に記述されているCALL文はコメント化されている(即ち、コメント文に変更されている)。CALL文によって呼び出されるAAAモジュールのPROCEDURE DIVISIONの文312は、行320の二次的文327として展開されている(即ち、展開されて、行320の二次的文327が生成されている)。更に、AAAモジュールからCALL文によって呼び出されるCCCモジュールのPROCEDURE DIVISIONの文312は、行320の二次的文327として展開されている。