(57)【要約】【課題】構造化プログラミングされていないプログラムでも、再利用可能な部品単位に分割するプログラム分析方法及びプログラム作成方法を得る。【解決手段】単語／記号／数字の単位抽出部２により複数のソースプログラム１からプログラム文を抽出し、共通要素抽出部３により、各ソースプログラム内で一つしかないプログラム文で、かつ全てのソースプログラム１に共通なプログラム文を共通要素として抽出し、共通要素間プログラム文抽出部４により、各ソースプログラム内で連続する共通要素間にあるプログラム文を抽出し、準共通要素抽出部５により、それらのプログラム文を比較して、一致するプログラム文を準共通要素として抽出し、非共通要素抽出部６により、共通要素及び準共通要素を除くプログラム文を非共通要素として抽出して、流用可能な単位のプログラム文を保存するようにした。【選択図】図１
2010033249.tif 000002
【特許請求の範囲】
【請求項１】
複数のソースプログラムからソースプログラムごとにプログラムの構成要素であるプログラム文を抽出する第一のステップ、
上記プログラム文のうち、各ソースプログラム内で一つしかないプログラム文であり、かつ複数のソースプログラムのすべてに存在する上記プログラム文を共通要素として抽出する第二のステップ、
各ソースプログラムの上記共通要素で区切られた同じ範囲において、複数のソースプログラムに存在するプログラム文を準共通要素として抽出する第三のステップ、
上記共通要素と上記準共通要素のどちらでもない上記プログラム文を非共通要素として抽出する第四のステップ、
抽出した上記共通要素、上記準共通要素および上記非共通要素のいずれかである各要素を記憶装置に保存するステップを含み、
上記共通要素は各ソースプログラムにおける順番がすべてのソースプログラムで同じであり、
上記準共通要素の各ソースプログラムにおける順番は、上記準共通要素を有するすべてのソースプログラムで同じであり、
上記各要素には、抽出された元のソースプログラムと、そのソースプログラムの中での位置を示す分類コードが付与されていることを特徴とするプログラム分析方法。
【請求項２】
一つのソースプログラムに存在する上記プログラム文を、記述された順番に、上記共通要素、上記準共通要素および上記非共通要素をそれぞれ別の列にして表示することを特徴とする請求項１に記載のプログラム分析方法。
【請求項３】
複数のソースプログラムから抽出された上記各要素を、各ソースプログラムでの有無が分かるように表形式で表示することを特徴とする請求項１に記載のプログラム分析方法。
【請求項４】
複数のソースプログラムの中のいずれかのソースプログラムの作成日付と所定の時間関係にあるいずれかのソースプログラムに含まれる上記準共通要素をリスト形式で表示することを特徴とする請求項１ないし請求項３のいずれかに記載のプログラム分析方法。
【請求項５】
複数のソースプログラムの中のいずれかのソースプログラムの作成日付と所定の時間関係にあるいずれかのソースプログラムに含まれる上記非共通要素をリスト形式で表示することを特徴とする請求項１ないし請求項３のいずれかに記載のプログラム分析方法。
【請求項６】
請求項１に記載のプログラム分析方法により複数のソースプログラムから抽出された上記各要素から所要のものを選択してソースプログラムを作成することを特徴とするプログラム作成方法。
【請求項７】
複数のソースプログラムから抽出された上記各要素を、各ソースプログラムでの有無が分かるように表形式で表示した画面を用いて、プログラム作成に使用するものを選択することを特徴とする請求項６に記載のプログラム作成方法。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、構造化プログラミングがされていない複数のソースプログラムを分析し、プログラムの再利用可能な単位を特定するプログラム分析方法及びプログラム作成方法に関するものである。
【背景技術】
【０００２】
大規模なソフトウエアシステムを開発・保守する組織において、長期にわたるシステム保守の中で作成された膨大な類似プログラム資産を管理することが難しくなっている。特に、システムの信頼性と安全性確保のために、納入実績のあるプログラムを、生産性向上のためにプログラム構造を大きく組み直すようなことは許容されにくく、既存のプログラムを流用して作成することが基本となっている。
また、流用元のプログラムが開発されたのは事業創設期であり、構造化プログラミングがされていないことが多い。
構造化プログラミングされているソースプログラムの共通部分を類型化する方法については、特許文献１が提案されている。
【０００３】
【特許文献１】特開２００５−３１６７０７号公報（第３〜８頁、図１）
【発明の開示】
【発明が解決しようとする課題】
【０００４】
大規模ソフトウエアのプログラムの流用設計をする上で、構造化プログラミングされていないプログラムのカスタマイズ範囲や改造範囲を抽出するためには、大規模プログラムのソースプログラムを人間系で一行一行確認する他に方法がないため、解析に時間を要する問題があった。
また、あるプログラムに動作不良が発生した場合、納入実績のあるプログラムのうちで改修対象となる対象を選定するにも、ソースプログラムを人間系で確認する必要があるため、ヒューマンエラーが入り込み易いという問題があった。
特許文献１は、構造化プログラミングされているソースプログラムの共通部分を類型化するものであり、構造化プログラミングされていないソースプログラムについてのものではなかった。
【０００５】
この発明は、上記のような課題を解決するためになされたものであり、構造化プログラミングされていないプログラムでも、再利用可能な部品単位に分割し、これらを組合せてプログラムを再構築することができるプログラム分析方法及びプログラム作成方法を得ることを目的としている。
【課題を解決するための手段】
【０００６】
この発明に係わるプログラム分析方法においては、複数のソースプログラムからソースプログラムごとにプログラムの構成要素であるプログラム文を抽出する第一のステップ、
プログラム文のうち、各ソースプログラム内で一つしかないプログラム文であり、かつ複数のソースプログラムのすべてに存在するプログラム文を共通要素として抽出する第二のステップ、
各ソースプログラムの共通要素で区切られた同じ範囲において、複数のソースプログラムに存在するプログラム文を準共通要素として抽出する第三のステップ、
共通要素と準共通要素のどちらでもないプログラム文を非共通要素として抽出する第四のステップ、
抽出した共通要素、準共通要素および非共通要素のいずれかである各要素を記憶装置に保存するステップを含み、
共通要素は各ソースプログラムにおける順番がすべてのソースプログラムで同じであり、
準共通要素の各ソースプログラムにおける順番は、準共通要素を有するすべてのソースプログラムで同じであり、
各要素には、抽出された元のソースプログラムと、そのソースプログラムの中での位置を示す分類コードが付与されているものである。
【発明の効果】
【０００７】
この発明は、以上説明したように、複数のソースプログラムからソースプログラムごとにプログラムの構成要素であるプログラム文を抽出する第一のステップ、
プログラム文のうち、各ソースプログラム内で一つしかないプログラム文であり、かつ複数のソースプログラムのすべてに存在するプログラム文を共通要素として抽出する第二のステップ、
各ソースプログラムの共通要素で区切られた同じ範囲において、複数のソースプログラムに存在するプログラム文を準共通要素として抽出する第三のステップ、
共通要素と準共通要素のどちらでもないプログラム文を非共通要素として抽出する第四のステップ、
抽出した共通要素、準共通要素および非共通要素のいずれかである各要素を記憶装置に保存するステップを含み、
共通要素は各ソースプログラムにおける順番がすべてのソースプログラムで同じであり、
準共通要素の各ソースプログラムにおける順番は、準共通要素を有するすべてのソースプログラムで同じであり、
各要素には、抽出された元のソースプログラムと、そのソースプログラムの中での位置を示す分類コードが付与されているので、構造化プログラミングされていないプログラムでも、再利用可能な部品単位に分割することができる。
【発明を実施するための最良の形態】
【０００８】
実施の形態１．
図１は、この発明の実施の形態１によるプログラム分析方法を示す概念図である。
図１において、プログラム分析方法は、５つの抽出部と３つの一覧データを有している。
３つの一覧データは、以下に示すプログラム文の３分類のそれぞれに対応するものである。
共通要素：１つのソースプログラム内で唯一無二のプログラム文であり、すべてのソースプログラムに存在しているもの。プログラムにより順番が入れ替わっているものは、共通要素とはしない。
準共通要素：複数のソースプログラムに存在する文であって、共通要素でないもの。ただし、共通要素により区切られた同じ範囲にあるものに限る。複数の連続するプログラム文が準共通要素に該当する場合は、まとめて１個の準共通要素とする。なお、他の準共通要素との前後関係も考慮するが、それについては後で説明する。
非共通要素：共通要素でも準共通要素でもないもの。
単語／記号／数字の単位抽出部２は、ソースプログラム１が入力され、単語／記号／数字の単位で区切ったプログラムの断片を抽出して、１個のプログラム文が１行に対応するように表形式で保存する。（図２のステップＳ０１参照）。共通要素抽出部３は、１つのプログラム内で唯一無二のプログラム文で、すべてのソースプログラムに存在しているものを共通要素として抽出し、発見された順番に共通要素一覧データ７に保存する。（図２のステップＳ０２、ステップＳ０３参照）。
【０００９】
共通要素間プログラム文抽出部４は、一つのソースプログラム内で連続する共通要素の間に存在しているプログラム文を抽出する。準共通要素抽出部５は、複数のソースプログラムについて共通要素間プログラム文抽出部４によって抽出された、同じ共通要素の間に存在していたプログラム文同士を比較することを繰り返して、発見した準共通要素を準共通要素一覧データ８に登録する。（図２のステップＳ０４参照）。
非共通要素抽出部６は、共通要素一覧データ７および準共通要素一覧データ８に登録されている各要素を、単語／記号／数字の単位で区切った表形式のデータから削除し、残ったプログラム文を、発見された順番に非共通要素一覧データ９に登録する。（図２のステップＳ０５参照）。
なお、共通要素、準共通要素、非共通要素をまとめてプログラム要素ということもある。
【００１０】
図２は、この発明の実施の形態１によるプログラム分析方法の処理を示すフローチャートである。
【００１１】
図３は、この発明の実施の形態１によるプログラム分析方法において表形式のデータであるプログラム文を作成する処理を説明するフローチャートである。
図３（ａ）はフローチャートであり、図３（ｂ）はステップＳ１２の処理内容を示す図である。
【００１２】
図４は、この発明の実施の形態１によるプログラム分析方法においてプログラム中で唯一無二のプログラム文を抽出する処理を説明するフローチャートである。
【００１３】
図５は、この発明の実施の形態１によるプログラム分析方法において共通要素を抽出する処理を説明するフローチャートである。
【００１４】
図６は、この発明の実施の形態１によるプログラム分析方法において準共通要素を抽出する処理を説明するフローチャートである。
図７は、この発明の実施の形態１によるプログラム分析方法において準共通要素を抽出する処理での共通要素で区切られた範囲を説明する例を示す図である。
図８は、この発明の実施の形態１によるプログラム分析方法において準共通要素を抽出する処理を説明する例を示す図である。
図９は、この発明の実施の形態１によるプログラム分析方法において非共通要素を抽出する処理を説明するフローチャートである。
【００１５】
次に、動作について説明する。
プログラム分析方法を実現するプログラムによる制御動作は、図２のフローチャートのとおりである。
図２で、ステップＳ０１（第一のステップ）は、ソースプログラム１から、単語／記号／数字の単位で区切った表形式により抽出する。次に、ステップＳ０２にて、１つのプログラム内で１つしかないプログラム文を抽出し、次いで、ステップＳ０３では、ステップＳ０２で抽出したプログラム文がすべてのプログラム文に共通して存在しているプログラム文であれば、共通要素として、発見された順番に共通要素一覧データ７に保存する。（ステップＳ０２、Ｓ０３は、第二のステップを構成する。）
次に、ステップＳ０４（第三のステップ）で、ソースプログラム内に存在する共通要素で区切られた範囲を前から順に処理して、その範囲に存在するプログラム文を各ソースプログラムから抜粋する。そして、異なるソースプログラムの同じ共通要素の間に存在していたプログラム文同士を比較し、少なくとも二つのプログラムで共通なプログラム文を、共通であるプログラム数ができるだけ多くなるようにして切り出し、順番に準共通要素一覧データ８に登録する。加えて、最初に一致する行と共通要素との相対行／列を記録する。
【００１６】
最後に、ステップＳ０５（第四のステップ）で、ステップＳ０１で保存された表形式のデータから、共通要素一覧データ７および準共通要素一覧データ８に登録されている各要素を、単語／記号／数字の単位で削除し、空き行で挟まれたプログラム文を切り出し、発見された順番に非共通要素一覧データ９に登録する。加えて、プログラム内の非共通要素と共通要素との相対行／列を記録する。
ここで、登録とは、プログラム文がもつ分類コード（１）〜（９）を使い、ファイル名“（１）（２）（３）（４）（５）（６）（７）（８）（９）”としてＴＸＴファイルで保存することをいう。なお、分類コード（１）〜（９）については後述する。
【００１７】
上述の手法を用いることにより、構造化されていないプログラム文においても、共通するプログラム文を機械的に抽出し、分類することができるようになっている。
なお、共通要素一覧データ７、準共通要素一覧データ８、非共通要素一覧データ９に保存されたプログラム文は、分類コードを付けて保存する。
【００１８】
ここで、分類コードとは、以下の情報を意味する。
（１）：分析対象の複数のソースプログラムのすべてに含まれる共通要素か、２つ以上のソースプログラムに含まれる準共通要素か、１つだけ発見された非共通要素かという分類記号（共通要素：１、準共通要素：２、非共通要素：３）
（２）：共通要素、準共通要素、非共通要素としてそれぞれ見つかった順番
（３）：分析対象である複数のプログラムに含まれる要素であれば、要素を含んでいるプログラム数
（４）： そのプログラム文よりも前にある共通要素の中で最も近くに存在する共通要素の番号。共通要素の場合は、自分の番号が入る。
（５）：（４）に記録した共通要素との相対行数。共通要素の場合は、０になる。
（６）：プログラム文の構成要素数。表形式における列の数。
（７）：プログラムが作成された日付
（８）：解析元プログラム番号
（９）：解析元プログラム内の要素の行数
【００１９】
次に、分類コードの例について説明する。
「解析プログラムがソースプログラム内を解析している際に３番目に見つかった準共通要素で、５つのソースプログラムの中で２つのソースプログラムに含まれている準共通要素は、３列であり、ソースプログラムＢにおいて１０行目に存在し、最も近い共通要素は３行目にある２番目の共通要素であり、この共通要素からの相対行数は７行である。ソースプログラムＢ（番号２）は２００７／０８／０３に作成されている。」
という場合、上記「」内の文章を分類コードが決まる毎に区切って説明すると、以下の通りである。
【００２０】
解析プログラムがソースプログラム内を解析している際に、
３番目に見つかった・・・・・・（２）は３
準共通要素で、・・・・・・・・（１）は２
５つのソースプログラムの中で２つのソースプログラムに含まれている・・・（３）は２
準共通要素は３列であり、・・・・・・・・・・・・・・・・・・（６）は３
ソースプログラムＢにおいて１０行目に存在し、・・・・・・・・（９）は１０
最も近い共通要素は３列目にある２番目の共通要素であり、・・・（４）は２
この共通要素からの相対行数は７行である。・・・・・・・・・・（５）は７
ソースプログラムＢ（番号２）は  ・・・・・・・・・・・・・・（８）は２
２００７／０８／０３に作成されている。・・・・・・・・（７）は２００７／０８／０３
以上をまとめると、
（１）２  （２）３  （３）２  （４）２  （５）７  （６）３
（７）２００７０８０３  （８）２  （９）１０
となる。
【００２１】
次に、図３により、図２のステップＳ０１について詳細に説明する。
図３（ａ）で、まず、ステップＳ１１で、比較対象となる複数のソースプログラムにプログラム番号（１〜Ｎ）を付ける。これにより、分類コード（７）（８）が取得される。次いで、ステップＳ１２で、次のプログラム番号のソースプログラムを空白・カンマ・括弧で区切り、単語／記号／数字の単位で表形式のフォーマットに読み込む。これにより、図３（ｂ）のように読み込まれる。
次いで、ステップＳ１３で、プログラム行間の改行、プログラム文内の構成要素間のスペースを削除する。ステップＳ１４で、要素の行列を取得する。これにより、分類コード（９）（６）が取得される。次いで、ステップＳ１５で、未確定な分類コードは♯とし、（１）〜（９）の分類コードをファイル名としてソースプログラム文を“♯♯♯♯♯♯（６）（７）（８）（９）”という名前で保存する。
【００２２】
次に、図４により、図２のステップＳ０２の処理について詳細説明する。
先ず、ステップＳ２１で、プログラム番号Ｎ番の表形式のファイルを読み込む。ステップＳ２２で、次の行に含まれている単語／記号／数字（プログラム文）を読み込む。次いで、ステップＳ２３で、プログラム番号Ｎ番の表形式のファイルの全行を順に処理して、Ｓ２２で読み込んだ行と同一の行が、１行以上あるかどうかを判定し、ＮＯであれば、ステップＳ２４で、読み込まれた単語／記号／数字を基準キーワードとして登録する。ＹＥＳであれば、ステップＳ２２に戻る。ステップＳ２４に次いで、ステップＳ２５で、プログラム番号Ｎ番の最後の行かどうかを判定し、ＹＥＳであれば、終了し、ＮＯであれば、ステップＳ２２に戻る。
【００２３】
次に、図５により、図２のステップＳ０３の処理について詳細に説明する。
まず、ステップＳ３１で、次の基準キーワードを読み出す。ステップＳ３２で、基準キーワードがすべてのソースプログラムにおいて、最も新しく見つかった共通要素よりも後の位置に含まれるかどうかを判定し、（これにより、分類コード（３）＝Ｎ、（５）＝０を取得する。）、ＮＯであれば、ステップＳ３１に戻り、ＹＥＳであれば、ステップＳ３３で、基準キーワードを行単位で共通要素として採番する。これにより、分類コード（１）（２）及び（４）＝（２）を取得する。
次いで、ステップＳ３４で、最後の基準キーワードかどうかを判定し、ＮＯであれば、ステップＳ３１に戻り、ＹＥＳであれば、ステップＳ３５で、（１）〜（９）の分類コードをファイル名としてソースプログラム文を“（１）（２）（３）（４）（５）（６）（７）（８）（９）”という名前に変更して保存する。
【００２４】
次に、図６ないし図８により、準共通要素を抽出するステップＳ０４の処理について例を用いて説明する。
まず、図６に示すフローチャートにおけるステップＳ４１で、共通要素で区切られた範囲の先頭を処理対象とする。具体的には、ソースプログラムの先頭から１個目の共通要素までの範囲を処理対象とする。図７が処理対象の範囲の例である。
ステップＳ４２では、各ソースプログラムについて処理対象の範囲を取り出す。ステップＳ４３では、すべての２個のソースプログラムの組み合わせについて、同じプログラム文が存在するかどうか検索し、同じプログラム文を１行単位で準共通要素の候補として抽出する。ステップＳ４４では、連続した行が準共通要素の候補として抽出されている場合に、それらをまとめられるかどうかチェックし、まとめられる場合はまとめる。ステップＳ４５では、準共通要素のデータを作成する。ステップＳ４６では、未処理の範囲があるかチェックする。未処理の範囲があれば、ステップＳ４７で次の範囲を処理対象として、ステップＳ４２に戻る。未処理の範囲がなければ、処理を終了する。
【００２５】
ステップＳ４３の処理を、図８により説明する。図８（ａ）はプログラム１とプログラム２の間でのチェックが終了した段階であり、図８（ｂ）はステップＳ４３が終了した段階であり、図８（ｃ）はステップＳ４４が終了した段階である。２個のソースプログラムの組を処理する順番は、図８（ａ）の上部に示した順番とする。２個のソースプログラムの組は、１個のソースプログラム（基準プログラムと呼ぶ）について他のソースプログラムとのまだ処理していないすべての組み合わせをチェックすることを繰り返していくものとする。最初に、プログラム１と他のプログラムとの組み合わせを処理し、次にプログラム２に関する未処理の組み合わせを処理して、最後にプログラム３とプログラム４の組についてチェックする。
【００２６】
２個のソースプログラムの間でのチェックでは、基準プログラムのプログラム文を前から順番に処理対象のプログラム文（基準プログラム文と呼ぶ）に決め、もう１個のソースプログラム（対象プログラムと呼ぶ）のプログラム文（対象プログラム文と呼ぶ）を前から順番に処理して、対象プログラム文が基準プログラム文と同じかどうかをチェックする。同じ場合には、基準プログラム文と対象プログラム文を準共通要素の候補として抽出する。準共通要素の候補が抽出できれば、基準プログラム文および対象プログラム文を、抽出した準共通要素の候補の次の行に移動させる。準共通要素の候補を抽出する際には、基準プログラム文が既に抽出された準共通要素の候補に含まれる場合は、対象プログラム文をその準共通要素の候補に追加する。
対象プログラム文が基準プログラム文と異なれば、次のプログラム文を対象プログラム文とし、対象プログラムにおいて最後のプログラム文を処理しても基準プログラム文と同じプログラム文が無い場合は、基準プログラム文を次のプログラム文に移動させる。こうして、すべての基準プログラム文に対して対象プログラム文とのチェックが終了すれば、２個のソースプログラムの間でのチェックを終了する。
【００２７】
図８（ａ）は、プログラム１を基準プログラムとし、プログラム２を対象プログラムとしてのチェックが終了した後の状態である。検出された準共通要素の候補を、枠で囲んで示す。また、すべての２個のソースプログラムの組み合わせについてチェックが終了した後の状態を図８（ｂ）に示す。最初は、プログラム１とプログラム２の間で抽出された”ＡＡＡ”という準共通要素の候補に、プログラム３のものも追加されている。”ＢＢＢ”と”ＣＣＣ”は、プログラム１とプログラム２において連続して配置されており、１個の準共通要素になるべきであるが、この段階では別の候補として抽出されている。
【００２８】
ステップＳ４４では、以下のような処理を行う。準共通要素の候補を順に処理対象（基準候補）に決め、基準候補を有するどれかのソースプログラムで、基準候補であるプログラム文の次の位置にあるプログラム文が準共通要素の候補であるかどうかをチェックする。準共通要素の候補（対象候補と呼ぶ）の場合は、基準候補を有するソースプログラムの集合と対象候補を有するソースプログラムの集合が同じ（要素に過不足が無いこと）であるかどうかチェックする。同じ場合には、対象候補と基準候補をまとめて１個の準共通要素とし、元の対象候補のプログラム文を次の基準候補とする。
準準共通要素の候補でないか、準準共通要素の候補であっても基準候補を有するソースプログラムの集合が同じでない場合は、基準候補をそのまま準共通要素にし、次の準共通要素の候補を基準候補にする。こうして、すべての準準共通要素の候補を処理して、図８（ｃ）に示すように、”ＢＢＢ”と”ＣＣＣ”が１個の準共通要素になる。なお、例えば、プログラム４の２行目の”ＭＭＭ”が仮に”ＢＢＢ”というプログラム文であれば、”ＢＢＢ”はプログラム１、プログラム２およびプログラム４に共通な準共通要素として抽出され、”ＣＣＣ”がプログラム１とプログラム２に共通な準共通要素として抽出されたままである。
【００２９】
ステップＳ４５では、分類コードの（１）には準共通要素であることを意味する２を、（２）に準共通要素として作成した順番を、（３）には準共通候補を有するプログラム数を、（４）には共通要素で区切られた範囲の前にある共通要素の番号を設定する。なお、１個目の共通要素よりも前の範囲では、ソースプログラムの先頭を仮想的な共通要素として、番号”０”を設定する。（５）には、各ソースプログラムにおける共通要素で区切られた範囲内での行数を設定する。（６）から（９）までは、ステップＳ１１で決まっているので、このようにして求めた（１）から（５）までになるようにプログラム文のファイル名を修正して保存する。
【００３０】
図８（ｃ）において、プログラム１の２行目とプログラム２の４行目はともに”ＧＧＧ”であるが、準共通要素として抽出されていない。これは”ＢＢＢ，ＣＣＣ”という準共通要素を抽出したためである。”ＧＧＧ”がプログラム１では、”ＢＢＢ，ＣＣＣ”よりも前にあり、プログラム２では後にあるので、準共通要素の前後関係が同じであることから、”ＧＧＧ”と”ＢＢＢ，ＣＣＣ”のどちらかしか、準共通要素として抽出できない。このような状況を交差が発生していると呼ぶことにする。前に説明した準共通要素を抽出する処理方法は、準共通要素の候補を抽出すると、その次の行から検索をするので、交差する準共通要素を抽出することは無い。
【００３１】
なお、交差するものも含めて準共通要素の候補を抽出して、交差のために同時には準共通要素にできないものがある場合には、準共通要素の数が最大になるように選択するようにしてもよい。また、プログラム文があり準共通要素の候補となるプログラム文が、１個のソースプログラムにおいて同じものが複数ある場合は、どちらを準共通要素とするかも、準共通要素の数が最大になる方を選択するようにしてもよい。
共通要素に関して交差が発生する場合には、前に説明した処理方法では、先に発見したものを共通要素とし、交差するものは共通要素として抽出しない。共通要素と準共通要素のどちらかまたは両方の合計が大きくなる方を選択するようにしてもよいし、交差が発生するものは、どちらも共通要素としないようにしてもよい。
【００３２】
次いで、図９により、図２のステップＳ０５の処理について詳細に説明する。
まず、ステップＳ６１で、Ｂ＝Ｂ＋１を演算する。ステップＳ６２で、Ｃ＝Ｃ＋１を演算する。
次いで、ステップＳ６３で、“♯♯♯♯♯♯（６）（７）（８）（９）”という分類コードを持つ非共通要素の行番号（９）と、（８）が同じ数字の分類コードを持つ（１）＝１でＣ番目の共通要素の行番号（９）との相対行（５）を取得し、最も小さな正数の相対行を持つ“♯♯♯♯♯♯（６）（７）（８）（９）”というファイル名を探す。
ステップＳ６４で、発見されたファイルの行番号（９）は、Ｃ＋１番目の共通要素の行番号（９）より小さいかどうかを判定し、ＮＯであれば、ステップＳ６２に戻り、ＹＥＳであれば、ステップＳ６５で、非共通要素である（１）＝３、（３）＝１とし、見つかった順番Ｂから（２）＝Ｂ、関連する共通要素がＣであることから、（４）＝Ｃとして“（１）（２）（３）（４）（５）（６）（７）（８）（９）”という分類コードをつけて保存する。次いで、ステップＳ６６で、“♯♯♯♯♯♯（６）（７）（８）（９）”が存在するかどうかを判定し、ＮＯであれば、ステップＳ６１に戻り、ＹＥＳであれば、終了する。
【００３３】
実施の形態１によれば、このように、複数のプログラムから共通部分を特定し、共通部分のプログラム上のロケーションを基点に他のプログラム文の位置関係を取得して、さらに分類していくという本手法により、プログラム内部に機能名やセクション名が入っていないような構造化されていないプログラムにおいても、プログラムを構成するプログラム文の分類が機械的に可能となる効果がある。
【００３４】
実施の形態２．
実施の形態１では、プログラム文を分析して類似度を３つの要素に分類してデータを保存する方法について述べたが、実施の形態２は、分類コードを使って、図１０に示すように、表示順序を採番していき、分類コードの共通要素と準共通要素と非共通要素のコードを読み取って、列毎に分けて表示するようにした。これにより、一つのプログラムの構成を一目で分かるように表示することができる。
【００３５】
図１０は、この発明の実施の形態２によるプログラム分析方法の表示順序を決定するフローチャートである。
図１１は、この発明の実施の形態２によるプログラム分析方法の単一プログラムのプログラム要素の状態の画面例を示す図である。
図１１において、横軸の分類コード（１）の共通要素１１、準共通要素１２、非共通要素１３について、それぞれ縦軸で見つかった順番にプログラム文を示している。
【００３６】
次に、図１０により、表示順序を決定するフローについて説明する。
ステップＳ７０で、共通要素（ｎ）に対して表示順を採番する。次いで、ステップＳ７１で、共通要素（ｎ）を分類コードに持っている要素の中で相対行の小さい順に上段から各要素に対して表示順を採番する。ステップＳ７２で、ｎ＝ｎ＋１を演算する。ステップＳ７３で、ｎ＞共通要素の最大数かどうかを判定し、ＮＯであれば、ステップＳ７０に戻り、ＹＥＳであれば、終了する。
【００３７】
分類コードから、プログラム文をソースプログラムに組み込まれた順序で表示する方法は、次のとおりである。
”分断したプログラム文の内で最も近くに存在している共通要素の分類コード”と“最も近くに存在している共通要素との相対距離にあたる行と文字数”から共通要素および非共通要素の表示行を決定する。
表示する要素は、図１０に示すように、同プログラムの各要素に対して次の規則に従って採番する。
動作例を以下にあげる。
共通要素の１番を採番したのち、２番目の共通要素との間にある準共通要素および非共通要素を採番していく。１番目の共通要素を分類コードに持つ準共通要素および非共通要素について、１番目の共通要素との相対行の小さいものから順番に下段の行に表示する。
次に、２番の共通要素を採番し、その共通要素に属する準共通要素および非共通要素を２番目の共通要素との相対行の小さいものから順番に下段の行に表示する・・・といったサイクルで、順次、表示順序を決めて、図１１のように表示する。
【００３８】
実施の形態２によれば、このように、表示対象の分類コードを元に、表示する要素の表示順序を採番する手法を用いることで、すべてのプログラム文を、共通要素に対する相対行で表示することが可能となる効果がある。
【００３９】
実施の形態３．
実施の形態２では、ソースプログラムの構成を一目で識別出来るような方法について述べたが、それぞれの要素が分析対象である複数のソースプログラム内にどの程度含まれていたかを確認することが出来ない。そこで、実施の形態３では、複数のソースプログラムの中で存在していたすべての要素について、ソースプログラム内での有無を表形式で表示するようにした。
【００４０】
図１２は、この発明の実施の形態３によるプログラム分析方法のプログラム要素の全プログラムの含有状態の画面例を示す図である。
図１２において、分類コードをもとに、プログラム名と作成日付を横軸、複数のソースプログラムの中で存在していたすべての要素（同一行のものは１つの要素として扱う）を縦軸にして、プログラム内での有無を表形式で表示している
【００４１】
実施の形態３によれば、このように、分類コードを使って、各要素のプログラム内の含有状況を一目で確認することが出来るように、表形式で表示可能としたため、バグや特化プログラムを分析する際に、調査すべきプログラムのロケーションを抽出することが容易となる効果がある。
【００４２】
実施の形態４．
実施の形態３では、複数のプログラムで使用されている状態が一目で確認出来るようにしたが、実施の形態４は、この実施の形態３のような表示形式を使用して、縦軸に記載されているプログラム要素を複数選択し、選択されたプログラム要素を保存されている一覧データから読み込んで、選択された順に組み合せてプログラムを構築するようにしたものである。
【００４３】
図１３は、この発明の実施の形態４によるプログラム分析方法の生成するプログラムの含有要素を設定する画面例を示す図である。
図１３において、図１２の画面例にチェック欄を設け、プログラム要素を選択できるようにした。
図１４は、この発明の実施の形態４によるプログラム分析方法のプログラム再構築の処理を示すフローチャートである。
【００４４】
実施の形態４は、図１３に示すチェック欄にプログラム要素を選択するためのチェックマークを入れることで、図１４に示すような、該当するデータの取得と、選択された順にプログラム要素を組み合せてプログラムを表形式で生成し、テキスト形式で出力することで、プログラムを再構築する。
【００４５】
次いで、図１４に基づき、このときのフローについて説明する。
まず、ステップＳ８１で、分類コードのリストのｎ番目（ただし、初回はｎ＝１）のデータを読み込む。次いで、ステップＳ８２で、プログラム生成用の表のｎ行目にデータを書き込む。ステップＳ８３で、ｎ＝ｎ＋１を演算する。次いで、ステップＳ８４で、ｎが分類コードのリストの最大数を超えているかどうかを判定し、超えていると、終了し、超えていなければ、ステップＳ８１に戻る。
【００４６】
実施の形態４によれば、この手法により、準共通要素や非共通要素にバグや不要なプログラムが含まれていることが分かった場合、使用者が実施の形態３で示した表を見ながら、問題の箇所を入れ替えたり、削除してプログラムを生成し直すことができる。
また、リスト形式で編集することで容易にプログラム再構築を行える効果がある。
【００４７】
実施の形態５．
実施の形態５は、分類コードにおいて、分析対象である複数のソースプログラムに含まれる要素で２つ以上のプログラムに含まれているが、その要素が作られた日付より後のソースプログラム内に含まれていない要素である場合には、該当のソースプログラムとその要素を検出するプログラムである。
【００４８】
図１５は、この発明の実施の形態５によるプログラム分析方法の問題要素を抽出する処理を示すフローチャートである。
非共通要素については、分類コードに含まれる日付データを取得し、その日付データがもっとも新しいソースプログラムの作成日付のものをリストアップする。
【００４９】
実施の形態５は、図１５に示すとおり、すべての準共通要素の分類コードに含まれる日付データを取得し、その日付データが最も新しいプログラムの作成日付でない分類コードをリストアップする。
すなわち、ステップＳ９１で、分析に使用したすべてのソースプログラムの作成日時をソースプログラムからそれぞれ取得する。次いで、ステップＳ９２で、すべてのソースプログラムの作成日時の中で最新の日時を選定する。次いで、ステップＳ９３で、分析して得られたすべての準共通要素の分類コードの中で、最新の日時が含まれていない分類コードをリスト形式で記録する。
【００５０】
実施の形態５によれば、このように、分類コードに含まれているプログラム要素の製作された日付や、プログラム要素が含まれたプログラム数から、同一機能のソースプログラムの中で記述に差異のある準共通要素や非共通要素を機械的に推定することが可能となる効果がある。
最新の日付でない準共通要素と最新の日付の非共通要素を抽出する場合で説明したが、日付としては最新でなくてもよく、いずれかのソースプログラムの作成日付でもよい。抽出する対象も指定した日付のもの、指定した日付よりも新しいもの、指定し日付の前後の所定期間のものなど、所定の時間関係にあるソースプログラムに含まれる準共通要素と非共通要素のどちらかまたは両方をリスト形式で表示するようにしてもよい。
【図面の簡単な説明】
【００５１】
【図１】この発明の実施の形態１によるプログラム分析方法を示す概念図である。
【図２】この発明の実施の形態１によるプログラム分析方法の処理を示すフローチャートである。
【図３】この発明の実施の形態１によるプログラム分析方法において表形式のデータであるプログラム文を作成する処理を説明するフローチャートである。
【図４】この発明の実施の形態１によるプログラム分析方法においてプログラム中で唯一無二のプログラム文を抽出する処理を説明するフローチャートである。
【図５】この発明の実施の形態１によるプログラム分析方法において共通要素を抽出する処理を説明するフローチャートである。
【図６】この発明の実施の形態１によるプログラム分析方法において準共通要素を抽出する処理を説明するフローチャートである。
【図７】この発明の実施の形態１によるプログラム分析方法において準共通要素を抽出する処理での共通要素で区切られた範囲を説明する例を示す図である。
【図８】この発明の実施の形態１によるプログラム分析方法において準共通要素を抽出する処理を説明する例を示す図である。
【図９】この発明の実施の形態１によるプログラム分析方法において非共通要素を抽出する処理を説明するフローチャートである。
【図１０】この発明の実施の形態２によるプログラム分析方法の表示順序を決定するフローチャートである。
【図１１】この発明の実施の形態２によるプログラム分析方法の単一プログラムのプログラム要素の状態の画面例を示す図である。
【図１２】この発明の実施の形態３によるプログラム分析方法のプログラム要素の全プログラムの含有状態の画面例を示す図である。
【図１３】この発明の実施の形態４によるプログラム分析方法の生成するプログラムの含有要素を設定する画面例を示す図である。
【図１４】この発明の実施の形態４によるプログラム分析方法のプログラム再構築の処理を示すフローチャートである。
【図１５】この発明の実施の形態５によるプログラム分析方法の問題要素を抽出する処理を示すフローチャートである。
【符号の説明】
【００５２】
１  ソースプログラム
２  単語／記号／数字の単位抽出部
３  共通要素抽出部
４  共通要素間プログラム文抽出部
５  準共通要素抽出部
６  非共通要素抽出部
７  共通要素一覧データ
８  準共通要素一覧データ
９  非共通要素一覧データ
１１  共通要素
１２  準共通要素
１３  非共通要素
【図１】
2010033249.tif 000003
【図２】
2010033249.tif 000004
【図３】
2010033249.tif 000005
【図４】
2010033249.tif 000006
【図５】
2010033249.tif 000007
【図６】
2010033249.tif 000008
【図７】
2010033249.tif 000009
【図８】
2010033249.tif 000010
【図９】
2010033249.tif 000011
【図１０】
2010033249.tif 000012
【図１１】
2010033249.tif 000013
【図１２】
2010033249.tif 000014
【図１３】
2010033249.tif 000015
【図１４】
2010033249.tif 000016
【図１５】
2010033249.tif 000017