(57)【特許請求の範囲】
【請求項１】
プログラム言語によって記述された１以上の文から夫々なる２つのモジュールを比較する装置であって、
前記モジュールには、前記文の一つである条件文を記述することが可能であり、前記条件文は、成立時実行文及び／又は不成立時実行文を含んでおり、前記成立時実行文は、前記条件文の条件式が成立する場合に実行される前記文であり、前記不成立時実行文は、前記条件式が成立しない場合に実行される前記文であり、前記条件文のうちの少なくとも１つは、前記成立時実行文及び／又は前記不成立時実行文として更に前記条件文を含むことができ、これにより前記条件文による前記文の階層化が可能であり、前記文の前記階層化による前記モジュールの階層構造を特定することが可能であり、
前記装置は、記憶手段と、比較手段とを備えており、
前記記憶手段には、２以上の前記モジュールが記憶されており、
前記比較手段は、前記記憶手段に記憶された前記モジュールのうちの第１モジュールと第２モジュールとを前記記憶手段から取得し、前記第１モジュールの前記階層構造が前記第２モジュールの前記階層構造と一致しているか否か示すメッセージを作成する
装置。
【請求項２】
請求項１記載の装置であって、
前記階層構造は、前記文の前記階層化による階層の深さを有している
装置。
【請求項３】
請求項１又は請求項２記載の装置であって、
前記第１モジュール及び前記第２モジュールのうちの少なくとも一方は、複数の前記モジュールを連結したものである
装置。
【請求項４】
請求項１乃至請求項３のいずれかに記載の装置であって、
表示装置を更に備えており、
前記比較手段は、前記メッセージを前記表示装置に表示する
装置。
【請求項５】
コンピュータを、請求項１乃至請求項４のいずれかに記載の装置として機能させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラム言語によって記述された１以上の文から夫々なる２つのモジュール（ソースプログラム）を比較する装置に関する。
【背景技術】
【０００２】
一般的に、プログラムは、繰り返しメンテナンスしながら長期間に亘って使用されることが多い。プログラムのメンテナンスは、多くの場合、プログラムの機能を変更するために行われる。但し、プログラムは、プログラムが使用される環境、例えば、プログラムのプラットフォームであるハードウェアや、OS（Operation System）や、ミドルウェアの変更に対応するためにメンテナンスされる場合もある。更に、プログラムは、プログラムを記述しているプログラム言語を変更するためにメンテナンスされる場合もある。即ち、プログラムの機能の変更を目的としないメンテナンス（以下、このようなメンテナンスを「コンバージョン」という。）が行われる場合もある。【０００３】
プログラムをコンバージョンする場合、プログラムの全ての文について変更が必要か否かを調査し、変更が必要な文のみを変更する必要がある。しかしながら、プログラムの合計行数が１００万行を超すような大きなシステムも多数存在する。このようなシステムにおいて、適切にコンバージョンを行うことは容易ではない。更に、コンバージョンが適切に行われたか否かを検証することも容易ではない。更に、コンバージョンに限らず、またシステムの大きさに限らず、プログラムのメンテナンスが適切に行われたか否かを検証することは容易ではない。【０００４】
一般的に、プログラムのメンテナンスが適切に行われたか否かを検証するために、メンテナンス前後のプログラムを比較して異なる箇所を見つけ出すという作業が行われている。例えば、特許文献１には、メンテナンス前後のプログラムの夫々から抽出したトークンの並び順を比較することで、メンテナンス前後のプログラムの異なる箇所を見つけ出すプログラム差分検出装置が開示されている。特許文献１のトークンは、予約語や文字定数等から構成される。特許文献１によれば、プログラム差分検出装置は、このようなトークンの並び順によってプログラムの異なる箇所を見つけ出すため、文の開始カラムの相違などの形式的な相違ではなく、意味的な相違によって異なる箇所を見つけ出すことができる。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２００９−１７６１０８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかしながら、例えば、プログラム言語を変更する場合、プログラム言語の予約語（即ち、トークン）も変わることが多い。また、OSやミドルウェアの変更に対応するためにプログラムを変更する場合、プログラム中に記述された関数名（即ち、トークン）が変わることがある。このような場合、特許文献１に開示された技術を使用すると、意味的に同じ個所が異なる箇所として見つけ出される。即ち、特許文献１に開示された技術は、コンバージョンにおいて使用することが困難である。【０００７】
そこで、本発明は、プログラム言語によって記述された１以上の文から夫々なる２つのモジュールを比較する装置であって、コンバージョンにおいても適用可能な新たな方法によって２つのモジュールを比較する装置を提供することを目的とする。
【課題を解決するための手段】
【０００８】
本発明の一の側面は、プログラム言語によって記述された１以上の文から夫々なる２つのモジュールを比較する装置を提供する。前記モジュールには、前記文の一つである条件文を記述することが可能である。前記条件文は、成立時実行文及び／又は不成立時実行文を含んでいる。前記成立時実行文は、前記条件文の条件式が成立する場合に実行される前記文である。前記不成立時実行文は、前記条件式が成立しない場合に実行される前記文である。前記条件文のうちの少なくとも１つは、前記成立時実行文及び／又は前記不成立時実行文として更に前記条件文を含むことができ、これにより前記条件文による前記文の階層化が可能である。また、前記文の前記階層化による前記モジュールの階層構造を特定することが可能である。前記装置は、記憶手段と、比較手段とを備えている。前記記憶手段には、２以上の前記モジュールが記憶されている。前記比較手段は、前記記憶手段に記憶された前記モジュールのうちの第１モジュールと第２モジュールとを前記記憶手段から取得する。前記比較手段は、前記第１モジュールの前記階層構造が前記第２モジュールの前記階層構造と一致しているか否か示すメッセージを作成する。【０００９】
また、本発明の他の側面によれば、コンピュータを、前記装置として機能させるためのプログラムが得られる。
【発明の効果】
【００１０】
本発明によれば、２つのモジュールの階層構造が互いに一致しているか否か示すメッセージが作成される。２つのモジュールの階層構造が互いに一致していない場合、２つのモジュールは意味的に異なる箇所を有している可能性が高い。従って、メッセージによって、２つのモジュールが意味的に異なる箇所を有しているか否かを知ることができる。【００１１】
添付の図面を参照しながら下記の最良の実施の形態の説明を検討することにより、本発明の目的が正しく理解され、且つその構成についてより完全に理解されるであろう。
【図面の簡単な説明】
【００１２】
【図１】本発明の第１の実施の形態による比較装置（装置）を示すブロック構成図である。
【図２】図１の装置の記憶装置に記憶されているモジュールのデータ構成を模式的に示す図である。
【図３】図１の記憶装置に記憶されている階層構造のデータ構成を模式的に示す図である。
【図４】図３のデータ構成の変形例を示す図である。
【図５】図１の装置の比較手段の機能を示すフローチャートである。
【図６】図１の記憶装置に記憶されているモジュール（第１モジュール）の一例と、例示した第１モジュールの階層構造とを示す図である。
【図７】図１の記憶装置に記憶されている他のモジュール（第２モジュール）の一例と、例示した第２モジュールの階層構造とを示す図である。
【図８】図６に示した第１モジュールの変形例と、変形例の階層構造とを示す図である。
【図９】図６及び図７の夫々の階層構造の変形例を示す図である。
【図１０】本発明の第２の実施の形態による比較装置（装置）を示すブロック構成図である。
【図１１】図１０の記憶装置に記憶されているモジュールの一例を示す図である。
【図１２】図１０の記憶装置に記憶されている二次的モジュールのデータ構成を模式的に示す図である。
【図１３】図１０の装置の変換手段の機能を示すフローチャートである。
【図１４】図１３の変換手段の機能の一部をより詳細に示すフローチャートである。
【図１５】図１０の装置の加工手段の機能を示すフローチャートである。
【図１６】図１０の装置の比較手段の機能を示すフローチャートである。
【図１７】図１０の記憶装置に記憶されている二次的モジュールのうちの２つのモジュール（第１モジュール及び第２モジュール）の夫々の例を示す図である。
【図１８】本発明の第３の実施の形態による比較装置（装置）を示すシステム構成図である。
【発明を実施するための形態】
【００１３】
本発明については多様な変形や様々な形態にて実現することが可能であるが、その一例として、図面に示すような特定の実施の形態について、以下に詳細に説明する。図面及び実施の形態は、本発明をここに開示した特定の形態に限定するものではなく、添付の請求の範囲に明示されている範囲内においてなされる全ての変形例、均等物、代替例をその対象に含むものとする。
【００１４】
（第１の実施の形態）
図１に示されるように、本発明の第１の実施の形態による比較装置（装置）１０は、装置本体２０と、記憶装置（記憶手段）３０と、入力装置４０と、表示装置５０とを備えている。比較装置１０は、プログラム言語によって記述された１以上の文から夫々なる２つのモジュール（ソースプログラム）を比較するものである。
【００１５】
本実施の形態によるプログラム言語はCOBOLである。しかしながら、本発明はCOBOL以外のプログラム言語にも適用可能である。
【００１６】
本実施の形態によるモジュールは、文字、数字、記号等を組み合わせたモジュール名によって特定可能である。
【００１７】
モジュールには、１以上の文から構成される処理単位を記述することができる。本実施の形態による処理単位は、COBOLにおけるセクションである。セクションの夫々は、セクション名（処理単位名）によって特定することができる。但し、処理単位は、セクションでなくてもよい。例えばプログラム言語がJAVA（商標）である場合、処理単位は、関数名（処理単位名）によって特定可能な関数であってもよい。
【００１８】
モジュールは、他のモジュール又は当該モジュール自身を呼び出すことができる。また、モジュールのセクションは、他のセクション又は当該セクション自身を実行することができる。より具体的には、モジュールには、文として、セクションをセクション名によって特定して実行するための処理単位実行文と、モジュールの一つをモジュール名によって特定して実行するためのモジュール呼び出し文とを記述することができる。本実施の形態によれば、処理単位実行文はPERFORM文であり、モジュール呼び出し文はCALL文である。他のプログラム言語における処理単位実行文及びモジュール呼び出し文の夫々は、例えば関数名を指定した文である。モジュール呼び出し文が関数名を指定した文である場合、モジュール呼び出し文によって、モジュールのうちの指定された関数部分（即ち、モジュールの一部）が実行される。この場合、モジュール呼び出し文においてモジュール名が明示的に記述されないことがありうる。即ち、関数名によってモジュール名が間接的に特定されることがありうる。
【００１９】
更に、モジュールには、文の一つである条件文を記述することができる。条件文は、条件式を備えており、条件文の中に成立時実行文及び／又は不成立時実行文を記述可能である。換言すれば、条件文は、成立時実行文及び／又は不成立時実行文を含むことができる。成立時実行文は、条件文の条件式が成立する場合に実行される文である。不成立時実行文は、条件式が成立しない場合に実行される文である。本実施の形態による条件文は、IF文及びEVALUATE文である。IF文においては、成立時実行文はTHEN句に記述される文であり、不成立時実行文は、ELSE句に記述される文である。同様に、EVALUATE文においては、成立時実行文はWHEN句に記述される文である。
【００２０】
本実施の形態による条件文のうちの少なくとも１つは、成立時実行文及び／又は不成立時実行文として更に条件文を含むことができ、これにより条件文による文の階層化が可能である。例えば、IF文の成立時実行文として、更にIF文を記述することができる。換言すれば、モジュールは、条件文によって階層化可能な１以上の文からなり、これにより所定の階層構造（即ち、条件文による階層構造）を有している。容易に理解されるように、モジュールの文を解析することにより、階層化によるモジュールの階層構造を特定することができる。
【００２１】
図１に示されるように、記憶装置３０は、例えば磁気ディスク装置である。記憶装置３０は、例えばフォルダ（図示せず）によって階層化された様々なファイルを記憶することができる。記憶装置３０は、装置本体２０と通信可能に接続されており、装置本体２０からの指示に従ってファイルの読込（取得）や書込（記憶）を行うことができる。本実施の形態による記憶装置３０には、２以上のモジュール３１が記憶されている。また、記憶装置３０には、階層構造３６を記憶することができる。
【００２２】
モジュール３１は、例えばプログラミングツール（図示せず）を使用して作成される。モジュール３１の夫々が一つのファイルであってもよい。複数のモジュール３１が一つのファイルとして記憶されていてもよい。階層構造３６は、モジュール３１の階層構造を記憶するものである。本実施の形態によれば、モジュール３１の夫々について、階層構造３６が作成される。
【００２３】
入力装置４０は、例えばキーボードやマウスである。入力装置４０は、装置本体２０と通信可能に接続されており、キーボードから入力された文字やマウスによって指示された位置を装置本体２０に通知することができる。
【００２４】
表示装置５０は、例えばディスプレイやプリンタである。表示装置５０は、装置本体２０と通信可能に接続されており、装置本体２０から転送されたデータ（例えば、文字や図形）を表示又は印刷することができる。
【００２５】
装置本体２０は、例えばＰＣ（Personal Computer）の本体である。装置本体２０は、ＣＰＵ（Central Processing Unit）、主記憶装置等を備えている（図示せず）。記憶装置３０には様々なプログラムの実行形式ファイルが記憶されている（図示せず）。ＣＰＵは、実行形式ファイルを主記憶装置にローディングし、実行形式ファイル内の命令語を実行することで様々な機能を実現する。ＣＰＵが命令語を実行する過程において、記憶装置３０に記憶された所定のファイルが、主記憶装置内のバッファ領域を経由してプログラムの変数領域に読み込まれる。プログラムの変数領域に読み込まれたファイルの内容は、必要に応じて主記憶装置内のバッファ領域を経由して記憶装置３０に書き込まれる。上記の説明から理解されるように、記憶装置３０及び主記憶装置の夫々は、本実施の形態における読み込み及び書き込み可能な記憶手段として機能する。換言すれば、本実施の形態による記憶手段は、記憶装置３０及び主記憶装置の一方であってもよいし、双方であってもよい。以降の説明においては、記憶手段として記憶装置３０を使用する。
【００２６】
本実施の形態による記憶装置３０には、比較プログラム等の様々なプログラムが記憶されている（図示せず）。上記のプログラムは、主記憶装置にローディングされ、ＣＰＵによって実行され、これによってコンピュータは、様々な手段として（即ち、装置として）機能する。例えば、比較プログラムは、コンピュータを、記憶装置３０に記憶されたモジュール３１のうちの第１モジュール３１と第２モジュール３１とを比較する比較手段２３（比較装置１０）として機能させる。換言すれば、本実施の形態による装置１０の装置本体２０は、比較手段２３を備えている。
【００２７】
図２に示されるように、本実施の形態によるモジュール３１は、ｎ個（ｎ≧１）の行３１０から構成される。本実施の形態によるモジュール３１は、テキストファイルである。但し、モジュール３１は、例えば、MICROSOFT EXCEL（商標）のワークシートであってもよい。モジュール３１がワークシートである場合、比較手段２３は、例えばEXCELマクロによって実現することができる。本実施の形態による行３１０は、一連番号（行識別）３１１と文３１２とから構成される。一連番号３１１は、行３１０を特定すると共に、行３１０の並び順を判断するためのものである。一連番号３１１は、数字だけでなく文字や記号を含んでいてもよい。文３１２には、文（例えば、データ定義文、実行文、コメント文）が記述されている。文３１２には、一つの完結した文全体が記述されていてもよい。文３１２には、一つの文の一部が記述されていてもよい。例えば、MOVE文が２つの行３１０の文３１２に分けて記述されていてもよい。
【００２８】
図３に示されるように、本実施の形態による階層構造３６は、ｍ個（ｍ≧１）の行３６０から構成される。本実施の形態による階層構造３６は、MICROSOFT EXCEL（商標）のワークシートである。但し、階層構造３６は、例えばテキストファイルであってもよい。階層構造３６は、比較手段２３がモジュール３１の階層構造を解析することによって作成され、モジュール３１と関連付けて記憶される。具体的には、例えば、階層構造３６のファイル名は、対応するモジュール３１のファイル名と同一である。あるいは、互いに対応するモジュール３１及び階層構造３６は、同一のワークブックの異なるワークシートであってもよい。
【００２９】
本実施の形態による行３６０は、一連番号（行識別）３６１と、階層の深さ３６２とから構成される。一連番号３６１には、対応するモジュール３１の行３１０の一連番号３１１が設定される。階層の深さ３６２には、一連番号３６１（即ち、一連番号３１１）に対応する文３１２の階層の深さが設定される。即ち、階層構造３６は、文３１２の階層化による階層の深さ３６２を有している。
【００３０】
例えば、図６に例示されたモジュール３１を参照すると、一連番号３１１が”0001”であるACCEPT文から一連番号３１１が”0004”であるACCEPT文までの文３１２の階層の深さは１である。一連番号３１１が”0005”であるIF文の階層の深さも１である。一連番号３１１が”0006”であるTHEN句の階層の深さは２である。以上の説明から理解されるように、モジュール３１の先頭の文３１２の階層の深さ３６２は１である。また、文３１２を順次参照したとき、THEN句が出現するたびに階層の深さ３６２はインクリメント（＋１）される。また、一連番号３１１が”0014”、”0017”、”0020”である文３１２の階層の深さ３６２から理解されるように、END-IFが出現するたびに階層の深さ３６２はデクリメント（−１）される。
【００３１】
上述のように、本実施の形態によれば、階層の深さ３６２は数値である。しかしながら、階層の深さ３６２は、階層構造における階層の深さを比較できる限り、数値でなくてもよい。更に、THEN句の検出によって更新された階層の深さ３６２が、対応するEND-IFの検出によって更新前の値に戻るように設計されていれば十分である。階層の深さは、実行文が記述された行についてのみ付与してもよい。更に、階層の深さは、IF文の先頭行及び終了行と、THEN句又はELSE句が記述された行のみに付与してもよい。
【００３２】
以下、本実施の形態による装置１０の機能及び動作について、図６乃至図８に示される例を参照しつつ、図５を使用して詳細に説明する。まず、条件文としてIF文のみがモジュール３１に含まれる場合（図６及び図７参照）を例にして説明する。次に、モジュール３１にIF文以外の条件文が含まれる例（図８参照）について説明する。
【００３３】
図５に示されるように、本実施の形態による比較手段２３は、例えば入力装置４０から入力された起動指示によって起動された後、モジュール３１のうちの第１モジュール３１を特定するための第１モジュール名、及び第２モジュール３１を特定するための第２モジュール名取得する（Ｓ５００）。例えば、第２モジュール３１は、第１モジュール３１をメンテナンスしたものである。第１モジュール名及び第２モジュール名の夫々は、例えば起動パラメータの一部として入力すればよい。
【００３４】
次に、比較手段２３は、取得した第１モジュール名によって特定される第１モジュール３１を記憶装置３０から読み込む（Ｓ５０２）。このとき、例えば所定のフォルダに記憶されたモジュール３１のみが読み込み対象であってもよい。第１モジュール３１が記憶装置３０に記憶されていない場合、比較手段２３は処理を終了する（図示せず）。
【００３５】
次に、比較手段２３は、第１モジュール３１の各文３１２の階層の深さを得て、第１の階層構造３６を作成する（Ｓ５０４）。具体的には、比較手段２３は、第１モジュール３１の行３１０を１行目から最終行まで順次取得し、行３１０の夫々に階層の深さを付与する。このとき、比較手段２３は、１行目の階層の深さを１とし、IF文のTHEN句を検出するたびに階層の深さをインクリメントする。一方、比較手段２３は、IF文のEND-IF（即ち、IF文の終了）を検出するたびに階層の深さをデクリメントする。THEN句やEND-IFの記述を省略することが可能な場合は、IF文における文の並び等を解析して階層の深さを設定すればよい。比較手段２３は、行３１０の一連番号３１１と上述のようにして得た階層の深さとを組み合わせて、階層構造３６を作成する。
【００３６】
図６の例を参照すると、比較手段２３は、第１モジュール３１の先頭の実行文（即ち、一連番号３１１が”0001”の文３１２）から最後の実行文（即ち、一連番号３１１が”0020”の文３１２）までの文３１２に対して階層の深さ３６２を付与している。比較手段２３は、一連番号３１１と階層の深さ３６２とを組み合わせて第１の階層構造３６を作成している。
【００３７】
次に、図５に示されるように、比較手段２３は、取得した第２モジュール名によって特定される第２モジュール３１を、第１モジュール３１と同様に、記憶装置３０から読み込む（Ｓ５０６）。
【００３８】
次に、比較手段２３は、第１モジュール３１と同様に、第２モジュール３１の各文３１２の階層の深さを得て、第２の階層構造３６を作成する（Ｓ５０８）。
【００３９】
図７の例を参照すると、比較手段２３は、第２モジュール３１の先頭の実行文（即ち、一連番号３１１が”0001”の文３１２）から最後の実行文までの文３１２（即ち、一連番号３１１が”0014”の文３１２）に対して階層の深さ３６２を付与している。比較手段２３は、一連番号３１１と階層の深さ３６２とを組み合わせて第２の階層構造３６を作成している。
【００４０】
図５に示されるように、本実施の形態による比較手段２３は、作成した第１の階層構造３６及び第２の階層構造３６を、記憶装置３０に書き込む（Ｓ５１０）。但し、第１の階層構造３６及び第２の階層構造３６は、装置本体２０の主記憶装置（図示せず）のみに記憶されていてもよい。換言すれば、階層構造３６は、記憶装置３０ではなく主記憶装置（図示せず）に記憶されていてもよい。
【００４１】
次に、比較手段２３は、第１の階層構造３６と第２の階層構造３６とを比較する（Ｓ５１２）。例えば、比較手段２３は、第１の階層構造３６の階層の深さ３６２と第２の階層構造３６の階層の深さ３６２とを１行目から順次比較し、階層の深さ３６２の変化が一致するか否かを判定する。
【００４２】
図６及び図７に例示する第１の階層構造３６及び第２の階層構造３６を参照すると、第１の階層構造３６（図６参照）における階層の深さ３６２は、変化していない箇所を除き、１，２，３，４，３，２，１の順に変化している。一方、第２の階層構造３６（図７参照）における階層の深さ３６２は、変化していない箇所を除き、１，２，３，２，１の順に変化している。従って、第１の階層構造３６の階層の深さ３６２の変化は、第２の階層構造３６の階層の深さ３６２の変化と一致しない。この場合、比較手段２３は、第１モジュール３１の第１の階層構造３６が第２モジュール３１の第２の階層構造３６と一致していないことを示すメッセージを作成する。一方、仮に第２の階層構造３６の階層の深さ３６２が、１，２，３，４，３，２，１の順に変化している場合、第１の階層構造３６の階層の深さ３６２の変化は、第２の階層構造３６の階層の深さ３６２の変化と一致する。この場合、比較手段２３は、第１モジュール３１の第１の階層構造３６が第２モジュール３１の第２の階層構造３６と一致していることを示すメッセージを作成する。
【００４３】
即ち、比較手段２３は、第１の階層構造３６と第２の階層構造３６との比較結果（メッセージ）を作成する（図５のＳ５１２）。本実施の形態による比較手段２３は、作成したメッセージを表示装置５０に表示する（Ｓ５１２）。
【００４４】
第１の階層構造３６及び第２の階層構造３６は、本実施形態と異なる方法で比較してもよい。例えば、図６及び図７から理解されるように、IF文、THEN句、ELSE句及びEND-IFについてのみ、一連番号３６１及び階層の深さ３６２を作成してもよい（図６及び図７において階層の深さ３６２を丸で囲んだ箇所参照）。この場合、第１の階層構造３６の階層の深さ３６２を、第２の階層構造３６の階層の深さ３６２と１行目から順次比較することで、第１の階層構造３６と第２の階層構造３６とを比較することができる。
【００４５】
また、図８から理解されるように、第１モジュール３１及び第２モジュール３１のうちの少なくとも一方にIF文以外の条件文が含まれていてもよい。例えば、EVALUATE文が含まれている場合、比較手段２３は、EVALUATE文の最初のWHEN句を検出したときに階層の深さを更新し、EVALUATE文に対応するEND-EVALUATEを検出したときに階層の深さを更新前に戻せばよい。IF文、EVALUATE文以外の条件文についても同様に処理することができる。容易に理解されるように、階層構造３６（第１の階層構造３６及び第２の階層構造３６）を作成した後の比較手段２３の機能・動作は、モジュール３１に条件文としてIF文のみが含まれている場合と同じである。
【００４６】
前述のように、本実施の形態による比較手段２３は、第１の階層構造３６が第２の階層構造３６と一致していない場合だけでなく、一致している場合もメッセージを作成する。しかしながら、比較手段２３は、第１の階層構造３６が第２の階層構造３６と一致している場合及び一致していない場合のうちの一方の場合にのみメッセージを作成してもよい。また、比較手段２３が作成するメッセージは、第１モジュール３１の第１の階層構造３６が第２モジュール３１の第２の階層構造３６と一致しているか否か示すだけでなく、第１の階層構造３６と第２の階層構造３６との相違箇所を示してもよい。この場合、以下に説明するように、比較手段２３は、階層構造３６に代えて、階層構造３６ａ（図４参照）を作成してもよい。
【００４７】
図４に示されるように、階層構造３６ａは、ｍａ個（ｍａ≧１）の行３６０ａから構成される。階層構造３６ａは、階層構造３６と同様に、比較手段２３がモジュール３１の階層構造を解析することによって作成され、モジュール３１と関連付けて記憶される。
【００４８】
階層構造３６ａの行３６０ａは、対応するモジュール３１の条件文に対応して夫々作成される。例えば、図６の例を参照すると、第１モジュール３１の条件文（IF文）は、一連番号３１１が”0005”、”0007”及び”0009”の３つの行３１０に記述されている。このため、図９の上段に示すように、第１モジュール３１の第１の階層構造３６ａは、３つの行３６０ａを有する。一方、図７の例を参照すると、第２モジュール３１の条件文（IF文）は、一連番号３１１が”0004”及び”0006”の２つの行３１０に記述されている。このため、図９の下段に示すように、第２モジュール３１の第２の階層構造３６ａは、２つの行３６０ａを有する。
【００４９】
図４に示されるように、行３６０ａは、一連番号（行識別）３６１と、階層パターン３６３と、終了行（一連番号）３６４とから構成される。一連番号３６１には、対応するモジュール３１の一連番号３１１が設定される。終了行３６４には、一連番号３６１（一連番号３１１）の行３１０に記載された条件文の終了箇所（例えば、IF文に対応するEND-IFが記述された行３１０）の一連番号３１１が設定される。階層パターン３６３には、以下に説明するように、一連番号３６１から終了行３６４までの範囲についての階層構造を特定可能なデータが設定される。
【００５０】
例えば、図６の例および図９の上段の例を参照すると、一連番号３１１が"0005"の行３１０に記述された最初のIF文は、一連番号３１１が"0020"の行３１０で終了する。従って、第１の階層構造３６ａの１行目の一連番号３６１及び終了行３６４には、"0005"及び"0020"が、夫々設定される。また、この場合、比較手段２３は、一連番号３１１が"0005"の行３１０から一連番号３１１が"0020"の行３１０の間に記述されたIF文、THEN句、ELSE句及びEND-IFの階層の深さを連結して、圧縮前の階層パターン（"1 2 2 3 3 4 4 3 3 2 2 1"）を作成する。次に、比較手段２３は、圧縮前の階層パターン内の連続する同一の階層の深さを１つに圧縮して圧縮後の階層パターン３６３（"1 2 3 4 3 2 1"）を作成する。比較手段２３は、一連番号３１１が"0007"の行３１０に記述されたIF文、及び一連番号３１１が"0009"の行３１０に記述されたIF文についても、同様に圧縮後の階層パターン３６３を作成する。以上の説明から理解されるように、比較手段２３は、第１モジュール３１の条件文の夫々の一連番号３６１、終了行３６４及び階層パターン３６３を得て、第１の階層構造３６ａを作成する（図５のＳ５０４参照）。
【００５１】
同様に、図７の例及び図９の下段の例から理解されるように、比較手段２３は、第２モジュール３１の条件文の夫々の一連番号３６１、終了行３６４及び階層パターン３６３を得て、第２の階層構造３６ａを作成する（図５のＳ５０８参照）。
【００５２】
本変形例による比較手段２３は、上述のように作成した第１の階層構造３６ａと第２の階層構造３６ａとを比較し、比較結果を表示する（図５のＳ５１２）。例えば、比較手段２３は、第１の階層構造３６ａの階層パターン３６３と、第２の階層構造３６ａの階層パターン３６３とを順次比較する。このとき、比較手段２３は、階層の深さが１で始まる階層パターン３６３のみを比較してもよい。例えば、図９の例を参照すると、第１の階層構造３６ａのうち一連番号３６１が"0005"である階層パターン３６３と、第２の階層構造３６ａのうち一連番号３６１が"0004"である階層パターン３６３とを比較すればよい。
【００５３】
上述した変形例によれば、第１の階層構造３６ａ（即ち、第１モジュール３１）の階層パターン３６３が第２の階層構造３６ａ（即ち、第２モジュール３１）の階層パターン３６３と一致しない場合、一致しないことを示すメッセージと共に、一致しない箇所を表示装置５０に表示することができる。具体的には、例えば、不一致の階層パターン３６３の夫々に対応する一連番号３１１及び終了行３６４を表示装置５０に表示すればよい。
【００５４】
比較手段２３は、階層の深さが１で始まる階層パターン３６３だけでなく、全ての階層パターン３６３を比較してもよい。この場合、第１モジュール３１と第２モジュール３１との一致しない箇所をより狭い範囲に特定することができる。
【００５５】
上述のように、本実施の形態（変形例を含む）による比較手段２３は、メッセージを表示装置５０に表示する。但し、比較手段２３は、メッセージを表示装置５０に表示すると共に、記憶手段３０に記憶してもよい。更に、比較手段２３は、メッセージを表示装置５０に表示せずに、記憶手段３０に記憶してもよい。更に、比較手段２３は、メッセージを他の装置や手段に送信してもよい。
【００５６】
本実施の形態による比較手段２３は、上述した変形例に加え、以下に説明するように、様々に変形することが可能である。
【００５７】
例えば、第１モジュール３１及び第２モジュール３１のうちの少なくとも一方は、複数のモジュール３１を連結したものであってもよい。例えば、複数のモジュール３１を、夫々の開始行から終了行まで単純に順に連結して、第１モジュール３１又は第２モジュール３１としてもよい。このようにすることで、複数のモジュール３１からなる１つのプログラム全体を纏めて比較することができる。複数のモジュール３１は、以下に説明する第２の実施の形態のように連結することも可能である。
【００５８】
（第２の実施の形態）
図１０に示されるように、本発明の第２の実施の形態による比較装置（装置）１０′は、装置本体２０′と、記憶装置（記憶手段）３０′と、入力装置４０と、表示装置５０とを備えている。装置１０′は、第１の実施の形態による装置１０と同様に、プログラム言語によって記述された１以上の文から夫々なる２つのモジュール（ソースプログラム）を比較するものである。第２の実施の形態によるプログラム言語、モジュール、入力装置４０及び表示装置５０は、第１の実施の形態と同様に夫々構成されている。
【００５９】
図１０に示されるように、記憶装置３０′は、記憶装置３０と同様な磁気ディスク装置である。記憶装置３０′には、第１の実施の形態と同様に、２以上のモジュール３１が記憶されている。また、記憶装置３０′には、２以上の二次的モジュール（モジュール）３２が記憶される。本実施の形態による二次的モジュール３２は、１つのモジュール３１を変換して作成されるか、又は２以上のモジュール３１を連結し変換して作成される。
【００６０】
装置本体２０′は、装置本体２０と同じく、例えばＰＣの本体である。装置本体２０′は、ＣＰＵ、主記憶装置等を備えている（図示せず）。第１の実施の形態と同様に、記憶装置３０′と主記憶装置とは、本実施の形態における読み込み及び書き込み可能な記憶手段として夫々機能する。以降の説明における記憶手段としては記憶装置３０′を例示する。
【００６１】
本実施の形態による記憶装置３０′には、変換プログラムと、加工プログラムと、比較プログラムとが記憶されている（図示せず）。上記のプログラムは、主記憶装置にローディングされ、ＣＰＵによって実行され、これによってコンピュータは、変換手段２１、加工手段２２、及び比較手段２３′として夫々機能する。即ち、上記のプログラムは、コンピュータをプログラム言語によって記述された１以上の文から夫々なる２つのモジュールを比較する装置１０′として機能させるためのものである。換言すれば、本実施の形態による装置１０′の装置本体２０′は、変換手段２１と、加工手段２２と、比較手段２３′とを備えている。
【００６２】
本実施の形態による変換手段２１は、記憶装置３０′に記憶されたモジュール３１のうちの所定のモジュール３１を二次的モジュール３２に変換して記憶装置３０′に記憶する。加工手段２２は、記憶装置３０′に記憶された二次的モジュール３２（第１モジュール３２及び／又は第２モジュール３２）を加工する。比較手段２３′は、第１の実施の形態の比較手段２３と同様に、記憶装置３０′に記憶された第１モジュール３２と第２モジュール３２とを比較する。但し、本実施の形態による比較手段２３′は、２つのモジュール３１を比較するのでなく、２つのモジュール３１から夫々作成された２つの二次的モジュール３２（第１モジュール３２及び第２モジュール３２）を比較する。
【００６３】
図１１に例示されるように、記憶装置３０′には、例えばモジュール名がＸＸＸであるモジュール３１（ＸＸＸモジュール）と、モジュール名がＡＡＡであるモジュール３１（ＡＡＡモジュール）と、モジュール名がＢＢＢであるモジュール３１（ＢＢＢモジュール）と、モジュール名がＣＣＣであるモジュール３１（ＣＣＣモジュール）とが記憶されている。モジュール３１の夫々は、一連番号３１１と文３１２とからなる複数の行３１０から構成されている。以下、この例を参照しつつ、モジュール３１の構造をより具体的に説明する。
【００６４】
ＸＸＸモジュールは、メインモジュール（即ち、処理の起点となるモジュール）である。ＸＸＸモジュールは、ＡＡＡモジュールとＢＢＢモジュールとをモジュール名によって特定して呼び出すためのCALL文が夫々記述された行３１０を有している。ＡＡＡモジュールは、ＣＣＣモジュールを呼び出すCALL文が記述された行３１０を有している。
【００６５】
図１１に例示されたモジュール３１の夫々は、１以上のセクションから構成されている。例えば、ＸＸＸモジュールは、メインセクション（即ち、モジュールにおける処理の起点となる主たる処理単位）と、従たるセクション（従たる処理単位）とを有している。メインセクションは、”PROCEDURE DIVISION.”が記述された行３１０の次の行３１０から、”STOP RUN.”が記述された行３１０までの行３１０から構成されている。従たるセクション（サブセクション）のうちの１つは、”AAA-SUB SECTION.”が記述された行３１０から、”EXIT.”が記述された行３１０までの行３１０から構成されている。上述のサブセクションのセクション名（処理単位名）はＡＡＡ−ＳＵＢである。メインセクションは、ＡＡＡ−ＳＵＢセクションをセクション名によって特定して実行する行３１０を有している。より具体的には、メインセクションは、”PERFORM AAA-SUB.”が記述された行３１０を有している。
【００６６】
図１１に例示されたセクションのいくつかは、条件文が記述された行３１０を備えている。例えば、ＸＸＸモジュールのメインセクションは、５つのWHEN句を有するEVALUATE文が記述された行３１０と、THENおよびELSEを有するIF文が記述された行３１０とを備えている。ＣＣＣモジュールのメインセクションは、IF文のELSEにおいて更にIF文が記述された行３１０を備えており、これによって条件文による文３１２の階層化が行われている。
【００６７】
図１２に示されるように、本実施の形態による二次的モジュール３２は、複数の二次的行（行）３２０から構成される。本実施の形態による二次的モジュール３２は、MICROSOFT EXCEL（商標）のワークシートである。但し、二次的モジュール３２は、例えばテキストファイルであってもよい。本実施の形態による行３２０は、モジュール識別３２１と、行番号３２２と、階層構造３２３と、一連番号（行識別）３２６と、二次的文３２７とから構成される。
【００６８】
二次的モジュール３２の夫々は、１以上のモジュール３１から実行文等が記述された行３１０を集めて加工することによって生成されている。本実施の形態による二次的モジュール３２は、変換手段２１によって生成され、加工手段２２によって加工される。加工された二次的モジュール３２は、比較手段２３′によって参照される。
【００６９】
図１２に例示されるように、本実施の形態による二次的モジュール３２は、例えば、ＸＸＸモジュール、ＡＡＡモジュール、ＢＢＢモジュール及びＣＣＣモジュールのPROCEDURE DIVISIONの行３１０を集めて加工したものである。
【００７０】
図１１及び図１２から理解されるように、行３１０の文３１２に記述されているPERFORM文（例えば、図１１の"PERFORM PGMAAAP-PROC"）は、行３２０の二次的文３２７においてコメント化されている。また、PERFORM文によって実行されるPGMAAAP-PROCセクションの文３１２が、行３２０の二次的文３２７として展開されている。行３２０の二次的文３２７において、行３１０の文３１２に記述されているCALL文はコメント化されている（即ち、コメント文に変更されている）。CALL文によって呼び出されるＡＡＡモジュールのPROCEDURE DIVISIONの文３１２は、行３２０の二次的文３２７として展開されている（即ち、展開されて、行３２０の二次的文３２７が生成されている）。更に、ＡＡＡモジュールからCALL文によって呼び出されるＣＣＣモジュールのPROCEDURE DIVISIONの文３１２は、行３２０の二次的文３２７として展開されている。
【００７１】
また、文３１２に記述された条件文のうちIF文以外の条件文（本実施の形態においてはEVALUATE文）は、二次的文３２７においてIF文に変換されている。例えば、”EVALUATE WK-A-O”、”WHEN CS-1”、”MOVE CS-1 TO WK-B-I”が夫々記述された３つの文３１２は、”*#E EVALUATE WK-A-O”（コメント文）、”*#E WHEN CS-1”（コメント文）、”IF ( WK-A-O = CS-1 )”、”THEN”、”MOVE CS-1 TO WK-B-I”が夫々記述された５つの二次的文３２７に変換されている（図１２の破線Ａで囲まれた箇所参照）。本実施の形態によれば、上記の変換に加え、IF文におけるTHEN、ELSE及びEND IFの欠落を補うための二次的文３２７が生成される。また、否定の条件式は肯定の条件式に変換される。更に、ANDやORで連結された条件式を有するIF文は複数のIF文に分解されて、２つの評価対象オペランド間の関係を１つの論理演算子のみによって評価する単純な二次的条件式を有するIF文に変換される。但し、上記の変換の一部（例えば、ANDやORで連結された条件式の分解）は行わなくてもよい。
【００７２】
更に、複数の文３１２に分かち書きされている実行文（例えば、MOVE文）は、１つの二次的文３２７に纏められる。即ち、二次的モジュール３２の行３２０の夫々は、モジュール３１の行３１０に基づいて生成されている。より具体的には、二次的文３２７は、文３１２をそのままコピーしたものであるか、又は文３１２を加工および／又は展開することによって生成されたものである。
【００７３】
本実施の形態によるモジュール識別３２１は、夫々の行３２０がいずれのモジュール３１に基づくものであるかを示すものである。より具体的には、モジュール識別３２１には、モジュール名（例えば、ＸＸＸ）が設定される。但し、モジュール名に代えて、モジュール３１を一意に識別可能な番号等を設定してもよい。
【００７４】
一連番号３２６には、二次的文３２７が文３１２のコピーである行３２０においては、コピー元の行３１０の一連番号３１１が設定される。換言すれば、行３１０と１対１に対応する行３２０（例えば、文３１２をコメント化した二次的文３２７の行３２０）については、一連番号３２６には、対応する行３１０の一連番号３１１が設定される。一方、生成された（追加された）行３２０の一連番号３２６には、生成された行３２０であることを識別可能な識別子（例えば、記号の組み合わせ）が設定される。このようにすることで、行３２０と行３１０とを容易に対応付けることができる。
【００７５】
本実施の形態による行番号３２２には、１から始まる通番が行３２０の並び順に沿って設定されている。但し、行番号３２２は、行番号３２２の大小関係を比較することが可能な限り、通番でなくてもよい。例えば、行番号３２２は文字や記号の組み合わせであってもよい。
【００７６】
本実施の形態による階層構造３２３は、分岐階層３２４と、階層の深さ３２５とから構成されている。分岐階層３２４は、条件文による階層を識別するために使用される。本実施の形態による分岐階層３２４は、１行目の行３２０における出発値として１を使用することにより設定される。換言すれば、１行目の行３２０の分岐階層３２４は１である。分岐階層３２４は、IF文のTHENが記述された行３２０において１．１に変更され、ELSEが記述された行３２０において１．２に変更される。分岐階層３２４は、IF文のEND IFが記述された行３２０の次の行から１に戻る。一般化すると、THENが記述された行３２０においては、直前の行３２０の分岐階層３２４の末尾に「．１」が加えられ、ELSEが記述された行３２０においては、直前の行３２０の分岐階層３２４の末尾「．１」が「．２」に変更され、END IFが記述された行３２０の次の行においては、END IFが記述された行３２０の分岐階層３２４の末尾「．２」が削除される。上記の場合を除き、分岐階層３２４には、直前の行３２０と同一の値が設定される。
【００７７】
本実施の形態による階層の深さ３２５は、分岐階層３２４と同様に、１行目の行３２０における出発値として１を使用することにより設定される。換言すれば、１行目の行３２０の階層の深さ３２５は、１である。階層の深さ３２５は、IF文のTHENが記述された行３２０において１．１に変更され、END IFが記述された行３２０の次の行から１に戻る。更に、その後のIF文のTHENが記述された行３２０において１．２に変更され、END IFが記述された行３２０の次の行から１に戻る。一般化すると、階層の深さ３２５は、１を出発値としており、THENが記述された行３２０において末尾に「．ｑ」（ｑは１以上の整数）なる桁が加えられ、END IFが記述された行３２０の次の行において末尾の「．ｑ」なる桁が削除される。「．ｑ」におけるｑの値は、桁の夫々について１を出発値としている。詳しくは、１桁目の「．ｑ」（例えば１．２の「．２」）におけるｑの値は、１を出発値としており、付加される毎にインクリメントされる。一方、２桁目以降の「．ｑ」（例えば１．２．１の「．１」）におけるｑの値は、当該桁を除いた階層の深さ３２５が同一値である行３２０が連続する範囲において１を出発値としており、当該連続する範囲において付加される毎にインクリメントされる。
【００７８】
行３２０は、以上に説明した項目に加えて様々な項目を備えることができる。例えば、行３２０が、対応する行３１０のセクション名を備える場合、行３２０と行３１０との対応を、より容易に把握することができる。
【００７９】
以下、本実施の形態による装置１０′の機能及び動作について詳細に説明する。
【００８０】
図１３から理解されるように、本実施の形態による変換手段２１は、制御パラメータ取得機能（Ｓ１３００）と、読込機能（Ｓ１３０２、Ｓ１３０４）と、変換機能（Ｓ１３０６〜Ｓ１３１２）と、書込機能（Ｓ１３１４）とを有している。制御パラメータ取得機能は、展開制御パラメータを取得する機能である。読込機能は、モジュール３１のうち処理対象とする対象モジュール３１を記憶装置３０′から読み込む機能である。変換機能は、対象モジュール３１を二次的モジュール３２に変換する機能である。書込機能は、二次的モジュール３２を記憶装置３０′に記憶する機能である。
【００８１】
より具体的には、図１３に示されるように、変換手段２１は、例えば入力装置４０から入力された起動指示によって起動されると、例えば起動指示の一部として入力された展開制御パラメータを取得する（Ｓ１３００）。本実施の形態による展開制御パラメータには、展開指示を含ませることができる。展開指示は、実行対象のセクション又は呼び出し対象のモジュール３１の文３１２に記述されている文の展開を初回のみに制限することを指示するものである。
【００８２】
次に、変換手段２１は、対象モジュール３１を特定するための対象モジュール名を取得する（Ｓ１３０２）。対象モジュール名は、展開制御パラメータと同様な方法で入力することができる。変換手段２１は、取得した対象モジュール名によって特定される対象モジュール３１を記憶装置３０′から読み込む（Ｓ１３０４）。このとき、例えば所定のフォルダに記憶されたモジュール３１のみが読み込み対象であってもよい。対象モジュール３１が記憶装置３０′に記憶されていない場合、変換手段２１は、処理を終了する（図示せず）。
【００８３】
次に、変換手段２１は、対象モジュール３１の処理開始箇所の文３１２を取得する（Ｓ１３０６）。本実施の形態による処理開始箇所は、メインセクションの先頭である。変換手段２１は、取得した文３１２について二次的文出力処理を行う（Ｓ１３０８）。次に、変換手段２１は、処理終了箇所の文３１２を処理済みであるか判定する（Ｓ１３１０）。本実施の形態による処理終了箇所は、メインセクションの末尾である。処理が終了している場合（Ｓ１３１０においてＹＥＳの場合）、変換手段２１は、作成した二次的モジュール３２を記憶装置３０′に書き込み（Ｓ１３１４）、処理を終了する。一方、処理が終了していない場合（Ｓ１３１０においてＮＯの場合）、変換手段２１は、次に処理する文３１２（後続する行３１０の文３１２）を取得し（Ｓ１３１２）、取得した文３１２について二次的文出力処理を行う（Ｓ１３０８）。
【００８４】
図１４は、図１３に示した変換手段２１の処理（機能）のうち、二次的文出力処理（Ｓ１３０８）をより詳細に示すフローチャートである。図１４に示されるように、変換手段２１は、二次的文出力処理において文３１２を二次的文３２７として出力する（Ｓ１４００）。より具体的には、本実施の形態によれば、文３１２に記述されている実行文等をワークシートの所定の行・列にコピーする。このとき、前述したように、PERFORM文をコメント文にする等の加工が行われる。更に、変換手段２１は、モジュール識別３２１と、行番号３２２と、一連番号３２６とに前述したような値を設定する。
【００８５】
次に、変換手段２１は、文３１２に条件文が記述されているか判定する（Ｓ１４０２）。文３１２に記述されている実行文が条件文である場合（Ｓ１４０２でＹＥＳの場合）、変換手段２１は、前述したようにIF文以外の条件文をIF文に変換する等の処理を行う。より具体的には、変換手段２１は、条件文の条件式に基づいて、二次的文の一つである二次的条件文（IF文）が記述された二次的文３２７を生成し、二次的条件文によって二次的文３２７を階層化して二次的モジュールに出力し（Ｓ１４０４）、二次的文出力処理を終了する。
【００８６】
文３１２に記述されている実行文（即ち、対象文）が条件文でない場合（Ｓ１４０２でＮＯの場合）、変換手段２１は、対象文が処理単位実行文（PERFORM文）であるか判定する（Ｓ１４０６）。対象文が処理単位実行文である場合（Ｓ１４０６でＹＥＳの場合）、変換手段２１は、実行対象の処理単位の処理開始箇所の文３１２を取得する。本実施の形態においては、処理単位の処理開始箇所はセクションの先頭である。
【００８７】
対象文が処理単位実行文でない場合（Ｓ１４０６でＮＯの場合）、変換手段２１は、対象文がモジュール呼び出し文（本実施の形態によれば、CALL文）であるか判定する（Ｓ１４１０）。対象文がモジュール呼び出し文である場合（Ｓ１４１０でＹＥＳの場合）、変換手段２１は、CALL文によって特定される呼び出し対象のモジュール３１を記憶装置３０′から読み込み（Ｓ１４１２）、呼び出し対象のモジュール３１の処理開始箇所の文３１２を取得する（Ｓ１４１４）。本実施の形態によれば、呼び出し対象のモジュール３１の処理開始箇所は、当該モジュール３１のメインセクションの先頭である。対象文がモジュール呼び出し文でない場合（Ｓ１４１０でＮＯの場合）、変換手段２１は二次的文出力処理を終了する。
【００８８】
変換手段２１は、実行対象のセクションの文３１２又は呼び出し対象のモジュール３１の文３１２について、再帰的に二次的文出力処理を行う（Ｓ１４１６）。次に、変換手段２１は、処理終了箇所の文３１２を処理済みであるか判定する（Ｓ１４１８）。本実施の形態による処理終了箇所は、実行対象のセクションについては当該セクションの末尾であり、呼び出し対象のモジュール３１についてはメインセクションの末尾である。処理が終了している場合（Ｓ１４１８においてＹＥＳの場合）、変換手段２１は、二次的文出力処理を終了する。一方、処理が終了していない場合（Ｓ１４１８においてＮＯの場合）、変換手段２１は、次に処理する文３１２（後続する行３１０の文３１２）を取得し（Ｓ１４２０）、取得した文３１２について再帰的に二次的文出力処理を行う（Ｓ１４１６）。
【００８９】
変換手段２１は、再帰的な（自分自身を実行する）PERFORM文については、実行対象のセクションの文３１２の展開を行わない。同様に、変換手段２１は、再帰的な（自分自身を呼び出す）CALL文については、呼び出し対象のモジュール３１の文３１２の展開を行わない。更に、変換手段２１は、展開制御パラメータに展開指示が指定されている場合、既に二次的文出力処理を行ったセクションとセクション名が同一であるセクションを実行するPERFORM文については、二次的文出力処理を行わない（Ｓ１４０６）。同様に、変換手段２１は、展開制御パラメータに展開指示が指定されている場合、既に二次的文出力処理を行ったモジュール３１とモジュール名が同一であるモジュール３１を呼び出すCALL文については、二次的文出力処理を行わない（Ｓ１４１０）。
【００９０】
以上の説明から理解されるように、変換手段２１の変換機能は、対象モジュール３１の所定の処理開始箇所から所定の処理終了箇所までに記述された文３１２の夫々を二次的文３２７として二次的モジュールに順次出力する。更に、変換手段２１の変換機能は、文３１２が処理単位実行文又はモジュール呼び出し文である場合、実行対象の処理単位又は呼び出し対象のモジュール３１に記述されている文３１２を展開することで二次的文３２７を生成して二次的モジュール３２に出力する。更に、変換手段２１の変換機能は、展開される文３１２における処理単位実行文又はモジュール呼び出し文についても展開を更に行う（即ち、再帰的に展開する）。従って、多数の処理単位やモジュール３１に分散された機能を、対象モジュール３１のメインセクションに手繰り寄せるようにして集めることができる。換言すれば、１つのプログラムの機能を１つの二次的モジュール３２に集めることができる。
【００９１】
以上の説明から理解されるように、本実施の形態による変換手段２１の変換機能は、展開制御パラメータに展開指示が指定されている場合、同一の処理単位については、実行対象の処理単位に記述されている文３１２の展開を初回の１回のみ行い（即ち、同一の処理単位を１回のみ展開し）、同一のモジュール３１については、呼び出し対象のモジュール３１に記述されている文３１２の展開を初回の１回のみ行う（即ち、同一のモジュール３１を１回のみ展開する）。但し、変換手段２１の変換機能は、展開指示が指定されていない場合に、同一の処理単位や同一のモジュール３１を１回のみ展開してもよい。また、変換手段２１の変換機能は、展開指示が指定されているか否には係らず、同一の処理単位や同一のモジュール３１を１回のみ展開してもよい。更に、変換手段２１の変換機能は、展開指示が指定されているか否には係らず、同一の処理単位や同一のモジュール３１を繰り返し展開してもよい。
【００９２】
以上に説明したように、変換手段２１によって、二次的文３２７からなる二次的モジュール３２が記憶装置３０′に記憶される。
【００９３】
図１５から理解されるように、本実施の形態による加工手段２２は、読込機能（Ｓ１５００、Ｓ１５０２）と、階層構造付加機能（Ｓ１５０６）と、書込機能（Ｓ１５１０）とを有している。読込機能は、処理対象の二次的モジュール３２を記憶装置３０′から読み込む機能である。階層構造付加機能は、二次的モジュール３２の二次的文３２７の少なくとも一部について階層構造３２３を付加する機能である。書込機能は、階層構造３２３が付加された二次的文３２７からなる二次的モジュール３２を記憶装置３０′に記憶する機能である。
【００９４】
より具体的には、図１５に示されるように、加工手段２２は、例えば変換手段２１と同様に起動されると、処理対象の二次的モジュール３２を特定するための二次的モジュール名を取得する（Ｓ１５００）。加工手段２２は、取得した二次的モジュール名によって特定される二次的モジュール３２を記憶装置３０′から読み込む（Ｓ１５０２）。処理対象の二次的モジュール３２が記憶装置３０に記憶されていない場合、加工手段２２は、処理を終了する（図示せず）。
【００９５】
次に、加工手段２２は、処理対象の二次的モジュール３２の処理開始箇所の二次的文３２７を取得する（Ｓ１５０４）。本実施の形態による処理開始箇所は、二次的モジュール３２の先頭である。
【００９６】
加工手段２２は、取得した二次的文３２７について階層構造３２３を付加する（Ｓ１５０６）。より具体的には、本実施の形態による加工手段２２は、処理対象の二次的モジュール３２が記録されたワークシート（即ち、対象ワークシート）において行３２０の階層構造３２３と対応する行・列に、前述したような分岐階層３２４と階層の深さ３２５とを設定する。
【００９７】
次に、加工手段２２は、処理終了箇所の二次的文３２７を処理済みであるか判定する（Ｓ１５０８）。本実施の形態による処理終了箇所は、二次的モジュール３２の末尾である。処理が終了している場合（Ｓ１５０８においてＹＥＳの場合）、加工手段２２は、加工した二次的モジュール３２を記憶装置３０′に書き込み（Ｓ１５１０）、処理を終了する。一方、処理が終了していない場合（Ｓ１５０８においてＮＯの場合）、加工手段２２は、次に処理する二次的文３２７（後続する行３２０の二次的文３２７）を取得し（Ｓ１５１２）、取得した二次的文３２７について階層構造３２３の付加を行う（Ｓ１５０６）。
【００９８】
以上に説明したように、加工手段２２によって、階層構造３２３が付加された二次的文３２７からなる二次的モジュール３２が記憶装置３０′に記憶される。以上の説明から理解されるように、変換手段２１に、加工手段２２の機能を備えることもできる。この場合、装置本体２０′は、加工手段２２を備えていなくてもよい。
【００９９】
本実施の形態による比較手段２３′は、第１の実施の形態による比較手段２３と同様な機能を備えている。以下、比較手段２３と異なる機能を中心に、図１７に示される例を参照しつつ、図１６を使用して説明する。
【０１００】
比較手段２３′は、比較手段２３と同様に起動されると、二次的モジュール３２のうちの第１モジュール３２を特定するための第１モジュール名、及び第２モジュール３２を特定するための第２モジュール名取得する（Ｓ１６００）。例えば、第１モジュール３２は、所定プログラムのメンテナンスする前のモジュール３１を連結した二次的モジュール３２であり、第２モジュール３２は、所定プログラムのメンテナンスされた後のモジュール３１を連結した二次的モジュール３２である。
【０１０１】
次に、比較手段２３′は、取得した第１モジュール名及び第２モジュール名によって夫々特定される第１モジュール３２及び第２モジュール３２を記憶装置３０から読み込む（Ｓ１６０２、Ｓ１６０４）。
【０１０２】
図１２（破線Ａで囲まれた箇所参照）及び図１７の上段に例示されるように、メンテナンス前のＸＸＸモジュールには、５つのWHEN句を含むEVALUATE文が記述されている。このため、メンテナンス前の第１モジュール３２は、このEVALUATE文から生成された４つのIF文を含んでいる（図１７の上段参照）。
【０１０３】
図１７から理解されるように、メンテナンスによって、メンテナンス前のＸＸＸモジュールの５つのWHEN句のうち、５つ目のWHEN句が削除されている。このため、メンテナンス後の第２モジュール３２は、このEVALUATE文から生成された３つのIF文を含んでいる（図１７の下段参照）。
【０１０４】
図１６に示されるように、比較手段２３′は、第１モジュール３２及び第２モジュール３２を読み込んだ後、第１モジュール３２の階層構造３２３と第２モジュール３２の階層構造３２３とを比較する（Ｓ１６０６）。本実施の形態によれば、比較手段２３′は、第１モジュール３２の階層の深さ３２５と第２モジュール３２の階層の深さ３２５とを１行目から順次比較し、階層の深さ３２５の変化が一致するか否かを判定する。
【０１０５】
図１７に例示する第１モジュール３２及び第２モジュール３２を参照すると、第２モジュール３２における階層の深さ３２５は、行番号３２２が”60”の行３２０までは、第１モジュール３２における階層の深さ３２５と同じである。一方、第２モジュール３２の行番号３２２が”61”の行３２０の階層の深さ３２５（"1.2.1.1”）は、第１モジュール３２の行番号３２２が”61”の行３２０の階層の深さ３２５（"1.2.1.1.1”）と異なる。このため、比較手段２３′は、第１モジュール３２の階層構造３２３が第２モジュール３２の階層構造３２３と一致していないことを示すメッセージを作成する。即ち、比較手段２３′は、比較手段２３と同様に、第１モジュール３２の階層構造３２３と第２モジュール３２の階層構造３２３との比較結果（メッセージ）を作成する。本実施の形態による比較手段２３′は、作成したメッセージを表示装置５０に表示する。
【０１０６】
以上の説明から理解されるように、本実施の形態による比較手段２３′は、第１の実施の形態による比較手段２３と同様に２つのモジュール（第１モジュール３２及び第２モジュール３２）の階層構造を比較することができる。更に、本実施の形態によれば、第１モジュール３２及び第２モジュール３２の夫々には、関連する複数のモジュール３１が処理順に連結されている。従って、メンテナンス前後のプログラム全体を、纏めて比較することができる。
【０１０７】
例えば、ランタイムシステム等のソフトウェアのバージョンアップに伴ってモジュールをメンテナンスする場合、基本的にはモジュールの階層構造は変わらない。また、このようなコンバージョンにおいては、コンバージョンツールを使用してモジュールをメンテナンスすることがある。しかしながら、一般的にコンバージョンツールは、モジュールを完全に適切にメンテナンスすることができない。このような場合、メンテナンス前後のモジュールから夫々作成した第１モジュール３２及び第２モジュール３２の階層構造３２３を比較することで、メンテナンスが適切に行われたか否かを知ることができる。
【０１０８】
本実施の形態における階層構造３２３の比較方法は、第１の実施形態と同様に、様々に変形することができる。例えば、第１モジュール３２の階層構造３２３と第２モジュール３２の階層構造３２３とが一致しない箇所を表示装置５０に表示することで、メンテナンスが適切に行われていない箇所を容易に知ることができる。
【０１０９】
（第３の実施の形態）
図１８に示されるように、本発明の第３の実施の形態による比較装置（装置）１０″は、装置本体２０″と、記憶装置（記憶手段）３０″と、入力装置４０と、表示装置５０とを備えている。本実施の形態による記憶装置３０″は、装置本体２０″の主記憶装置である。装置本体２０″は、第２の実施の形態による装置本体２０′と同様に、変換手段２１と、加工手段２２と、比較手段２３′とを備えている。
【０１１０】
装置１０″は、通信回線８０を経由して、ファイルサーバ６０と通信可能に接続されている。通信回線８０は、例えばＬＡＮ（Local Area Network）であってもよいし、インターネットであってもよい。ファイルサーバ６０は、変換手段２１、加工手段２２及び比較手段２３′のうちの少なくとも一つを備えていてもよい。また、ファイルサーバ６０は、記憶装置（記憶手段）７０を備えている。記憶装置７０は、モジュール３１と、二次的モジュール３２とを記憶することができる。従って、装置１０″は、記憶装置７０からモジュール３１等を読み込み、記憶装置７０にモジュール３１等を書き込むことができる。
【０１１１】
容易に理解されるように、本実施の形態によれば、第１及び第２の実施の形態と同様に、二次的モジュール３２のうちの２つのモジュール（第１モジュール３２及び第２モジュール３２）を比較することができる。また、比較結果を、複数の装置１０″によって共有することができる。
【０１１２】
本発明の最良の実施の形態について説明したが、当業者には明らかなように、本発明の精神を逸脱しない範囲で実施の形態を変形することが可能であり、そのような実施の形態は本発明の範囲に属するものである。
【符号の説明】
【０１１３】
１０，１０′，１０″  比較装置（装置）
２０，２０′，２０″  装置本体
２１                  変換手段
２２                  加工手段
２３，２３′          比較手段
３０，３０′，３０″  記憶装置（記憶手段）
３１                  モジュール（ソースプログラム）
３１０                行
３１１                一連番号（行識別）
３１２                文
３２                  二次的モジュール（モジュール）
３２０                二次的行（行）
３２１                モジュール識別
３２２                行番号
３２３                階層構造
３２４                分岐階層
３２５                階層の深さ
３２６                一連番号（行識別）
３２７                二次的文
３６，３６ａ          階層構造
３６０，３６０ａ      行
３６１                一連番号（行識別）
３６２                階層の深さ
３６３                階層パターン
３６４                終了行（一連番号）
４０                  入力装置
５０                  表示装置
６０                  ファイルサーバ
７０                  記憶装置（記憶手段）
８０                  通信回線
【図１】
0006008456.tif 000002
【図２】
0006008456.tif 000003
【図３】
0006008456.tif 000004
【図４】
0006008456.tif 000005
【図５】
0006008456.tif 000006
【図６】
0006008456.tif 000007
【図７】
0006008456.tif 000008
【図８】
0006008456.tif 000009
【図９】
0006008456.tif 000010
【図１０】
0006008456.tif 000011
【図１１】
0006008456.tif 000012
【図１２】
0006008456.tif 000013
【図１３】
0006008456.tif 000014
【図１４】
0006008456.tif 000015
【図１５】
0006008456.tif 000016
【図１６】
0006008456.tif 000017
【図１７】
0006008456.tif 000018
【図１８】
0006008456.tif 000019