(57)【要約】  コンピュータをパーシング部、マクロブロッキング解析部、接合ノードリストラクチャリング部、同一部融合リストラクチャリング部、近似部融合リストラクチャリング部および中間語リストラクチャリング部として機能させる。パーシング部は、ソースコードに対して構文解析を行う。マクロブロッキング解析部は、そのプログラムを複数のブロックに分割し、各ブロックにおけるステートメントの変数を識別するための番号に、当該ステートメントにおける一意な番号を表す仮想部を付加して、演算パターンを仮想化する。接合ノードリストラクチャリング部は、サブルーチンブロックに直接関与するノードを抽出する。同一部融合リストラクチャリング部は、プログラムの複数の部分で呼ばれるサブルーチンについて、前処理同士および後処理同士を融合する。近似部融合リストラクチャリング部は、構造の似た複数のサブルーチンを同族のサブルーチンにまとめる。【特許請求の範囲】
【請求項１】
プログラムのソースコードに対して構文解析を行い、その解析情報を出力するパーシング部と、
前記パーシング部から出力される構文解析情報に基づいて、前記プログラムの構造解析によって前記プログラムを複数のブロックに分割し、その結果として得られるブロックの構造情報と、各ブロックの演算パターンを仮想化するための付加情報を出力するマクロブロッキング解析部と、
前記マクロブロッキング解析部から出力される構造情報および付加情報に基づいて、サブルーチンとして定義されている一つのブロックに着目し、該着目ブロックよりも処理順序が前で、かつ順次処理されることにより該着目ブロックに到達する先祖ブロック内のノードに対して処理順序を遡る方向に探索を行うとともに、該着目ブロックよりも処理順序が後で、かつ該着目ブロックから順次処理される継承ブロック内のノードに対して処理順序に従う方向に探索を行うことによって、該着目ブロックに直接関与するノードを抽出する接合ノードリストラクチャリング部と、
前記接合ノードリストラクチャリング部によりプログラム全体の中から抽出された前記着目ブロックを用いる複数の部分について、前記着目ブロックに対する先祖ブロック内のノード同士を比較して該先祖ブロック同士を融合するとともに、前記着目ブロックに対する継承ブロック内のノード同士を比較して該継承ブロック同士を融合し、その結果として得られる融合ブロック情報を出力する同一部融合リストラクチャリング部と、
前記接合ノードリストラクチャリング部によりプログラム全体の中から抽出された異なる着目ブロックのそれぞれについて前記同一部融合リストラクチャリング部から出力される融合ブロック情報同士を比較し、同一または類似の融合ブロック情報を有する複数の前記着目ブロック同士を同種のサブルーチンと定義するとともに、同一または類似の融合ブロック情報同士をさらに融合し、その結果として得られる抽象化コード情報を出力する近似部融合リストラクチャリング部と、
前記近似部融合リストラクチャリング部から出力される抽象化コード情報、および前記パーシング部から出力される解析情報に基づいて、共通化された部品の情報を出力する中間語リストラクチャリング部と、
を備えることを特徴とするモジュール生成装置。
【請求項２】
前記マクロブロッキング解析部は、各ブロックの演算パターンを仮想化するための前記付加情報として、各ブロックにおけるステートメントの変数を識別するための番号に、当該ステートメントにおける一意な番号を表す仮想部を付加することによって、各ステートメントの変数を識別するための番号を、前記ソースコード全体における一意な番号を表す下位部と、前記仮想部からなる上位部との組み合わせで表すことを特徴とする請求項１に記載のモジュール生成装置。
【請求項３】
前記同一部融合リストラクチャリング部は、前記仮想部に基づいて変数を識別することによって、前記先祖ブロック内のノード同士の比較、および前記継承ブロック内のノード同士の比較を行うことを特徴とする請求項２に記載のモジュール生成装置。
【請求項４】
前記近似部融合リストラクチャリング部は、前記仮想部に基づいて変数を識別することによって、前記融合ブロック情報同士の比較を行うことを特徴とする請求項２に記載のモジュール生成装置。
【請求項５】
プログラムのソースコードに対して構文解析を行い、その解析情報を得るパーサ工程と、
前記パーサ工程により得られる構文解析情報に基づいて、前記プログラムの構造解析によって前記プログラムを複数のブロックに分割し、その結果としてブロックの構造情報と、各ブロックの演算パターンを仮想化するための付加情報を得るマクロブロッキング解析工程と、
前記マクロブロッキング解析工程により得られる構造情報および付加情報により仮想化された演算パターンに基づいて、部品の共通化を行う共通化工程と、
を含むことを特徴とするモジュール生成方法。
【請求項６】
前記共通化工程は、前記マクロブロッキング解析工程により得られる構造情報および付加情報に基づいて、サブルーチンとして定義されている一つのブロックに着目し、該着目ブロックよりも処理順序が前で、かつ順次処理されることにより該着目ブロックに到達する先祖ブロック内のノードに対して処理順序を遡る方向に探索を行うとともに、該着目ブロックよりも処理順序が後で、かつ該着目ブロックから順次処理される継承ブロック内のノードに対して処理順序に従う方向に探索を行うことによって、該着目ブロックに直接関与するノードを抽出する接合ノードリストラクチャリング工程を含むことを特徴とする請求項５に記載のモジュール生成方法。
【請求項７】
前記共通化工程は、前記接合ノードリストラクチャリング工程によりプログラム全体の中から抽出された前記着目ブロックを用いる複数の部分について、前記着目ブロックに対する先祖ブロック内のノード同士を比較して該先祖ブロック同士を融合するとともに、前記着目ブロックに対する継承ブロック内のノード同士を比較して該継承ブロック同士を融合し、その結果として融合ブロック情報を得る同一部融合リストラクチャリング工程をさらに含むことを特徴とする請求項６に記載のモジュール生成方法。
【請求項８】
前記共通化工程は、前記接合ノードリストラクチャリング工程によりプログラム全体の中から抽出された異なる着目ブロックのそれぞれについて前記同一部融合リストラクチャリング工程により得られる融合ブロック情報同士を比較し、同一または類似の融合ブロック情報を有する複数の前記着目ブロック同士を同種のサブルーチンと定義するとともに、同一または類似の融合ブロック情報同士をさらに融合し、その結果として抽象化コード情報を得る近似部融合リストラクチャリング工程をさらに含むことを特徴とする請求項７に記載のモジュール生成方法。
【請求項９】
前記共通化工程は、前記近似部融合リストラクチャリング工程により得られる抽象化コード情報、および前記パーサ工程により得られる解析情報に基づいて、共通化された部品の情報を得る中間語リストラクチャリング工程をさらに含むことを特徴とする請求項８に記載のモジュール生成方法。
【請求項１０】
前記マクロブロッキング解析工程では、各ブロックの演算パターンを仮想化するための前記付加情報として、各ブロックにおけるステートメントの変数を識別するための番号に、当該ステートメントにおける一意な番号を表す仮想部を付加することによって、各ステートメントの変数を識別するための番号を、前記ソースコード全体における一意な番号を表す下位部と、前記仮想部からなる上位部との組み合わせで表すことを特徴とする請求項９に記載のモジュール生成方法。
【請求項１１】
前記同一部融合リストラクチャリング工程では、前記仮想部に基づいて変数を識別することによって、前記先祖ブロック内のノード同士の比較、および前記継承ブロック内のノード同士の比較を行うことを特徴とする請求項１０に記載のモジュール生成方法。
【請求項１２】
前記近似部融合リストラクチャリング工程では、前記仮想部に基づいて変数を識別することによって、前記融合ブロック情報同士の比較を行うことを特徴とする請求項１０に記載のモジュール生成方法。
【請求項１３】
プログラムのソースコードに対して構文解析を行い、その解析情報を得るパーサ工程と、
前記パーサ工程により得られる構文解析情報に基づいて、前記プログラムの構造解析によって前記プログラムを複数のブロックに分割し、その結果としてブロックの構造情報と、各ブロックの演算パターンを仮想化するための付加情報を得るマクロブロッキング解析工程と、
前記マクロブロッキング解析工程により得られる構造情報および付加情報に基づいて、サブルーチンとして定義されている一つのブロックに着目し、該着目ブロックよりも処理順序が前で、かつ順次処理されることにより該着目ブロックに到達する先祖ブロック内のノードに対して処理順序を遡る方向に探索を行うとともに、該着目ブロックよりも処理順序が後で、かつ該着目ブロックから順次処理される継承ブロック内のノードに対して処理順序に従う方向に探索を行うことによって、該着目ブロックに直接関与するノードを抽出する接合ノードリストラクチャリング工程と、
前記接合ノードリストラクチャリング工程によりプログラム全体の中から抽出された前記着目ブロックを用いる複数の部分について、前記着目ブロックに対する先祖ブロック内のノード同士を比較して該先祖ブロック同士を融合するとともに、前記着目ブロックに対する継承ブロック内のノード同士を比較して該継承ブロック同士を融合し、その結果として融合ブロック情報を得る同一部融合リストラクチャリング工程と、
前記接合ノードリストラクチャリング工程によりプログラム全体の中から抽出された異なる着目ブロックのそれぞれについて前記同一部融合リストラクチャリング工程により得られる融合ブロック情報同士を比較し、同一または類似の融合ブロック情報を有する複数の前記着目ブロック同士を同種のサブルーチンと定義するとともに、同一または類似の融合ブロック情報同士をさらに融合し、その結果として抽象化コード情報を得る近似部融合リストラクチャリング工程と、
前記近似部融合リストラクチャリング工程により得られる抽象化コード情報、および前記パーサ工程により得られる解析情報に基づいて、共通化された部品の情報を得る中間語リストラクチャリング工程と、
をコンピュータに実行させるためのモジュール生成プログラム。
【請求項１４】
前記マクロブロッキング解析工程では、各ブロックの演算パターンを仮想化するための前記付加情報として、各ブロックにおけるステートメントの変数を識別するための番号に、当該ステートメントにおける一意な番号を表す仮想部を付加することによって、各ステートメントの変数を識別するための番号を、前記ソースコード全体における一意な番号を表す下位部と、前記仮想部からなる上位部との組み合わせで表すことを特徴とする請求項１３に記載のモジュール生成プログラム。
【請求項１５】
前記同一部融合リストラクチャリング工程では、前記仮想部に基づいて変数を識別することによって、前記先祖ブロック内のノード同士の比較、および前記継承ブロック内のノード同士の比較を行うことを特徴とする請求項１４に記載のモジュール生成プログラム。
【請求項１６】
前記近似部融合リストラクチャリング工程では、前記仮想部に基づいて変数を識別することによって、前記融合ブロック情報同士の比較を行うことを特徴とする請求項１４に記載のモジュール生成プログラム。
【請求項１７】
プログラムのソースコードに対して構文解析を行い、その解析情報を得るパーサ工程と、
前記パーサ工程により得られる構文解析情報に基づいて、前記プログラムの構造解析によって前記プログラムを複数のブロックに分割し、その結果としてブロックの構造情報と、各ブロックの演算パターンを仮想化するための付加情報を得るマクロブロッキング解析工程と、
前記マクロブロッキング解析工程により得られる構造情報および付加情報に基づいて、サブルーチンとして定義されている一つのブロックに着目し、該着目ブロックよりも処理順序が前で、かつ順次処理されることにより該着目ブロックに到達する先祖ブロック内のノードに対して処理順序を遡る方向に探索を行うとともに、該着目ブロックよりも処理順序が後で、かつ該着目ブロックから順次処理される継承ブロック内のノードに対して処理順序に従う方向に探索を行うことによって、該着目ブロックに直接関与するノードを抽出する接合ノードリストラクチャリング工程と、
前記接合ノードリストラクチャリング工程によりプログラム全体の中から抽出された前記着目ブロックを用いる複数の部分について、前記着目ブロックに対する先祖ブロック内のノード同士を比較して該先祖ブロック同士を融合するとともに、前記着目ブロックに対する継承ブロック内のノード同士を比較して該継承ブロック同士を融合し、その結果として融合ブロック情報を得る同一部融合リストラクチャリング工程と、
前記接合ノードリストラクチャリング工程によりプログラム全体の中から抽出された異なる着目ブロックのそれぞれについて前記同一部融合リストラクチャリング工程により得られる融合ブロック情報同士を比較し、同一または類似の融合ブロック情報を有する複数の前記着目ブロック同士を同種のサブルーチンと定義するとともに、同一または類似の融合ブロック情報同士をさらに融合し、その結果として抽象化コード情報を得る近似部融合リストラクチャリング工程と、
前記近似部融合リストラクチャリング工程により得られる抽象化コード情報、および前記パーサ工程により得られる解析情報に基づいて、共通化された部品の情報を得る中間語リストラクチャリング工程と、
をコンピュータに実行させるためのモジュール生成プログラムを記録したコンピュータ読み取り可能な記録媒体。
【請求項１８】
前記マクロブロッキング解析工程では、各ブロックの演算パターンを仮想化するための前記付加情報として、各ブロックにおけるステートメントの変数を識別するための番号に、当該ステートメントにおける一意な番号を表す仮想部を付加することによって、各ステートメントの変数を識別するための番号を、前記ソースコード全体における一意な番号を表す下位部と、前記仮想部からなる上位部との組み合わせで表すことを特徴とする請求項１７に記載のコンピュータ読み取り可能な記録媒体。
【請求項１９】
前記同一部融合リストラクチャリング工程では、前記仮想部に基づいて変数を識別することによって、前記先祖ブロック内のノード同士の比較、および前記継承ブロック内のノード同士の比較を行うことを特徴とする請求項１８に記載のコンピュータ読み取り可能な記録媒体。
【請求項２０】
前記近似部融合リストラクチャリング工程では、前記仮想部に基づいて変数を識別することによって、前記融合ブロック情報同士の比較を行うことを特徴とする請求項１８に記載のコンピュータ読み取り可能な記録媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、既にあるリソースから再利用可能なモジュールを生成するモジュール生成装置、モジュール生成方法、モジュール生成プログラムおよび該プログラムを記録した記録媒体に関するものである。
【背景技術】
【０００２】
図１８は、従来のソフトウェア開発処理の流れを示す図である。図１８に示すように、従来、新規にソフトウェアを開発する際には、まず、設計支援ツールを用いて、自然言語で記述された新規開発計画書１から設計計画書２が作成される（ステップＳ１９０１）。ここでは、新規開発計画書１と、既に登録されているツールや部品（既登録部品ツール）３とが対比され、新規開発計画書１に合うように既登録部品ツール３が組み合わされる。【０００３】
次いで、設計計画書２に基づいて、コーディング処理が行われる（ステップＳ１９０２）。そして、コーディングされたコードのデバッグ処理が行われる（ステップＳ１９０３）。デバッグ処理では、ソースコード４の構文を解析するパーサ処理（ステップＳ１９１１）、ソースコード４の構造を解析する構造解析処理（ステップＳ１９１２）、および冗長コードの削除など、コードレベルの最適化処理（ステップＳ１９１３）が行われ、実行コード５が生成される。【０００４】
最適化処理においては、定数伝播やインライン展開、またはループアンローリングなどの周知の処理が実施される。プログラムの構造自体は、変更されない。コーディング処理と、デバッグ処理の一部は、ソフトウェアの開発者により人為的に行われる。ここで、人為的に行うとは、設計支援ツールなどのコンピュータによる自動的な処理ではなく、開発者が逐一、試行錯誤し、確認して処理することを意味する。【０００５】
デバッグ処理の後、実行コード５を用いた試験が行われ（ステップＳ１９０４）、開発成果物６が生成される。この開発成果物６は、既存リソース７として再利用される。この既存リソース７や、他で用いられた実績のあるリソース８が再利用される際に、それらのリソース７，８に仕様変更があると、ソフトウェアの開発者が人為的に改造計画書９を作成する必要がある。【０００６】
ところで、革新的フレームワーク・アーキテクチャを使用して、最初のオブジェクト指向オペレーティング・システムを提供するオブジェクト指向フレームワーク・システムが公知である。このオブジェクト指向フレームワーク・システムを提供する装置は、オブジェクト指向アプリケーションを処理するオペレーティング・システム手段と、オペレーティング・システム手段に常駐しているオブジェクト指向アプリケーションを標準化するフレームワーク処理手段とを具備する（例えば、特許文献１参照。）。【０００７】
【特許文献１】特表平８−５０５７２１号公報
【発明の開示】
【発明が解決しようとする課題】
【０００８】
しかしながら、上述した従来のソフトウェア開発処理では、他で実績のあるリソースを再利用して既存リソースの改造を行う際に、与えられたソースコードの解析やドキュメント類の解析を開発者が人為的に行って改造計画書を作成する必要がある。そのため、次のような問題が生じる。まず、人為的に行われた解析結果に誤りが含まれるおそれがある。また、既存リソースと他で実績のあるリソースとで共通する部分をモジュール化する際に、開発者が共通部分を十分に抽出することができないおそれがある。共通部分の抽出が不十分であると、他で実績のあるリソース内の新規な部分が多くなり、その新規な部分に対するデバッグ処理や試験に費やす手間と時間が増えてしまう。また、前記特許文献１に開示されたオブジェクト指向フレームワーク・システムは、既存のリソースから再利用可能なモジュールを自動的に生成するシステムではない。【０００９】
本発明は、上記に鑑みてなされたものであって、既にあるリソースから再利用可能なモジュールを、開発者の人為的な作業によらずに、自動的に生成するモジュール生成装置、モジュール生成方法、モジュール生成プログラムおよび該プログラムを記録した記録媒体を提供することを目的とする。
【課題を解決するための手段】
【００１０】
上述した課題を解決し、目的を達成するために、本発明は、コンピュータをパーシング部、マクロブロッキング解析部、接合ノードリストラクチャリング部、同一部融合リストラクチャリング部、近似部融合リストラクチャリング部および中間語リストラクチャリング部として機能させることを特徴とする。パーシング部は、プログラムのソースコードに対して構文解析を行い、その解析情報を出力する。【００１１】
マクロブロッキング解析部は、パーシング部から出力される構文解析情報に基づいて、プログラムの構造解析を行い、そのプログラムを複数のブロックに分割する。そして、マクロブロッキング解析部は、各ブロックにおけるステートメントの変数を識別するための番号に、当該ステートメントにおける一意な番号を表す仮想部を付加し、その付加情報とブロックの構造情報を出力する。各ステートメントの変数を識別するための番号は、ソースコード全体における一意な番号を表す下位部と、当該ステートメントにおける一意な番号を表す仮想部からなる上位部との組み合わせで表される。各ステートメントの変数を識別するための番号がこのように表されることによって、各ブロックの演算パターンが仮想化される。【００１２】
接合ノードリストラクチャリング部は、マクロブロッキング解析部から出力される構造情報および付加情報に基づいて、サブルーチンとして定義されている１つのブロックに着目する。そして、接合ノードリストラクチャリング部は、先祖ブロック内のノードに対して処理順序を遡る方向（以下、逆方向とする）に探索を行うとともに、継承ブロック内のノードに対して処理順序に従う方向（以下、正方向とする）に探索を行うことによって、着目ブロックに直接関与するノードを抽出する。先祖ブロックとは、着目ブロックよりも処理順序が前で、かつ順次処理されることにより着目ブロックに到達するブロックのことである。継承ブロックとは、着目ブロックよりも処理順序が後で、かつ着目ブロックから順次処理されるブロックのことである。【００１３】
プログラム全体の中では、接合ノードリストラクチャリング部により着目されたブロック（サブルーチン）が複数の部分で呼ばれることがある。同一部融合リストラクチャリング部は、そのような同一の着目ブロックを用いる複数の部分について、先祖ブロック内のノード同士を比較して先祖ブロック同士を融合する。同様に、同一部融合リストラクチャリング部は、そのような複数の部分について、継承ブロック内のノード同士を比較して継承ブロック同士を融合する。そして、同一部融合リストラクチャリング部は、その結果として得られる融合ブロック情報を出力する。【００１４】
また、プログラム全体の中には、似たような構造のブロック（サブルーチン）が存在することがある。近似部融合リストラクチャリング部は、そのような異なる着目ブロックのそれぞれについて融合ブロック情報同士を比較し、同一または類似の融合ブロック情報を有する複数の着目ブロック同士を同種のサブルーチンと定義する。そして、近似部融合リストラクチャリング部は、同一または類似の融合ブロック情報同士を融合し、その結果として得られる抽象化コード情報を出力する。中間語リストラクチャリング部は、近似部融合リストラクチャリング部から出力される抽象化コード情報、およびパーシング部から出力される解析情報に基づいて、共通化された部品の情報を出力する。【００１５】
この発明によれば、同一部融合リストラクチャリング部および近似部融合リストラクチャリング部によるノードの同一性判定時に、ステートメントの変数を識別するための番号のうち、下位部をマスクして上位部（仮想部）のみを比較することによって、容易に同一性を判定できる。従って、コンピュータにより自動的に同一または類似のブロックを抽出することができる。また、通常の構文解析や構造解析を行う際や、接合ノードリストラクチャリング部により着目ブロックに対する依存ノードを抽出する際には、ステートメントの変数を識別するための番号として、上位部（仮想部）をマスクして下位部のみを参照することによって、従来同様に処理することができる。
【発明の効果】
【００１６】
本発明にかかるモジュール生成装置、モジュール生成方法、モジュール生成プログラムおよび該プログラムを記録した記録媒体は、既にあるリソースから再利用可能なモジュールを、開発者の人為的な作業によらずに、コンピュータによって自動的に生成することができるという効果を奏する。
【図面の簡単な説明】
【００１７】
【図１】図１は、本発明の実施の形態にかかるモジュール生成装置のハードウェア構成を示す図である。
【図２】図２は、本発明の実施の形態にかかるモジュール生成装置の機能的構成を示す図である。
【図３】図３は、本発明の実施の形態にかかるモジュール生成処理の流れを示す図である。
【図４】図４は、マクロブロッキング解析工程において分類される項目を示す図である。
【図５】図５は、図４の分類表に基づいてプログラムを分割した例を模式的に示す図である。
【図６】図６は、マクロブロッキング解析処理の流れを示す図である。
【図７】図７は、接合ノードリストラクチャリング処理の流れを示す図である。
【図８】図８は、接合ノードリストラクチャリング処理を説明する図である。
【図９】図９は、接合ノードリストラクチャリング処理を説明する図である。
【図１０】図１０は、同一部融合リストラクチャリング処理の流れを示す図である。
【図１１】図１１は、同一部融合リストラクチャリング処理を説明する図である。
【図１２】図１２は、同一部融合リストラクチャリング処理を説明する図である。
【図１３】図１３は、同一部融合リストラクチャリング処理を説明する図である。
【図１４】図１４は、近似部融合リストラクチャリング処理を説明する図である。
【図１５】図１５は、近似部融合リストラクチャリング処理を説明する図である。
【図１６】図１６は、近似部融合リストラクチャリング処理の流れを示す図である。
【図１７】図１７は、本発明の実施の形態にかかるモジュール生成処理を適用したソフトウェア開発処理の流れを示す図である。
【図１８】図１８は、従来のソフトウェア開発処理の流れを示す図である。
【符号の説明】
【００１８】
１１  パーシング部
１２  マクロブロッキング解析部
１３  接合ノードリストラクチャリング部
１４  同一部融合リストラクチャリング部
１５  近似部融合リストラクチャリング部
１６  中間語リストラクチャリング部
【発明を実施するための最良の形態】
【００１９】
以下に、本発明にかかるモジュール生成装置、モジュール生成方法、モジュール生成プログラムおよび該プログラムを記録した記録媒体の実施例を図面に基づいて詳細に説明する。なお、この実施例によりこの発明が限定されるものではない。【００２０】
（モジュール生成装置のハードウェア構成）
図１は、本発明の実施の形態にかかるモジュール生成装置のハードウェア構成を示す図である。図１に示すように、モジュール生成装置は、ＣＰＵ１０１と、ＲＯＭ１０２と、ＲＡＭ１０３と、ＨＤＤ（ハードディスクドライブ）１０４と、ＨＤ（ハードディスク）１０５と、ＦＤＤ（フレキシブルディスクドライブ）１０６と、着脱可能な記録媒体の一例としてのＦＤ（フレキシブルディスク）１０７と、ディスプレイ１０８と、Ｉ／Ｆ（インターフェース）１０９と、キーボード１１０と、マウス１１１と、スキャナ１１２と、プリンタ１１３と、を備えている。また、各構成部は、バス１００によってそれぞれ接続されている。【００２１】
ここで、ＣＰＵ１０１は、モジュール生成装置の全体の制御を司る。ＲＯＭ１０２は、ブートプログラムなどのプログラムを記憶している。ＲＡＭ１０３は、ＣＰＵ１０１のワークエリアとして使用される。ＨＤＤ１０４は、ＣＰＵ１０１の制御に従ってＨＤ１０５に対するデータのリード／ライトを制御する。ＨＤ１０５は、ＨＤＤ１０４の制御で書き込まれたデータを記憶する。【００２２】
ＦＤＤ１０６は、ＣＰＵ１０１の制御に従ってＦＤ１０７に対するデータのリード／ライトを制御する。ＦＤ１０７は、ＦＤＤ１０６の制御で書き込まれたデータを記憶したり、ＦＤ１０７に記憶されたデータをモジュール生成装置に読み取らせたりする。【００２３】
また、着脱可能な記録媒体として、ＦＤ１０７のほか、ＣＤ−ＲＯＭ（ＣＤ−Ｒ、ＣＤ−ＲＷ）、ＭＯ、ＤＶＤ（Ｄｉｇｉｔａｌ  Ｖｅｒｓａｔｉｌｅ  Ｄｉｓｋ）、メモリーカードなどであってもよい。ディスプレイ１０８は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。このディスプレイ１０８は、例えば、ＣＲＴ、ＴＦＴ液晶ディスプレイ、プラズマディスプレイなどを採用することができる。【００２４】
Ｉ／Ｆ１０９は、通信回線を通じてインターネットなどのネットワーク１１４に接続され、このネットワーク１１４を介して他の装置に接続される。そして、Ｉ／Ｆ１０９は、ネットワーク１１４と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。Ｉ／Ｆ１０９には、例えばモデムやＬＡＮアダプタなどを採用することができる。【００２５】
キーボード１１０は、文字、数字、各種指示などの入力のためのキーを備え、データの入力を行う。また、タッチパネル式の入力パッドやテンキーなどであってもよい。マウス１１１は、カーソルの移動や範囲選択、あるいはウィンドウの移動やサイズの変更などを行う。ポインティングデバイスとして同様に機能を備えるものであれば、トラックボールやジョイスティックなどであってもよい。【００２６】
スキャナ１１２は、画像を光学的に読み取り、モジュール生成装置内に画像データを取り込む。なお、スキャナ１１２は、ＯＣＲ機能を持たせてもよい。また、プリンタ１１３は、画像データや文書データを印刷する。プリンタ１１３には、例えば、レーザプリンタやインクジェットプリンタを採用することができる。【００２７】
（モジュール生成装置の機能的構成）
図２は、本発明の実施の形態にかかるモジュール生成装置の機能的構成を示す図である。図２に示すように、モジュール生成装置は、パーシング部１１、マクロブロッキング解析部１２、接合ノードリストラクチャリング部１３、同一部融合リストラクチャリング部１４、近似部融合リストラクチャリング部１５および中間語リストラクチャリング部１６を備えている。【００２８】
パーシング部１１は、プログラムのソースコードに対して構文解析を行う。マクロブロッキング解析部１２は、プログラムの構造解析を行い、そのプログラムを複数のブロックに分割する。また、マクロブロッキング解析部１２は、分割された各ブロックにおけるステートメントの変数を識別するための番号に、そのステートメントにおける一意な番号を表す仮想部を付加して、ステートメントの変数を識別するための番号を拡張する。【００２９】
例えば、マクロブロッキング解析部１２は、従来通りのソースコード全体における一意な番号を下位ビット部とし、それに前記仮想部を上位ビット部として付加する。この番号の拡張により、ステートメントの変数を識別するための番号が下位部と上位部の組み合わせで表されることになり、各ブロックの演算パターンが仮想化される。【００３０】
接合ノードリストラクチャリング部１３は、サブルーチンとして定義されている１つのブロックに着目する。そして、接合ノードリストラクチャリング部１３は、その着目ブロックに対する先祖ブロック内のノードに対して逆方向に探索を行い、着目ブロックから逆方向に一続きに遡ることができるノードを、着目ブロックに直接関与するノードとして抽出する。【００３１】
接合ノードリストラクチャリング部１３は、その着目ブロックに対する継承ブロック内のノードに対して正方向に探索を行う。そして、接合ノードリストラクチャリング部１３は、着目ブロックの処理を引き継ぐノード、そのノードの処理をさらに引き継ぐノードがある場合には、そのノード、というように、着目ブロックから正方向に連なるノードを、着目ブロックに直接関与するノードとして抽出する。【００３２】
接合ノードリストラクチャリング部１３は、ノードを抽出する際に、ステートメントの変数を識別するための番号として、上位部（仮想部）をマスクして下位部のみを参照する。同一部融合リストラクチャリング部１４は、プログラム全体の中において、接合ノードリストラクチャリング部１３により着目されたサブルーチンのブロックが呼ばれる複数の部分について、先祖ブロック内のノード同士を比較し、同一または類似の先祖ブロック同士を融合する。【００３３】
また、同一部融合リストラクチャリング部１４は、継承ブロックについても同様に、継承ブロック内のノード同士を比較し、同一または類似の継承ブロック同士を融合する。同一部融合リストラクチャリング部１４は、ノードの同一性を判定する際に、ステートメントの変数を識別するための番号として、下位部をマスクして上位部（仮想部）のみを参照する。【００３４】
近似部融合リストラクチャリング部１５は、プログラム全体の中に存在する、似たような構造の複数のサブルーチンのブロックを、同種のサブルーチンと定義する。そして、近似部融合リストラクチャリング部１５は、その同種のサブルーチンと定義した複数のサブルーチンのブロックについて、同一部融合リストラクチャリング部１４と同様に、先祖ブロック同士および継承ブロック同士を融合する。【００３５】
近似部融合リストラクチャリング部１５は、同種のサブルーチンについてノードの同一性を判定する際に、ステートメントの変数を識別するための番号として、下位部をマスクして上位部（仮想部）のみを参照する。中間語リストラクチャリング部１６は、近似部融合リストラクチャリング部１５の出力情報に基づいて、部品化されたソースコードや、共通化された部品の情報を出力する。【００３６】
図２に示す例では、接合ノードリストラクチャリング部１３および同一部融合リストラクチャリング部１４の組が複数組、設けられており、各組の出力情報が総合されて近似部融合リストラクチャリング部１５に渡される構成となっている。つまり、パーシング部１１に入力されるソースコードの構造に応じて、複数の処理がなされるようになっている。【００３７】
なお、上述したパーシング部１１、マクロブロッキング解析部１２、接合ノードリストラクチャリング部１３、同一部融合リストラクチャリング部１４、近似部融合リストラクチャリング部１５および中間語リストラクチャリング部１６は、具体的には、例えば、図１に示したＲＯＭ１０２、ＲＡＭ１０３、ＨＤ１０５などの記録媒体に記録されたプログラムを、ＣＰＵ１０１が実行することによって、またはＩ／Ｆ１０９によって、その機能を実現する。【００３８】
（モジュール生成処理手順）
図３は、本発明の実施の形態にかかるモジュール生成処理の流れを示す図である。図３に示すように、パーシング部１１にソースコード２１が入力されて、モジュール生成処理が開始されると、まず、パーシング部１１は、一般的なコンパイラの構造における初期フェーズであるパーサ（構文解析）工程を行う（ステップＳ３０１）。このパーサ工程により、中間生成情報として構文解析情報２２が得られる。【００３９】
次いで、マクロブロッキング解析部１２は、構文解析情報２２に基づいて、マクロブロッキング解析（構造解析）工程を行う（ステップＳ３０２）。このマクロブロッキング解析工程により、中間生成情報として構造情報および付加情報２３が得られる。次いで、接合ノードリストラクチャリング部１３は、構造情報および付加情報２３に基づいて、接合ノードリストラクチャリング工程を行う（ステップＳ３０３）。【００４０】
次いで、同一部融合リストラクチャリング部１４は、構造情報および付加情報２３に基づいて、同一部融合リストラクチャリング工程を行う（ステップＳ３０４）。この同一部融合リストラクチャリング工程により、中間生成情報として融合ブロック情報２４が得られる。次いで、近似部融合リストラクチャリング部１５は、融合ブロック情報２４に基づいて、近似部融合リストラクチャリング工程を行う（ステップＳ３０５）。この近似部融合リストラクチャリング工程により、中間生成情報として抽象化コード情報２５が得られる。マクロブロッキング解析工程、接合ノードリストラクチャリング工程、同一部融合リストラクチャリング工程および近似部融合リストラクチャリング工程の詳細については、後述する。【００４１】
次いで、中間語リストラクチャリング部１６は、抽象化コード情報２５および前記構文解析情報２２に基づいて、中間語リストラクチャリング工程を行う（ステップＳ３０６）。この中間語リストラクチャリング工程では、ステップＳ３０１〜Ｓ３０５の各工程での処理により生成される中間語に対して、総合的なリストラクチャリングと情報整理を行う。また、中間語リストラクチャリング工程においては、プリプロセッサ機能と連動して、リストラクチャリングされた中間語に基づいて、ソースコードを出力することもできる。従って、この工程により、部品化されたソースコードや、共通化された部品の情報として、ソースコード２１の解析結果であるモジュール情報２６や、共通化による再利用可能な共通部モジュール２７が得られる。【００４２】
（マクロブロッキング解析工程における処理）
マクロブロッキング解析工程では、マクロブロッキング解析部１２は、一般的な並列処理のためのコンパイラが行うブロック分割を行う。図４に、マクロブロッキング解析工程において分類される項目を示す。図４に示すように、一般に、プログラムは、演算代入処理（Ａ）、ループ（Ｂ）、条件分岐（Ｃ）および無条件ジャンプ（Ｄ）に分類される。演算代入処理（Ａ）は、ソースコード中で通常の数式として表現される。また、無条件ジャンプ（Ｄ）は、ソースコード中でサブルーチンコールとして表現される。【００４３】
図５は、図４の分類表に基づいてプログラムを分割した例を模式的に示す図である。分割された各ブロック内のアルファベット（Ａ、Ｂ、ＣおよびＤ）は、図４の分類表の左欄のアルファベットに該当する。なお、図５は一例であり、演算代入処理（Ａ）、ループ（Ｂ）、条件分岐（Ｃ）および無条件ジャンプ（Ｄ）の出現順序や出現回数などに制限はない。【００４４】
図６は、マクロブロッキング解析処理の流れを示す図である。図６に示すように、マクロブロッキング解析部１２によりマクロブロッキング解析処理が開始されると、まず、構文解析情報２２として得られた中間語プログラム（Ｅ）を用意する（ステップＳ６０１）。そして、中間語プログラム（Ｅ）を一行ずつ読み込む。ステートメントの種類が代入文または演算文である場合（ステップＳ６０２：Ａ）、以下のステップＳ６０３〜Ｓ６０６の処理を行う。【００４５】
代入または演算のステートメントが記述されている間（ステップＳ６０３：Ｙｅｓ）は、一行ずつ行を進める。一連の代入または演算のステートメントのブロックが終わる（ステップＳ６０３：Ｎｏ）と、そのブロックを代入ブロックとして定義する（ステップＳ６０４）。次いで、テーブルを作成し、ステートメントの変数の仮想化処理を行う（ステップＳ６０５）。この仮想化処理の詳細については、後述する。そして、ステートメントフローグラフを作成し（ステップＳ６０６）、ステップＳ６０２に戻る。【００４６】
中間語プログラム（Ｅ）のステートメントの種類がループである場合（ステップＳ６０２：Ｂ）、以下のステップＳ６０７〜Ｓ６１０の処理を行う。ステートメントの種類がループである場合には、その行にはループの先頭コードが記述されている。プログラムの終端をループ終端と定義し（ステップＳ６０７）、中間語プログラム（Ｅ）を再び呼び出し（ステップＳ６０８）、ループブロックとして定義する（ステップＳ６０９）。【００４７】
ステップＳ６０８で中間語プログラム（Ｅ）を再び呼び出すのは、ループブロックの中にさらにループブロックが存在することがあるからである。そして、入出力変数テーブルを作成し（ステップＳ６１０）、ステップＳ６０２に戻る。中間語プログラム（Ｅ）のステートメントの種類が条件分岐である場合（ステップＳ６０２：Ｃ）、制御構造テーブルを作成し（ステップＳ６１１）、ステップＳ６０２に戻る。【００４８】
中間語プログラム（Ｅ）のステートメントの種類がジャンプ命令である場合（ステップＳ６０２：Ｄ）、以下のステップＳ６１２〜Ｓ６１５の処理を行う。プログラムの終端をリターンコードと定義し（ステップＳ６１２）、中間語プログラム（Ｅ）を再び呼び出し（ステップＳ６１３）、サブルーチンブロックとして定義する（ステップＳ６１４）。ステップＳ６１３で中間語プログラム（Ｅ）を再び呼び出すのは、サブルーチンブロックの中にさらにサブルーチンブロックが存在することがあるからである。そして、入出力変数テーブルを作成し（ステップＳ６１５）、ステップＳ６０２に戻る。【００４９】
ステップＳ６０２で、中間語プログラム（Ｅ）のステートメントがプログラムの終端を表す場合には、処理を終了する（ステップＳ６１６）。これにより、構造情報および付加情報２３として、タスク分割および分類された処理ブロック、入出力変数テーブルおよび制御構造などからなるフローグラフが得られる。【００５０】
（ステートメントの変数の仮想化処理）
変数の仮想化処理は、通常の構造解析におけるステートメントの中間語表現を以下のように拡張することによって、後の処理において構造の比較を容易にするために行われる。例えば、ソースコード中で次の式１に示す表現がなされる場合、一般的な中間語表現では、式２〜式４に示すように、変数に対して固定的な番号が割り振られる。【００５１】
Ａ＝ｂ＋ｃ＋１  ・・・（式１）
Ｖ０←Ｖ１＋Ｖ２  ・・・（式２）
Ｖ３←Ｖ０＋Ｃ１  ・・・（式３）
Ｖ４←Ｖ３  ・・・（式４）【００５２】
このとき、次の式５に示すような同様の演算・代入表現がなされると、式６〜式８に示すような中間語が生成される。ただし、Ｘ、ｍおよびｎは、ソースコード中ですでに登場しており、中間語表現においてすでに採番されているとする。この場合、次の式６〜式８と上記式２〜式４とを単純に比較することは困難である。【００５３】
Ｘ＝ｍ＋ｎ＋１  ・・・（式５）
Ｖ１１←Ｖ５＋Ｖ６  ・・・（式６）
Ｖ１２←Ｖ１１＋Ｃ１  ・・・（式７）
Ｖ８←Ｖ１２  ・・・（式８）【００５４】
そこで、本実施例では、変数を表現するＶ（Ｖａｒｉａｂｌｅ）の添え字である番号を、ソースコード全体における一意な番号を表す下位部（従来の表現と同じである）と、当該ステートメントにおける一意な番号を表す仮想部からなる上位部との組み合わせで表すことにより、仮想化する。例えば、変数テーブルが１６ビット表現を用いる場合、これを３２ビットに拡張する。そして、下位１６ビットを中間語表現において一意な番号（従来の表現）とし、上位１６ビットをそのステートメントにおいて一意な番号と定義する。【００５５】
これによって、前記式２〜式４は、次の式９〜式１１で表される。また、前記式６〜式８は、式１２〜式１４で表される。ただし、式９〜式１４において、｛｝で表された値は、上位１６ビットに格納される仮想化された相対番号である。【００５６】
Ｖ｛００｝００←Ｖ｛０１｝０１＋Ｖ｛０２｝０２  ・・・（式９）
Ｖ｛０３｝０３←Ｖ｛００｝００＋Ｃ｛０１｝０１  ・・・（式１０）
Ｖ｛０４｝０４←Ｖ｛０３｝０３  ・・・（式１１）【００５７】
Ｖ｛００｝１１←Ｖ｛０１｝０５＋Ｖ｛０２｝０６  ・・・（式１２）
Ｖ｛０３｝１２←Ｖ｛００｝１１＋Ｃ｛０１｝０１  ・・・（式１３）
Ｖ｛０４｝０８←Ｖ｛０３｝１２  ・・・（式１４）【００５８】
上記式９〜式１４において、ＶやＣの添え字の下位１６ビットをマスクし、上位１６ビットのみを参照すると、式９〜式１１と式１２〜式１４が同じものであるということがわかる。上述したマクロブロッキング解析処理により、構造情報および付加情報２３として、マクロタスキングによるブロック構成と、この仮想化処理によって拡張定義されたステートメントグラフ表現の中間言語である。従来通りの通常の構文解析や依存解析を行う際には、ＶやＣの添え字の上位１６ビットをマスクし、下位１６ビットのみを参照する。【００５９】
（接合ノードリストラクチャリング工程における処理）
図７は、接合ノードリストラクチャリング処理の流れを示す図である。図７に示すように、接合ノードリストラクチャリング部１３により接合ノードリストラクチャリング処理が開始されると、まず、構造情報および付加情報２３として得られたフローグラフに基づいて、サブルーチンブロックＭＴｎに着目する（ステップＳ７０１）。【００６０】
そして、このサブルーチンブロックＭＴｎと、サブルーチンブロックＭＴｎに対して依存関係にある別のブロックＭＴｍとの依存関係を判定する（ステップＳ７０２）。サブルーチンブロックＭＴｎに対する先祖ブロックおよび継承ブロックは、上述したマクロブロッキング解析工程において生成されている。【００６１】
ブロックＭＴｍが先祖ブロックである場合（ステップＳ７０２：先祖ブロック）、ブロックＭＴｍの全ての終端ステートメントＳｘに着目する（ステップＳ７０３）。そして、終端ステートメントＳｘにおいて定義される変数の集合と、サブルーチンブロックＭＴｎにおいて用いられる変数の集合との交わりの集合（Ｓｘ∩Ｉｎ（ＭＴｎ））について判断する（ステップＳ７０４）。【００６２】
その交わりの集合が空集合Φである場合（ステップＳ７０４：Φ）、ブロックＭＴｍ内のノードに対して、ステップＳ７０１で着目したサブルーチンブロックＭＴｎから逆方向にステートメントグラフの探索（ノード探索）を行い、リストを作成する（ステップＳ７０５）。そして、ステップＳ７０５で探索されたノードを、サブルーチンブロックＭＴｎに関係のない処理を行うノードとして、ブロックＭＴｍから分割する（ステップＳ７０６）。【００６３】
一方、前記交わりの集合（Ｓｘ∩Ｉｎ（ＭＴｎ））が空集合Φでない場合（ステップＳ７０４：≠Φ）、ブロックＭＴｍ内のノードに対して、ステップＳ７０１で着目したサブルーチンブロックＭＴｎから逆方向にノード探索を行い、サブルーチンブロックＭＴｎに直接依存していくノードとしてリストを作成する（ステップＳ７０７）。また、ステップＳ７０２で、ブロックＭＴｍが継承ブロックである場合（ステップＳ７０２：継承ブロック）、ブロックＭＴｍの全ての開始ステートメントＳｘに着目する（ステップＳ７０８）。【００６４】
そして、開始ステートメントＳｘにおいて用いられる変数の集合と、サブルーチンブロックＭＴｎにおいて定義される変数の集合との交わりの集合（Ｓｘ∩Ｏｕｔ（ＭＴｎ））について判断する（ステップＳ７０９）。その交わりの集合が空集合Φでない場合（ステップＳ７０９：≠Φ）、ブロックＭＴｍ内のノードに対して、ステップＳ７０１で着目したサブルーチンブロックＭＴｎから正方向にノード探索を行い、サブルーチンブロックＭＴｎから直接依存していくノードとしてリストを作成する（ステップＳ７１０）。【００６５】
一方、ステップＳ７０９で前記交わりの集合（Ｓｘ∩Ｏｕｔ（ＭＴｎ））が空集合Φである場合（ステップＳ７０９：Φ）、ブロックＭＴｍ内のノードに対して、ステップＳ７０１で着目したサブルーチンブロックＭＴｎから正方向にステートメントグラフの探索（ノード探索）を行い、リストを作成する（ステップＳ７１１）。そして、ステップＳ７１１で探索されたノードを、サブルーチンブロックＭＴｎに関係のない処理を行うノードとして、ブロックＭＴｍから分割する（ステップＳ７１２）。【００６６】
上述したステップＳ７０１〜Ｓ７１２の処理を、全てのサブルーチンブロックＭＴｎに対して行う。これによって、サブルーチンブロックＭＴｎと、先祖ブロック内の、ステップＳ７０７で抽出されたノード群と、継承ブロック内の、ステップＳ７１０で抽出されたノード群を、サブルーチンブロックＭＴｎの抽象化ブロックとして融合したブロック（以下、融合ブロックとする）２８が得られる。なお、ＭＴは、マクロタスクを意味する。【００６７】
図８および図９は、接合ノードリストラクチャリング処理を説明する図である。図８において、符号３１はサブルーチンブロックであり、符号３２は先祖ブロックであり、符号３３は継承ブロックである。先祖ブロック３２において、点線で囲むノード群３４は、サブルーチンブロック３１へ直接依存していく。別のブロックへ依存していくノード群３５は、サブルーチンブロック３１に関係のない処理を行うノードとして、先祖ブロック３２から分割される。【００６８】
また、継承ブロック３３において、点線で囲むノード群３６は、サブルーチンブロック３１から直接依存していく。別のブロックから依存されてくるノード群３７は、サブルーチンブロック３１に関係のない処理を行うノードとして、継承ブロック３３から分割される。従って、図８に示す構成の場合、図９に示すように、融合ブロック３８は、太い実線で囲むようになる。【００６９】
（同一部融合リストラクチャリング工程における処理）
一般的なプログラムにおいては、サブルーチンが複数箇所で呼ばれることがある。そこで、同一部融合リストラクチャリング工程では、同一部融合リストラクチャリング部１４は、上述した接合ノードリストラクチャリング処理により得られた融合ブロック２８の情報に基づいて、プログラムの複数箇所で呼ばれる同一のサブルーチンブロックに対して、接合ノードの比較を行い、同一または類似の融合ブロック同士をさらに融合する。【００７０】
その際、ステートメントの変数の仮想化処理により拡張された変数の添え字の例えば上位１６ビット（仮想部）のみを参照する。一般のプログラム表現の場合には、サブルーチンブロックに接合するノードの同一性を比較することは、困難である。しかし、本実施例のように、比較対象の添え字の仮想部同士を比較することにより、プログラム中では異なる表現になっていても、容易に同一部を抽出することができる。【００７１】
図１０は、同一部融合リストラクチャリング処理の流れを示す図である。図１０に示すように、同一部融合リストラクチャリング部１４により同一部融合リストラクチャリング処理が開始されると、まず、全ての処理ブロックを用意する（ステップＳ１００１）。そして、処理ブロックを１つずつ読み込み、それがサブルーチンブロックであるか否かを判断する（ステップＳ１００２）。サブルーチンブロックでない場合（ステップＳ１００２：Ｎｏ）には、次の処理ブロックに移る。【００７２】
サブルーチンブロックである場合（ステップＳ１００２：Ｙｅｓ）には、その後続のブロックの属性検索を行う（ステップＳ１００３）。そして、読み込まれている処理ブロックが同一アプリケーションの別箇所で呼ばれる同じサブルーチンであるか否かを判断する（ステップＳ１００４）。そうである場合（ステップＳ１００４：Ｙｅｓ）には、融合ブロック同士を再融合し（ステップＳ１００５）、ステップＳ１００２に戻る。そうでない場合（ステップＳ１００４：Ｎｏ）には、ステップＳ１００３に戻る。【００７３】
図１１〜図１３は、同一部融合リストラクチャリング処理を説明する図である。図１１において、符号４１はサブルーチンＡのブロックであり、符号４２はその融合ブロックである。この融合ブロック４２において、先祖ブロック側は、逆方向に、ノードＮ１、ノードＮ２およびノードＮ３がこの順に連なるノード群と、ノードＮ４からなる。融合ブロック４２において、継承ブロック側は、正方向に、ノードＮ５およびノードＮ６がこの順に連なるノード群と、ノードＮ７およびノードＮ８がこの順に連なるノード群と、ノードＮ７およびノードＮ９がこの順に連なるノード群からなる。ノードＮ８とノードＮ９は、ノードＮ７から分岐している。【００７４】
また、図１２において、符号４３は、同一アプリケーションの別箇所で呼ばれるサブルーチンＡのブロックであり、符号４４はその融合ブロックである。この融合ブロック４４において、先祖ブロック側は、逆方向に、ノードＮ１、ノードＮ２およびノードＮ３がこの順に連なるノード群と、ノードＮ１０およびノードＮ１１がこの順に連なるノード群からなる。融合ブロック４４において、継承ブロック側は、正方向に、ノードＮ５およびノードＮ６がこの順に連なるノード群と、ノードＮ１２と、ノードＮ１３およびノードＮ１４がこの順に連なるノード群からなる。【００７５】
このような場合、サブルーチンＡのブロック４１の融合ブロック４２と同一アプリケーションの別箇所で呼ばれるサブルーチンＡのブロック４３の融合ブロック４４を融合すると、図１３に示すように、ノードＮ３、ノードＮ４およびノードＮ１１を引数とし、ノードＮ６、ノードＮ８、ノードＮ９、ノードＮ１２およびノードＮ１４を戻値とするサブルーチンＡ抽象化コードＡＰＩ（Ａｐｐｌｉｃａｔｉｏｎ  Ｐｒｏｇｒａｍ  Ｉｎｔｅｒｆａｃｅ）４５が得られる。このように、最終的に同一であるサブルーチンブロックに接合するノードを融合することにより、より簡単にプログラムが表現されることになる。【００７６】
一般に、あるサブルーチンブロックがプログラム中の複数箇所で呼ばれる場合、サブルーチンブロックに対する前処理（先祖ブロック処理）と後処理（継承ブロック処理）が各箇所で同様の処理であることがドキュメントに明示的に記載されていないことがある。このような場合、開発者が複数箇所において同様の処理である前処理（先祖ブロック処理）と後処理（継承ブロック処理）を抽出することは、困難である。【００７７】
しかし、本実施例では、ステートメントの変数の添え字を拡張したことにより、着目したサブルーチンに対する汎用的な前処理と後処理のラッピングコード（抽象化コード）を容易に生成することができる。そして、ソースコード中の同一ノードをまとめることができるので、コード自体の縮小化を図ることができる。【００７８】
（近似部融合リストラクチャリング工程における処理）
図１４および図１５は、近似部融合リストラクチャリング処理を説明する図である。図１４において、符号４６はサブルーチンＢのブロックであり、符号４７はそのサブルーチンＢ抽象化コードＡＰＩである。サブルーチンＢのブロック４６に対する前処理および後処理において、図１３に示すサブルーチンＡのブロック４１に対する前処理および後処理と異なるのは、次の２点である。【００７９】
第１に、ノードＮ４の代わりに、図１４に点線で囲むノードＮ１５およびノードＮ１６からなるノード群４８があることである。第２に、図１４に点線で囲むノード群４９において、ノードＮ７から分岐するノードＮ９がないことである。このように、異なるサブルーチンにおいても、近似的な前処理や後処理を行う場合がある。【００８０】
具体的な事例としては、動画処理のサブルーチンにおいて、ＭＰＥＧ（Ｍｏｖｉｎｇ  Ｐｉｃｔｕｒｅ  Ｅｘｐｅｒｔｓ  Ｇｒｏｕｐ）−１、ＭＰＥＧ−２およびＭＰＥＧ−４などの動画処理サブルーチンに対して、動画処理を行う前処理および後処理などである。この場合、出力のための画像フレームバッファの前処理や、画像出力後のフィルタ処理などの後処理が共通となる。【００８１】
近似部融合リストラクチャリング部１５は、このようなプログラム同士の類似性を自動的に抽出する。その際、近似部融合リストラクチャリング部１５は、比較対象の添え字の仮想部同士を比較することにより、ソースコード上において異なる表記が行われていても、演算構造が同じであれば、同一のものとして認識する。【００８２】
また、近似部融合リストラクチャリング部１５は、グループ化された各ブロックのラッピングコード（抽象化ブロック）同士を融合する。その際、近似部融合リストラクチャリング部１５は、ノードの連続関係が等しいノード群を同一のものと見なして１つに融合する。ノードの連続関係が途中まで同じものについては、分岐処理を挿入して、さらなる融合を図る。【００８３】
例えば図１３および図１４に示す例の場合、図１５に示すように、近似部融合リストラクチャリング部１５は、サブルーチンＡのブロック４１とサブルーチンＢのブロック４６をまとめて同族サブルーチン５１とする。そして、近似部融合リストラクチャリング部１５は、分岐処理５２を挿入して、サブルーチンＡが用いられる場合には、ノードＮ４を経由し、サブルーチンＢが用いられる場合には、ノードＮ１５とノードＮ１６を経由するようにする。【００８４】
また、近似部融合リストラクチャリング部１５は、分岐処理５３を挿入して、サブルーチンＡが用いられる場合には、ノードＮ７とそれから分岐するノードＮ８またはノードＮ９を経由し、サブルーチンＢが用いられる場合には、ノードＮ７とノードＮ８を経由するようにする。このようにすることによって、同族サブルーチン５１に対する抽象化コードＡＰＩとして、サブルーチン（ＡＢ群）抽象化コードＡＰＩ５４が得られる。【００８５】
図１６は、近似部融合リストラクチャリング処理の流れを示す図である。図１６に示すように、近似部融合リストラクチャリング部１５により近似部融合リストラクチャリング処理が開始されると、まず、全てのサブルーチンブロックを用意する（ステップＳ１６０１）。ここで、抽象化コード情報２５として得られた融合化ブロックのステートメントノード構成に基づいて、あるサブルーチンブロックＭＴｎの抽象化ブロックに着目し、それに含まれるステートメントノードの集合をＮｎとする。【００８６】
同様に、サブルーチンブロックＭＴｎと比較するためのサブルーチンブロックとして別のサブルーチンブロックＭＴｍの抽象化ブロックに着目し、それに含まれるステートメントノードの集合をＮｎとする。そして、集合Ｎｎと集合Ｎｍの交わりの集合（Ｎｎ∩Ｎｍ）について判断する（ステップＳ１６０２）。集合Ｎｎと集合Ｎｍの交わりの集合が空集合Φでない場合（ステップＳ１６０２：≠Φ）には、スコアｓを１ずつ加算していく（ステップＳ１６０３）。【００８７】
サブルーチンブロックＭＴｎとサブルーチンブロックＭＴｍの組み合わせについて全ての比較が終わると、トータルスコア２９が得られる。ステップＳ１６０２で前記交わりの集合（Ｎｎ∩Ｎｍ）が空集合Φである場合（ステップＳ１６０２：Φ）には、サブルーチンブロックＭＴｎとさらに別のサブルーチンブロックＭＴｍとの間で同様のことを行う。以上の処理を、全てのサブルーチンブロック同士の間で行う。【００８８】
予め、組み込む開発環境への要求に応じて、トータルスコアに対する閾値を設定しておく。そして、トータルスコアが閾値以上となる組み合わせのサブルーチンブロック同士をグループ化して同族サブルーチンとする。経験的には、トータルスコアが１以上、すなわち少なくとも１つの同じ前処理または後処理に相当する代入・演算ノードを有するサブルーチンブロック同士をグループ化することによって、所望の効果が得られることが確認されている。【００８９】
このように、異なるサブルーチンのブロック同士の同一ノードを融合することによって、ソースコード自体の縮小化を図ることができる。また、この近似部融合リストラクチャリング処理によって、近似的なブロックとして分類されたサブルーチンのうち、ハードウェア仕様に依存したサブルーチンを抽出できる。【００９０】
例えば、分類されたサブルーチンがデバイスドライバの場合、デバイスドライバのコードに対して、その前処理および後処理に相当するラッピングコード（抽象化コード）は、さらに上位からラッピングコードをコールするブロックからハードウェアの差異を隠蔽する。つまり、近似部融合リストラクチャリング処理によって融合されたラッピングコードは、一般的なデバイスドライバのラッピングコードと同様の働きをする。【００９１】
実施例によれば、ステートメントの変数の添え字を拡張したことにより、同一部融合リストラクチャリング工程および近似部融合リストラクチャリング工程においてノードの同一性を判定する際に、容易に同一性を判定できるので、コンピュータにより自動的に同一または類似のブロックを抽出することができる。従って、既にあるリソースから再利用可能なモジュールを、開発者の人為的な作業によらずに、コンピュータによって自動的に生成することができる。【００９２】
また、ソースコード２１として複数のソースコードを入力させることができる。この場合には、同一部融合リストラクチャリング工程および近似部融合リストラクチャリング工程において、複数のソースコードにまたがって、ノードの同一性を判定すればよい。複数のソースコードを入力させることによって、複数のコードに共通で用いることができる部品が得られるので、より大きな効果が得られる。【００９３】
図１７は、上述したモジュール生成処理を適用したソフトウェア開発処理の流れを示す図である。図１７に示すように、最終的には、モジュール生成処理（ステップＳ１７０１）により既存リソース６１や他で実績のあるリソース６２からモジュール情報２６や共通部モジュール２７が得られ、これらの情報が既登録部品ツール６３として既存の開発環境に組み込まれる。開発者は、不要なコードを開発することなく、既存コードから機械的に抽出された部品を再利用して、設計支援ツールにより新規・改造開発計画書６４から設計計画書６５を作成し（ステップＳ１７０２）、コーディング処理（ステップＳ１７０３）を行う。【００９４】
そして、デバッグ処理（ステップＳ１７０４）および試験（ステップＳ１７０５）を経て、開発成果物６６が得られる。従って、後工程におけるデバッグ処理や試験に費やす手間と時間を節約することができる。開発成果物６６は、再び、モジュール生成処理の対象となる。このようにすれば、開発者が人為的に行う必要があるのは、コーディング処理のみとなるので、ソフトウェアの開発に要する期間を短縮できる。【００９５】
上述した実施例により得られる効果の程度を調べるため、本発明者らは、監視カメラシステム、テレビ電話システムおよびマルチメディア再生システムの各アプリケーションの開発を行った。まず、監視カメラシステムを従来通りの開発工程に沿って開発した。その際、デバッグ工程および試験工程において、およそ１００行のソースコードに対して１件のバグを検出した。【００９６】
この監視カメラシステムの開発成果物に対して上述したモジュール生成処理によりソースコードの解析を行ったところ、およそ１００種類のブロックが抽出された。抽出されたブロックを用いてテレビ電話システムを開発したところ、およそ６００行のソースコードに対して１件のバグを検出し、監視カメラシステムの開発成果物とテレビ電話システムの開発成果物とでは、約８０％のコードが共通であった。【００９７】
さらに、監視カメラシステムの開発成果物およびテレビ電話システムの開発成果物に対して上述したモジュール生成処理によりソースコードの解析を行い、その解析結果を利用してマルチメディア再生システムを開発したところ、およそ１０００行のソースコードに対して１件のバグを検出した。また、３つのシステムの開発成果物では、約６０％のコードが共通であった。【００９８】
その後、３つのシステムの開発成果物に対して上述したモジュール生成処理によりソースコードの解析を行い、その解析結果を利用してマルチメディア再生システムに対して機能追加された新システムを開発したところ、バグの発生件数は、およそ５０００行のソースコードに対して１件であった。また、この新システムの開発成果物では、約９０％のコードが共通であった。
【産業上の利用可能性】
【００９９】
以上のように、本発明にかかるモジュール生成装置、モジュール生成方法、モジュール生成プログラムおよび該プログラムを記録した記録媒体は、ソフトウェアの開発設計に有用であり、特に、すでに組み込まれたライブラリなどのリンケージ規則を生成する開発支援環境や、フレームワーク、またはｌｉｎｔなどのソースコード検査プログラムなどに組み込んで、既存のリソースを再利用して新規なソフトウェアを開発するのに適している。
【図１】
2008120287.tif 000002
【図２】
2008120287.tif 000003
【図３】
2008120287.tif 000004
【図４】
2008120287.tif 000005
【図５】
2008120287.tif 000006
【図６】
2008120287.tif 000007
【図７】
2008120287.tif 000008
【図８】
2008120287.tif 000009
【図９】
2008120287.tif 000010
【図１０】
2008120287.tif 000011
【図１１】
2008120287.tif 000012
【図１２】
2008120287.tif 000013
【図１３】
2008120287.tif 000014
【図１４】
2008120287.tif 000015
【図１５】
2008120287.tif 000016
【図１６】
2008120287.tif 000017
【図１７】
2008120287.tif 000018
【図１８】
2008120287.tif 000019