(57)【要約】【課題】プログラム断片のインターフェース情報の理解を容易にし、リファクタリング等のプログラム保守を効率的に行えるようにする。【解決手段】プログラムを記憶するプログラム記憶部１１と、プログラムに関し依存関係情報と構文木を生成する構文解析・依存関係情報生成部１２と、依存関係情報を記憶する依存関係情報記憶部１３と、構文木を記憶する構文木記憶部１４と、プログラム断片を指定する指定情報に応じて、そのプログラム断片のインターフェース情報を抽出し、インターフェース情報を選択する選択情報に応じて、そのインターフェース情報に関係するプログラム断片の部分を抽出する依存関係情報追跡部１７と、指定情報および選択情報を依存関係情報追跡部１７に受け渡すと共に依存関係情報追跡部１７から受け渡されたインターフェース情報およびプログラム断片の部分を出力する情報入出力部１５とを備えた。【選択図】        図１
2005018114.tif 000002
【特許請求の範囲】
【請求項１】
プログラムを構成する特定のプログラム断片を指定する指定情報を受け付ける受付手段と、
前記受付手段により受け付けられた前記指定情報で指定される前記プログラム断片の外部とのインターフェースに関するインターフェース情報を抽出する抽出手段と、
前記抽出手段により抽出された前記インターフェース情報を出力する出力手段と
を備えたことを特徴とするプログラム保守支援装置。
【請求項２】
前記抽出手段は、前記インターフェース情報として、前記プログラム断片に対して外部から与えられる値を格納するための入力変数と、前記プログラム断片から外部へ与える値を格納するための出力変数とを抽出することを特徴とする請求項１記載のプログラム保守支援装置。
【請求項３】
前記抽出手段は、前記プログラム断片に含まれる変数のうち、当該変数の値を決定するステートメントが当該プログラム断片に含まれないものを前記入力変数として抽出すると共に、当該変数の値を用いるステートメントが当該プログラム断片に含まれないものを前記出力変数として抽出することを特徴とする請求項２記載のプログラム保守支援装置。
【請求項４】
前記プログラムに含まれるステートメントと変数の間のデータ依存関係情報を生成する依存関係情報生成手段を更に備え、
前記抽出手段は、前記変数の値を決定するステートメントおよび前記変数の値を用いるステートメントを、前記依存関係情報生成手段により生成された前記データ依存関係情報に基づき特定することを特徴とする請求項３記載のプログラム保守支援装置。
【請求項５】
前記出力手段は、前記抽出手段により抽出された前記入力変数と前記出力変数とを区別して出力することを特徴とする請求項２記載のプログラム保守支援装置。
【請求項６】
プログラムを構成するプログラム断片の外部とのインターフェースに関するインターフェース情報のうち、特定のインターフェース情報を選択する選択情報を受け付ける受付手段と、
前記受付手段により受け付けられた前記選択情報で選択される前記インターフェース情報に関係する前記プログラム断片の特定の部分を抽出する抽出手段と、
前記抽出手段により抽出された前記特定の部分を、前記抽出手段により抽出されなかった部分と区別して出力する出力手段と
を備えたことを特徴とするプログラム保守支援装置。
【請求項７】
前記抽出手段は、前記インターフェース情報として、前記プログラム断片から外部へ与える値を格納するための出力変数が選択された場合に、前記プログラム断片に含まれるステートメントのうち、当該出力変数の値の決定に関係するものを、前記特定の部分として抽出することを決定することを特徴とする請求項６記載のプログラム保守支援装置。
【請求項８】
前記プログラムに含まれるステートメントと変数の間のデータ依存関係情報と、前記プログラムに含まれるステートメント間の制御依存関係情報とを生成する依存関係情報生成手段を更に備え、
前記抽出手段は、選択された前記出力変数の値の決定に関係するステートメントを、前記依存関係情報生成手段により生成された前記データ依存関係情報および前記制御依存関係情報に基づき特定することを特徴とする請求項７記載のプログラム保守支援装置。
【請求項９】
前記抽出手段は、前記プログラム断片に含まれるステートメントのうち、前記特定の部分として抽出することを決定したものと、前記特定の部分として抽出することを決定していないものとの間に、データ依存関係または制御依存関係があるかどうかを、前記依存関係情報生成手段により生成された前記データ依存関係情報および前記制御依存関係情報に基づき判定し、データ依存関係も制御依存関係もない場合に、前記特定の部分として抽出することを決定したステートメントを、前記特定の部分として抽出しないことを決定することを特徴とする請求項８記載のプログラム保守支援装置。
【請求項１０】
前記出力手段は、前記抽出手段により抽出された前記特定の部分または前記抽出手段により抽出されなかった部分をメソッドとして切り出し、前記プログラム断片には、当該メソッドを呼び出す命令を記述することを特徴とする請求項６記載のプログラム保守支援装置。
【請求項１１】
前記出力手段は、前記メソッドとして切り出された部分の外部とのインターフェースに関するインターフェース情報を、当該メソッドを呼び出す命令にパラメータとして付加することを特徴とする請求項１０記載のプログラム保守支援装置。
【請求項１２】
前記プログラムを解析して構文木を生成する構文解析手段と、
前記構文解析手段により生成された前記構文木を、前記抽出手段により抽出された前記特定の部分が前記抽出手段により抽出されなかった部分と区別されて出力されるように変更する構文木変更手段と
を更に備えたことを特徴とする請求項６記載のプログラム保守支援装置。
【請求項１３】
プログラムに含まれるステートメントと変数の間のデータ依存関係情報を生成して記憶手段に記憶するステップと、
前記プログラムを構成する特定のプログラム断片を指定する指定情報を受け付けるステップと、
前記記憶手段に記憶された前記データ依存関係情報に基づいて、受け付けられた前記指定情報で指定される前記プログラム断片の外部とのインターフェースに関するインターフェース情報を抽出するステップと、
抽出された前記インターフェース情報を出力するステップと
を含むことを特徴とするプログラム保守支援方法。
【請求項１４】
前記インターフェース情報を抽出するステップでは、前記インターフェース情報として、前記プログラム断片に対して外部から与えられる値を格納するための入力変数と、前記プログラム断片から外部へ与える値を格納するための出力変数とを抽出することを特徴とする請求項１３記載のプログラム保守支援方法。
【請求項１５】
前記インターフェース情報を抽出するステップは、
前記プログラム断片に含まれる変数の値を決定するステートメントからなる第１のステートメント集合を特定するステップと、
特定された前記第１のステートメント集合に含まれる各ステートメントが前記プログラム断片に含まれるかどうかを判定するステップと、
前記第１のステートメント集合に含まれるいずれかのステートメントが前記プログラム断片に含まれないと判定された場合に前記変数を前記入力変数として抽出するステップと、
前記プログラム断片に含まれる変数の値を用いるステートメントからなる第２のステートメント集合を特定するステップと、
特定された前記第２のステートメント集合に含まれる各ステートメントが前記プログラム断片に含まれるかどうかを判定するステップと、
前記第２のステートメント集合に含まれるいずれかのステートメントが前記プログラム断片に含まれないと判定された場合に前記変数を前記出力変数として抽出するステップと
を含むことを特徴とする請求項１４記載のプログラム保守支援方法。
【請求項１６】
前記インターフェース情報を抽出するステップは、前記プログラムに含まれるステートメントの情報に、当該ステートメントが前記プログラム断片に含まれるかどうかを示す範囲内フラグを付加して前記記憶手段に記憶するステップを更に含み、
前記第１のステートメントについての前記判定するステップ、および、前記第２のステートメントについての前記判定するステップにおいて、
与えられたステートメントが前記プログラム断片に含まれるかどうかを、当該ステートメントの情報に付加された前記範囲内フラグにより判定することを特徴とする請求項１５記載のプログラム保守支援方法。
【請求項１７】
前記出力するステップでは、抽出された前記入力変数と前記出力変数とを区別して出力することを特徴とする請求項１４記載のプログラム保守支援方法。
【請求項１８】
前記プログラムに含まれるステートメント間の制御依存関係情報を生成して前記記憶手段に記憶するステップと、
出力された前記インターフェース情報のうち、特定のインターフェース情報を選択する選択情報を受け付けるステップと、
前記記憶手段に記憶された前記データ依存関係情報および前記制御依存関係情報に基づいて、受け付けられた前記選択情報で選択される前記インターフェース情報に関係する前記プログラム断片の特定の部分を抽出するステップと、
抽出された前記特定の部分を、抽出されなかった部分と区別して出力するステップと
を更に含むことを特徴とする請求項１３記載のプログラム保守支援方法。
【請求項１９】
前記インターフェース情報として、前記プログラム断片から外部へ与える値を格納するための出力変数が選択された場合において、
前記特定の部分を抽出するステップは、
選択された前記出力変数の値の決定に関係するステートメントを特定するステップと、
特定された前記ステートメントが前記プログラム断片に含まれるかどうかを判定するステップと、
前記ステートメントが前記プログラム断片に含まれると判定された場合に当該ステートメントを抽出対象として決定するステップと
を含むことを特徴とする請求項１８記載のプログラム保守支援方法。
【請求項２０】
前記特定の部分を抽出するステップは、
前記プログラムに含まれるステートメントの情報に、当該ステートメントが抽出対象として決定されたかどうかを示す関係フラグを付加して前記記憶手段に記憶するステップと、
抽出対象として決定されていないことを示す前記関係フラグが付加されたステートメントを選択するステップと、
前記記憶手段に記憶された前記データ依存関係情報および前記制御依存関係情報に基づいて、選択された前記ステートメントで参照する変数の値の決定、または、当該ステートメントの実行の決定に関係するステートメントを特定するステップと、
特定された前記ステートメントが前記プログラム断片に含まれるかを判定するステップと、
特定された前記ステートメントの情報に、抽出対象として決定されたことを示す関係フラグが付加されているかを判定するステップと、
特定された前記ステートメントが前記プログラム断片に含まれ、かつ、その情報に抽出対象として決定されたことを示す前記関係フラグが付加されている場合に、抽出対象として決定された前記ステートメントを抽出しないことを決定するステップと
を更に含むことを特徴とする請求項１９記載のプログラム保守支援方法。
【請求項２１】
コンピュータに、
プログラムに含まれるステートメントと変数の間のデータ依存関係情報を生成して記憶手段に記憶する機能と、
前記プログラムを構成する特定のプログラム断片を指定する指定情報を受け付ける機能と、
前記記憶手段に記憶された前記データ依存関係情報に基づいて、受け付けられた前記指定情報で指定される前記プログラム断片の外部とのインターフェースに関するインターフェース情報を抽出する機能と、
抽出された前記インターフェース情報を出力する機能と
を実現させるためのプログラム。
【請求項２２】
コンピュータに、
前記プログラムに含まれるステートメント間の制御依存関係情報を生成して前記記憶手段に記憶する機能と、
出力された前記インターフェース情報のうち、特定のインターフェース情報を選択する選択情報を受け付ける機能と、
前記記憶手段に記憶された前記データ依存関係情報および前記制御依存関係情報に基づいて、受け付けられた前記選択情報で選択される前記インターフェース情報に関係する前記プログラム断片の特定の部分を抽出する機能と、
抽出された前記特定の部分を、抽出されなかった部分と区別して出力する機能と
を更に実現させるための請求項２１記載のプログラム。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、プログラムを構成する特定の部分（以下、「プログラム断片」という）の外部とのインターフェースに関する情報（以下、「インターフェース情報」という）を抽出等することによりプログラムのリファクタリングを始めとした保守を支援するプログラム保守支援装置等に関する。
【０００２】
【従来の技術】
近年、特にオブジェクト指向言語において、リファクタリング（Ｒｅｆａｃｔｏｒｉｎｇ）が注目されている（例えば、非特許文献１参照。）。なお、リファクタリングとは、「ソフトウェアの外部的振る舞いを保ったままで、内部の構造を改善していく作業」と定義することができる。リファクタリングは、オブジェクト指向言語に限らず、ＣやＣＯＢＯＬ等の手続き的言語などにも適用される概念である。
【０００３】
現在、ＪＡＶＡ等に対して、クラスやメソッドの名前を変えるという程度のリファクタリングは、ＷｅｂＳｐｈｅｒｅ  Ｓｔｕｄｉｏなどの開発環境による自動化がサポートされているが、その他のリファクタリングは自動化されているものは少ない。手作業で行われているのが現状である（ＪＡＶＡは、Ｓｕｎ  Ｍｉｃｒｏｓｙｓｔｅｍｓ，  Ｉｎｃ．の米国およびその他の国における商標または登録商標。ＷｅｂＳｐｈｅｒｅは、ＩＢＭ  Ｃｏｒｐｏｒａｔｉｏｎの米国およびその他の国における商標。）。
【０００４】
また、プログラム解析の基礎技術としては、プログラムスライシングがある（例えば、非特許文献２、３参照。）。プログラムスライシングは、データ依存関係（プログラム中のある変数からその変数の値を決定しているステートメントへの依存関係）と、制御依存関係（プログラム中のあるステートメントからそのステートメントが実行されるか否かを決定するステートメントへの依存関係）とをプログラム解析に利用することを提案する。
【０００５】
【非特許文献１】
マーチン・ファウラー著、児玉公信他訳「リファクタリング・プログラムの体質改善テクニック」（Ｍａｒｔｉｎ  Ｆｌｏｗｅｒ，  ”Ｒｅｆａｃｔｏｒｉｎｇ：  Ｉｍｐｒｏｖｉｎｇ  ｔｈｅ  ｄｅｓｉｇｎ  ｏｆ  ｅｘｉｓｔｉｎｇ  ｃｏｄｅ”，  Ａｄｄｉｓｏｎ  Ｗｅｓｌｅｙ  Ｌｏｎｇｍａｎ，  Ｉｎｃ，  １９９９．）、ｐ．１１０−１１６
【非特許文献２】
Ｗｅｉｓｅｒ，  Ｍ．著、“Ｐｒｏｇｒａｍ  Ｓｌｉｃｉｎｇ，  ＩＥＥＥ  Ｔｒａｎｓａｃｔｉｏｎｓ  ｏｎ  Ｓｏｆｔｗａｒｅ  Ｅｎｇｉｎｅｅｒｉｎｇ，  Ｖｏｌ．ＳＥ−１０，  Ｎｏ．４”、１９８４年、ｐ．３５２−３５７
【非特許文献３】
下村隆夫著、「Ｐｒｏｇｒａｍ  Ｓｌｉｃｉｎｇ技術とテスト，デバッグ，保守への応用，情報処理，Ｖｏｌ．３３，  Ｎｏ．  ９」、１９９３年、ｐ．１０７８−１０８６
【０００６】
【発明が解決しようとする課題】
ところで、リファクタリングを行うためには、ソースコードを読んでその処理内容を理解しなければならない。特に、プログラム断片の外部とのインターフェースに関するインターフェース情報、例えば、そのプログラム断片に対して外部からどのような入力があり、そのプログラム断片から外部へどのような出力があるかを理解することが必要となる場面が多い。むしろ、そのようなプログラムだからこそリファクタリングが必要になっているのである。
【０００７】
例えば、それが顕著なのは、「メソッド抽出」リファクタリングである。「メソッド」とは、プログラムを構成する特定の意味のある単位であり、「サブルーチン」とも呼ばれる。「メソッド抽出」リファクタリングは、プログラムからこのようなメソッドを切り出すことにより、プログラム内部の構造を改善していくことである。
勿論、プログラム断片のインターフェース情報の理解が必要となる場面は、「メソッド抽出」リファクタリングに限ったことではなく、また、リファクタリングに限らず、プログラム断片の理解はプログラムの保守、再構築、デバッグに必須の事項である。
【０００８】
しかしながら、非特許文献１には、プログラム断片のインターフェース情報の理解の手助けをすることにより、リファクタリングを支援することについては言及されていない。
また、非特許文献２、３のプログラムスライシングが提供するのは、データ依存関係および制御依存関係に基づいてプログラムを解析すべきという点までであり、データ依存関係および制御依存関係に基づいてリファクタリング等におけるプログラム断片のインターフェース情報の解析を行うことは想定されていない。
【０００９】
従って、いずれの従来技術においても、プログラム断片のインターフェース情報の理解が容易ではなく、リファクタリング等のプログラム保守を効率的に行えないという問題点があった。
【００１０】
本発明は、以上のような技術的課題を解決するためになされたものであって、その目的は、プログラム断片のインターフェース情報の理解を容易に行えるようにすることにある。
また他の目的は、リファクタリング等のプログラム保守を効率的に行えるようにすることにある。
【００１１】
【課題を解決するための手段】
かかる目的のもと、本発明は、プログラムのソースコード上で指定されたプログラム断片のインターフェース情報を抽出するようにしている。即ち、本発明のプログラム保守支援装置は、プログラムを構成する特定のプログラム断片を指定する指定情報を受け付ける受付手段（情報入出力部１５の指定情報を受け付ける機能に対応）と、この受付手段により受け付けられた指定情報で指定されるプログラム断片の外部とのインターフェースに関するインターフェース情報を抽出する抽出手段（依存関係情報追跡部１７に対応）と、この抽出手段により抽出されたインターフェース情報を出力する出力手段（情報入出力部１５のインターフェース情報を出力する機能に対応）とを備えている。
ここで、抽出手段は、インターフェース情報として、プログラム断片に対して外部から与えられる値を格納するための入力変数と、プログラム断片から外部へ与える値を格納するための出力変数とを抽出するようにしてもよい。
また、抽出手段は、プログラム断片に含まれる変数のうち、その変数の値を決定するステートメントがそのプログラム断片に含まれないものを入力変数として抽出すると共に、その変数の値を用いるステートメントがそのプログラム断片に含まれないものを出力変数として抽出するようにしてもよい。
また、プログラムに含まれるステートメントと変数の間のデータ依存関係情報を生成する依存関係情報生成手段（構文解析・依存関係情報生成部１２の依存関係情報を生成する機能に対応）を更に備え、抽出手段は、変数の値を決定するステートメントおよび変数の値を用いるステートメントを、依存関係情報生成手段により生成されたデータ依存関係情報に基づき特定するようにしてもよい。
更に、出力手段は、抽出手段により抽出された入力変数と出力変数とを区別して出力するようにしてもよい。
【００１２】
他の観点から捉えると、本発明は、プログラム断片のインターフェース情報の中から特定のインターフェース情報を選択することにより、プログラム断片からその選択されたインターフェース情報に関係する部分のみを抽出するようにしている。即ち、本発明のプログラム保守支援装置は、プログラムを構成するプログラム断片の外部とのインターフェースに関するインターフェース情報のうち、特定のインターフェース情報を選択する選択情報を受け付ける受付手段（情報入出力部１５の選択情報を受け付ける機能に対応）と、この受付手段により受け付けられた選択情報で選択されるインターフェース情報に関係するプログラム断片の特定の部分を抽出する抽出手段（依存関係情報追跡部１７に対応）と、この抽出手段により抽出された特定の部分を、抽出手段により抽出されなかった部分と区別して出力する出力手段（情報入出力部１５の抽出メソッドを出力する機能に対応）とを備えている。
ここで、抽出手段は、インターフェース情報として、プログラム断片から外部へ与える値を格納するための出力変数が選択された場合に、プログラム断片に含まれるステートメントのうち、その出力変数の値の決定に関係するものを、特定の部分として抽出することを決定するようにしてもよい。
また、プログラムに含まれるステートメントと変数の間のデータ依存関係情報と、プログラムに含まれるステートメント間の制御依存関係情報とを生成する依存関係情報生成手段（構文解析・依存関係情報生成部１２の依存関係情報を生成する機能に対応）を更に備え、抽出手段は、選択された出力変数の値の決定に関係するステートメントを、依存関係情報生成手段により生成されたデータ依存関係情報および制御依存関係情報に基づき特定するようにしてもよい。
また、抽出手段は、プログラム断片に含まれるステートメントのうち、特定の部分として抽出することを決定したものと、特定の部分として抽出することを決定していないものとの間に、データ依存関係または制御依存関係があるかどうかを、依存関係情報生成手段により生成されたデータ依存関係情報および制御依存関係情報に基づき判定し、データ依存関係も制御依存関係もない場合に、特定の部分として抽出することを決定したステートメントを、特定の部分として抽出しないことを決定するようにしてもよい。
更に、出力手段は、抽出手段により抽出された特定の部分または抽出手段により抽出されなかった部分をメソッドとして切り出し、プログラム断片には、そのメソッドを呼び出す命令を記述するようにしてもよい。
更にまた、出力手段は、メソッドとして切り出された部分の外部とのインターフェースに関するインターフェース情報を、そのメソッドを呼び出す命令にパラメータとして付加するようにしてもよい。
また、プログラムを解析して構文木を生成する構文解析手段（構文解析・依存関係情報生成部１２の構文解析を行う機能に対応）と、構文解析手段により生成された構文木を、抽出手段により抽出された特定の部分が抽出手段により抽出されなかった部分と区別されて出力されるように変更する構文木変更手段（構文木変更部１８に対応）とを更に備えるようにしてもよい。
【００１３】
一方、本発明は、プログラム保守支援方法であって、プログラムに含まれるステートメントと変数の間のデータ依存関係情報を生成して記憶手段に記憶するステップ（ステップ１０１に対応）と、プログラムを構成する特定のプログラム断片を指定する指定情報を受け付けるステップ（ステップ１０２に対応）と、記憶手段に記憶されたデータ依存関係情報に基づいて、受け付けられた指定情報で指定されるプログラム断片の外部とのインターフェースに関するインターフェース情報を抽出するステップ（ステップ１０３に対応）と、抽出されたインターフェース情報を出力するステップ（ステップ１０４に対応）とを含んでいる。
また、プログラムに含まれるステートメント間の制御依存関係情報を生成して記憶手段に記憶するステップ（ステップ２０１に対応）と、出力されたインターフェース情報のうち、特定のインターフェース情報を選択する選択情報を受け付けるステップ（ステップ２０８に対応）と、記憶手段に記憶されたデータ依存関係情報および制御依存関係情報に基づいて、受け付けられた選択情報で選択されるインターフェース情報に関係するプログラム断片の特定の部分を抽出するステップ（ステップ２０９〜２１１により抽出対象部分を決定することに対応）と、抽出された特定の部分を、抽出されなかった部分と区別して出力するステップ（ステップ２１２に対応）とを更に含んでもよい。
【００１４】
更に、本発明は、コンピュータに所定の機能を実現させるプログラムとして把握することができる。即ち、本発明のプログラムは、コンピュータに、プログラムに含まれるステートメントと変数の間のデータ依存関係情報を生成して記憶手段に記憶する機能（構文解析・依存関係情報生成部１２の依存関係情報を生成する機能に対応）と、プログラムを構成する特定のプログラム断片を指定する指定情報を受け付ける機能（情報入出力部１５の指定情報を受け付ける機能に対応）と、記憶手段に記憶されたデータ依存関係情報に基づいて、受け付けられた指定情報で指定されるプログラム断片の外部とのインターフェースに関するインターフェース情報を抽出する機能（依存関係情報追跡部１７に対応）と、抽出されたインターフェース情報を出力する機能（情報入出力部１５のインターフェース情報を出力する機能に対応）とを実現させるものである。
また、コンピュータに、プログラムに含まれるステートメント間の制御依存関係情報を生成して記憶手段に記憶する機能（構文解析・依存関係情報生成部１２の依存関係情報を生成する機能に対応）と、出力されたインターフェース情報のうち、特定のインターフェース情報を選択する選択情報を受け付ける機能（情報入出力部１５の選択情報を受け付ける機能に対応）と、記憶手段に記憶されたデータ依存関係情報および制御依存関係情報に基づいて、受け付けられた選択情報で選択されるインターフェース情報に関係するプログラム断片の特定の部分を抽出する機能（依存関係情報追跡部１７に対応）と、抽出された特定の部分を、抽出されなかった部分と区別して出力する機能（情報入出力部１５の抽出メソッドを出力する機能に対応）とを更に実現させるものであってもよい。
【００１５】
【発明の実施の形態】
以下、添付図面に示す実施の形態に基づいて本発明を詳細に説明する。
【００１６】
（第１の実施の形態）
第１の実施の形態は、プログラム断片のインターフェース情報の抽出および表示の方法に関するものである。
図１は、第１の実施の形態の全体構成を示すブロック図である。図１に示すように、本実施の形態は、プログラム記憶部１１と、構文解析・依存関係情報生成部１２と、依存関係情報記憶部１３と、構文木記憶部１４と、情報入出力部１５と、入出力装置１６と、依存関係情報追跡部１７とを含む。
【００１７】
プログラム記憶部１１は、プログラムのソースコードを記憶する部分である。構文解析・依存関係情報生成部１２は、プログラム記憶部１１に記憶されたプログラムのソースコードを読み込んで解析し、プログラム依存関係グラフ（Ｐｒｏｇｒａｍ  Ｄｅｐｅｎｄｅｎｃｅ  Ｇｒａｐｈ；以下、「ＰＤＧ」という）と構文木とを内部的に生成する部分である。ＰＤＧは、プログラムのステートメント間の制御依存関係と、ステートメント・変数間のデータ依存関係とを表現したグラフである。構文木は、言語コンパイラでも内部的に生成されるプログラムの詳細な構造を表現したものである。
依存関係情報記憶部１３は、構文解析・依存関係情報生成部１２により生成されたＰＤＧを記憶する部分である。また、構文木記憶部１４は、構文解析・依存関係情報生成部１２により生成された構文木を記憶する部分である。
情報入出力部１５は、構文木記憶部１４に記憶された構文木からソースコードを再生して入出力装置１６に出力し、また、ユーザによるプログラム断片の開始ステートメントおよび終了ステートメントの指定に応じてその指定を依存関係情報追跡部１７に受け渡し、更に、依存関係情報追跡部１７から受け取ったインターフェース情報を入出力装置１６に出力する部分である。
入出力装置１６は、入力装置と出力装置とからなる。入力装置としては、キーボードや、マウス等のポインティングデバイスがあり、出力装置としては、ＣＲＴディスプレイ、液晶ディスプレイ等の表示装置がある。
依存関係情報追跡部１７は、情報入出力部１５から渡されたプログラム断片のインターフェース情報を、依存関係情報記憶部１３に記憶された依存関係情報を追跡することにより生成し、その結果を情報入出力部１５に送り返す部分である。
【００１８】
なお、本実施の形態は、コンピュータシステムにより実現される。本実施の形態を実現するコンピュータシステムのハードウェア構成は、中央処理装置（ＣＰＵ）、主記憶装置、ハードディスク装置等の補助記憶装置、入力装置、出力装置を備えた一般的なものでよい。
補助記憶装置には、構文解析・依存関係情報生成部１２、情報入出力部１５、依存関係情報追跡部１７を実現するためのプログラムが記憶され、ＣＰＵがこのプログラムを主記憶装置に読み込んで実行することにより、構文解析・依存関係情報生成部１２、情報入出力部１５、依存関係情報追跡部１７が実現される。また、補助記憶装置は、プログラム記憶部１１、依存関係情報記憶部１３、構文木記憶部１４としても機能する。
【００１９】
次に、本実施の形態の動作について詳細に説明する。
本実施の形態では、図２に示すようなプログラムのソースコードが与えられたものとして説明を進める。ここでは、プログラムのソースコードは、Ａｄａ風の表記により示す。また、プログラム断片のインターフェース情報としては、プログラム断片に対して外部から与えられる値を格納する変数である入力変数と、プログラム断片から外部へ与える値を格納する変数である出力変数とを例にとって説明する。
【００２０】
図３は、本実施の形態の動作の概略を示すフローチャートである。
まず、構文解析・依存関係情報生成部１２は、プログラム記憶部１１に記憶されたプログラムのソースコードを読み込み、ＰＤＧを生成する（ステップ１０１）。ＰＤＧは、依存関係情報記憶部１３に記憶される。
【００２１】
ＰＤＧが生成された後、情報入出力部１５によりソースコードが表示され、ユーザによりプログラム断片の範囲が指定される（ステップ１０２）。この指定は、例えば、ユーザがそのインターフェース情報を知りたいと思うプログラム断片の開始ステートメントおよび終了ステートメントをマウス等で指定するという操作で行われる。なお、この時、プログラムの構文上、メソッドに切れないような指定（例えば、ｉｆ−ｔｈｅｎ−ｅｌｓｅ構造の途中のステートメントを最初または最後のステートメントとする指定等）をユーザが行うことが考えられるが、そのような場合は、ユーザにその旨を表示して指定の変更を促すべきである。しかし、その範囲指定の適切さの検証は、既存技術を用いて構文木を分析することにより可能であり、また、本発明の範囲ではないので、ここではユーザは構文上適切な範囲指定をすることを前提とする。
【００２２】
次に、依存関係情報追跡部１７は、依存関係情報記憶部１３に記憶されたＰＤＧを追跡し、指定されたプログラム断片のインターフェース情報を抽出する（ステップ１０３）。例えば、図２のソースコードにおいて、破線で囲まれた範囲がプログラム断片として指定されたとする。ここで指定されたプログラム断片において、入力変数は、“ｎ１”、“ｎ２”、“ｙｙｙ”であり、出力変数は、“ｍａｘ”、“ｍｉｎ”、“ｘｘｘ”である。依存関係情報追跡部１７は、インターフェース情報として、これらの入力変数および出力変数を抽出する。なお、変数“ｔｔｔ”に関しては、指定されたプログラム断片よりも上で値が代入されていないので、入力変数として抽出されることはなく、指定されたプログラム断片よりも下で値が参照されていないので、出力変数として抽出されることもない。
【００２３】
インターフェース情報が抽出されると、情報入出力部１５が、それを依存関係情報追跡部１７から受け取り、入出力装置１６に表示する（ステップ１０４）。図２のソースコードにおいて、破線で囲まれた範囲がプログラム断片として指定されたとすると、このプログラム断片のインターフェース情報は、例えば、図４に示すように表示される。
【００２４】
ここで、図３のステップ１０１におけるＰＤＧの生成処理について、図５を参照しながら詳細に説明する。
まず、構文解析・依存関係情報生成部１２は、プログラム記憶部１１に記憶されているプログラムのソースコードを読み込み（ステップ１１１）、構文解析を行って内部的に構文木を生成し（ステップ１１２）、構文木に基づきステートメント間の制御の流れを示すコントロールフローグラフ（Ｃｏｎｔｒｏｌ  Ｆｌｏｗ  Ｇｒａｐｈ；以下、「ＣＦＧ」という）を生成する（ステップ１１３）。なお、ＣＦＧは、主にＰＤＧ生成の際のデータ依存関係の分析を高速に行うために生成されるものである。
また、構文解析・依存関係情報生成部１２は、プログラムのソースコードに対し、データ／制御依存関係を解析し、ＰＤＧを生成する（ステップ１１４）。
【００２５】
図６に、ＰＤＧを模式的に示している。図６では、各ステートメントを横長の楕円形で表現し、対応するステートメントの並び順に配列すると共に、ステートメントＩＤ（ステートメントの番号）を楕円形内に記述している。また、変数については、略円形で表現し、その変数の値が参照されるステートメントの楕円形内に配置すると共に、変数名を略円形内に記述している。なお、図６のようなＰＤＧの模式図を参照する場合には、ステートメントを表す楕円形を「ノード」と呼ぶことがある。
図６には、更に、データ／制御依存関係が示されている。ここで、データ依存関係とは、ある変数と、その変数の値を決定しているステートメントとの間の依存関係であり、変数とステートメントの間の関係である。図６では、これを、ステートメントを表すノードから変数へ向かう太い実線の矢印で示している。また、制御依存関係とは、あるステートメント（文）と、そのステートメントが実行されるか否かを決定するステートメント（条件文）との間の依存関係であり、ステートメント間の関係である。図６では、これを、条件文のステートメントを表すノードからその条件文により実行されるか否かが決定されるステートメントを表すノードへ向かう細い実線の矢印で示している。
【００２６】
また、図２において破線で示したプログラム断片の範囲は、図６においても破線で示している。この範囲の外側から内側へ入ってくる矢印で示される変数が入力変数に相当し、内側から外側へ出て行く矢印で示される変数が出力変数に相当する。“ｎ１”、“ｎ２”、“ｙｙｙ”は、範囲の外から入ってくる矢印で指されるので、入力変数であり、“ｍａｘ”、“ｍｉｎ”、“ｘｘｘ”は、範囲の外へ出て行く矢印で指されるので、出力変数である。また、“ｔｔｔ”は、範囲の外から入ってくる矢印でも範囲の外へ出て行く矢印でも指されていない。即ち、“ｔｔｔ”については、矢印がプログラム断片内に閉じているので、入力変数、出力変数として抽出されない。
【００２７】
なお、この例では、制御依存関係として、ｉｆ−ｔｈｅｎ−ｅｌｓｅに関するもののみを挙げているが、ループの場合は、ループ構造中のステートメントと、ループの条件部との間に制御依存関係が張られる。制御依存関係とは、あるステートメントからそのステートメントが実行されるか否かを決める条件への依存だからである。ループ構造は、条件ステートメントとバックワードのブランチの組み合わせと見なすことができる。
【００２８】
次に、図６に示したＰＤＧのコンピュータ内部における管理方法の一例について詳細に説明する。
図６に示したＰＤＧ中のステートメントおよび変数は、例えば、図７に示すようなデータ構造を有するデータにより管理される。
【００２９】
図７（Ａ）に示すように、ステートメントを表すデータ構造は、ステートメントＩＤと、制御依存順ポインタリストと、制御依存逆ポインタと、データ依存順ポインタリストと、変数リストと、範囲内フラグとをそれぞれ格納するためのフィールドを備える。
【００３０】
ステートメントＩＤは、ステートメントを一意に識別するために付与される番号である。なお、ステートメントＩＤが「ｎ」のステートメントを、以下では、「ステートメントｎ」と呼ぶことにする。
制御依存順ポインタリスト用のフィールドには、図６のＰＤＧで、このステートメントのノードから出て行く制御依存関係を示す矢印がある場合に、線形リストへのポインタが格納され、その線形リストには、その矢印の先にあるステートメントを表すデータ構造へのポインタが格納される。一方、図６のＰＤＧで、そのような制御依存関係を示す矢印がない場合は、「ＮＵＬＬ」が格納される。
【００３１】
制御依存逆ポインタ用のフィールドには、図６のＰＤＧで、このステートメントのノードへ入って来る制御依存関係を示す矢印がある場合に、その矢印の元にあるステートメントを表すデータ構造へのポインタが格納される。一方、図６のＰＤＧで、そのような制御依存関係を示す矢印がない場合は、「ＮＵＬＬ」が格納される。
【００３２】
データ依存順ポインタリスト用のフィールドには、図６のＰＤＧで、このステートメントから出て行くデータ依存関係を示す矢印がある場合に、線形リストへのポインタが格納され、その線形リストには、その矢印の先にある変数を表すデータ構造へのポインタが格納される。一方、図６のＰＤＧで、そのようなデータ依存関係を示す矢印がない場合は、「ＮＵＬＬ」が格納される。
【００３３】
変数リスト用のフィールドには、線形リストへのポインタが格納され、その線形リストには、このステートメントに現れる変数を表すデータ構造へのポインタが格納される。
範囲内フラグは、このステートメントが指定された範囲の内部にあるかどうかを示すフラグである。範囲内フラグには、例えば、初期値として「０」を設定し、ステートメントが指定された範囲の内部にあれば「１」を設定するようにする。但し、ステートメントが範囲内であるかどうかの印を付することができれば、その他のいかなる手法を用いてもよい。
【００３４】
また、図７（Ｂ）に示すように、変数を表すデータ構造は、変数ＩＤと、ステートメントへのポインタと、データ依存逆ポインタリストとをそれぞれ格納するためのフィールドを備える。
【００３５】
変数ＩＤは、変数を一意に識別するために付与される番号である。
ステートメントへのポインタ用のフィールドには、その変数が現れるステートメントを表すデータ構造へのポインタが格納される。
データ依存逆ポインタリスト用のフィールドには、図６のＰＤＧで、この変数へ入って来るデータ依存関係を示す矢印がある場合に、線形リストへのポインタが格納され、その線形リストには、その矢印の元にあるステートメントを表すデータ構造へのポインタが格納される。一方、図６のＰＤＧで、そのようなデータ依存関係を示す矢印がない場合は、「ＮＵＬＬ」が格納される。
【００３６】
このように、本実施の形態では、データ依存関係、制御依存関係のいずれについても、順ポインタ、逆ポインタという双方向のポインタを張っている。その方が、その後のアルゴリズムを高速にできるからである。
【００３７】
次に、図６に示すＰＤＧが、図７に示すデータ構造を有するデータによって、具体的にどのように管理されるかを、図８、９を参照しながら説明する。図８では、ステートメントを表すデータ構造を中心に図示し、図９では、変数を表すデータ構造を中心に図示している。
【００３８】
図８では、６つのフィールドからなるデータ構造が、ステートメントを表すデータ構造であり、フィールドの並び順は、図７（Ａ）に示したものと対応している。また、図９では、３つのフィールドからなるデータ構造が、変数を表すデータ構造であり、フィールドの並び順は、図７（Ｂ）に示したものと対応している。
【００３９】
なお、ポインタについては、作図上可能であれば、ポインタの指し示す先のデータ構造へ向かう矢印により示しているが、そのような作図が困難な場合は、記号により示している。「ｐｓｎ」とあるのは、ステートメントを表すデータ構造へのポインタであり、「ｎ」がステートメントＩＤを示す。例えば、図９の「１（ａａａ）」のデータ構造に接続する線形リストに格納された「ｐｓ２」は、図８のステートメント２のデータ構造へのポインタを示している。また、「ｐｖｎ」とあるのは、変数を表すデータ構造へのポインタであり、「ｎ」がそのデータ構造のアドレスを示す。なお、アドレス「ｎ」は、図９において、＜ｎ＞のように示している。例えば、図８のステートメント２のデータ構造に接続する線形リストに格納された「ｐｖ１」は、図９の変数「１（ａａａ）」のデータ構造へのポインタを示している。
【００４０】
また、図８において、制御依存順ポインタリストおよび制御依存逆ポインタは、本実施の形態に関係するもの以外は「ＮＵＬＬ」としている。図２に示すソースコードがより大きなプログラムのソースコードの一部であれば、そのプログラム全体を解析することにより、制御依存順ポインタリストおよび制御依存逆ポインタが埋まることになるが、本実施の形態では、説明を単純化するために、「ＮＵＬＬ」としている。
更に、図８においては、変数リストとして、そのステートメントで値が参照される変数のみのリストを表記している。実際には、そのステートメントで値が代入される変数も表記すべきであるが、そのような変数は本実施の形態における処理の対象とはならないため、表記を省略してある。
【００４１】
また、図９において、変数ＩＤについては、「１（ａａａ）」のように示しているが、変数ＩＤは、括弧外の数字部分であり、括弧内はその変数ＩＤに対応する変数名（文字列）を便宜的に示したものである。通常、コンピュータ内部では、変数を識別番号で管理し、その識別番号と変数名の文字列との対応表を別に持っているからである。
【００４２】
次に、ステートメント、変数、およびこれらの依存関係が、図８、９のように管理されていることを前提として、図３のステップ１０３におけるインターフェース情報の抽出処理について、図１０を参照しながら詳細に説明する。
【００４３】
まず、依存関係情報追跡部１７は、指定されたプログラム断片の範囲内にあるステートメントのノードをリストする（ステップ１２１）。例えば、プログラム断片の範囲内の各ノードについて、そのノードを表すデータ構造へのポインタを格納するためのフィールドと、次のリスト要素へのポインタを格納するためのフィールドとからなるリスト要素を用意し、これらのリスト要素をつないだ線形リストを作成する。図２に示すプログラム断片が指定された場合は、ステートメント４、５、６、７、８、９、１１を表すデータ構造へのポインタが格納された線形リストが作成される。また、同時に、依存関係情報追跡部１７は、指定されたプログラム断片に含まれるステートメントを表すデータ構造の範囲内フラグに、そのステートメントがプログラム断片の範囲内にあることを示す情報を設定する。この場合、ステートメントを表すデータ構造に格納されるデータの内容は、図１１に示すようになる。即ち、ステートメント４、５、６、７、８、９、１１に対する範囲内フラグが「１」となっている。
また、依存関係情報追跡部１７は、着目すべきノードを指すポインタを、線形リストの１つ目のノードを指すように設定する。
【００４４】
依存関係情報追跡部１７は、着目するノードに対応するリスト要素における次ノードへのポインタが「ＮＵＬＬ」であるかどうかを判断する（ステップ１２２）。次ノードへのポインタが「ＮＵＬＬ」であれば、処理は図３に戻るが、「ＮＵＬＬ」でなければ、そのノードに関して入力／出力変数リストに変数名を追加する（ステップ１２３）。そして、次ノードへのポインタを辿って、着目すべきノードを指すポインタを次ノードに移動させ（ステップ１２４）、ステップ１２２へ戻る。そして、次ノードへのポインタが「ＮＵＬＬ」になるまでステップ１２３、１２４の処理を繰り返し、次ノードへのポインタが「ＮＵＬＬ」となった場合に図３に戻る。
【００４５】
次に、図１０のステップ１２３における入力／出力変数の抽出処理にについて、図１２を参照しながら詳細に説明する。
依存関係情報追跡部１７は、着目するノードに入って来るデータ依存関係を逆方向に辿りノードＮｂを探す（ステップ１３１）。ここで、Ｎｂが存在し、且つ、プログラム断片の範囲外かどうかを判断し（ステップ１３２）、そうであれば、入力変数リストにその依存関係に係る変数名を追加し（ステップ１３３）、ステップ１３４に進む。一方、そうでなければ、そのままステップ１３４に進む。
【００４６】
また、依存関係情報追跡部１７は、着目するノードから出て行くデータ依存関係を順方向に辿りノードＮｆを探す（ステップ１３４）。ここで、Ｎｆが存在し、且つ、プログラム断片の範囲外かどうかを判断し（ステップ１３５）、そうであれば、出力変数リストにその依存関係に係る変数名を追加し（ステップ１３６）、図１０に戻る。一方、そうでなければ、そのまま図１０に戻る。
【００４７】
ここで、以上の処理を具体的に説明する。ここでは、図２に示すプログラム断片が指定され、ステートメント４、５、６、７、８、９、１１がこの順でリストされているとする。
まず、ステートメント４に着目して、図１２の処理を行う。即ち、ステートメント４のデータ構造において、変数リストを参照し、アドレス「ｐｖ２」から変数“ｎ１”に対するデータ構造を取得する。このデータ構造において、データ依存逆ポインタリストを参照し、ノードＮｂとしてステートメント１を発見する。そこで、ステートメント１のデータ構造において、範囲内フラグを参照すると、「０」なので、ステップ１３２での判断は「ＹＥＳ」となり、変数“ｎ１”を入力変数リストに追加する。また、ステートメント４のデータ構造において、データ依存順ポインタリストを参照し、アドレス「ｐｖ１２」から変数“ｍａｘ”に対するデータ構造を取得する。このデータ構造において、ステートメントへのポインタを参照し、ノードＮｆとしてステートメント１５を発見する。そこで、ステートメント１５のデータ構造において、範囲内フラグを参照すると、「０」なので、ステップ１３５での判断は「ＹＥＳ」となり、変数“ｍａｘ”を出力変数リストに追加する。
【００４８】
次に、ステートメント５に着目して、図１２の処理を行う。即ち、ステートメント５のデータ構造において、変数リストを参照し、アドレス「ｐｖ３」から変数“ｎ１”に対するデータ構造を取得する。このデータ構造において、データ依存逆ポインタリストを参照し、ノードＮｂとしてステートメント１を発見する。そこで、ステートメント１のデータ構造において、範囲内フラグを参照すると、「０」なので、ステップ１３２での判断は「ＹＥＳ」となり、変数“ｎ１”を入力変数リストに追加する。また、ステートメント５のデータ構造において、データ依存順ポインタリストを参照し、アドレス「ｐｖ１１」から変数“ｍｉｎ”に対するデータ構造を取得する。このデータ構造において、ステートメントへのポインタを参照し、ノードＮｆとしてステートメント１４を発見する。そこで、ステートメント１４のデータ構造において、範囲内フラグを参照すると、「０」なので、ステップ１３５での判断は「ＹＥＳ」となり、変数“ｍｉｎ”を出力変数リストに追加する。
【００４９】
次に、ステートメント６に着目して、図１２の処理を行う。即ち、ステートメント６のデータ構造において、変数リストを参照し、アドレス「ｐｖ４」から変数“ｙｙｙ”に対するデータ構造を取得する。このデータ構造において、データ依存逆ポインタリストを参照し、ノードＮｂとしてステートメント３を発見する。そこで、ステートメント３のデータ構造において、範囲内フラグを参照すると、「０」なので、ステップ１３２での判断は「ＹＥＳ」となり、変数“ｙｙｙ”を入力変数リストに追加する。また、ステートメント６のデータ構造において、データ依存順ポインタリストを参照し、アドレス「ｐｖ５」から変数“ｔｔｔ”に対するデータ構造を取得する。このデータ構造において、ステートメントへのポインタを参照し、ノードＮｆとしてステートメント７を発見する。そこで、ステートメント７のデータ構造において、範囲内フラグを参照すると、「１」なので、ステップ１３５での判断は「ＮＯ」となり、変数“ｔｔｔ”は出力変数リストに追加しない。
【００５０】
次に、ステートメント７に着目して、図１２の処理を行う。即ち、ステートメント７のデータ構造において、変数リストを参照し、アドレス「ｐｖ５」から変数“ｔｔｔ”に対するデータ構造を取得する。このデータ構造において、データ依存逆ポインタリストを参照し、ノードＮｂとしてステートメント６を発見する。そこで、ステートメント６のデータ構造において、範囲内フラグを参照すると、「１」なので、ステップ１３２での判断は「ＮＯ」となり、変数“ｔｔｔ”は入力変数リストに追加しない。また、ステートメント７のデータ構造において、データ依存順ポインタリストを参照し、アドレス「ｐｖ１０」から変数“ｘｘｘ”に対するデータ構造を取得する。このデータ構造において、ステートメントへのポインタを参照し、ノードＮｆとしてステートメント１３を発見する。そこで、ステートメント１３のデータ構造において、範囲内フラグを参照すると、「０」なので、ステップ１３５での判断は「ＹＥＳ」となり、変数“ｘｘｘ”を出力変数リストに追加する。
【００５１】
次に、ステートメント８に着目して、図１２の処理を行う。即ち、ステートメント８のデータ構造において、変数リストを参照し、アドレス「ｐｖ６」から変数“ｎ１”に対するデータ構造を、アドレス「ｐｖ７」から変数“ｎ２”に対するデータ構造を取得する。「ｐｖ６」の変数“ｎ１”に対するデータ構造において、データ依存逆ポインタリストを参照し、ノードＮｂとしてステートメント１を発見する。そこで、ステートメント１のデータ構造において、範囲内フラグを参照すると、「０」なので、ステップ１３２での判断は「ＹＥＳ」となり、変数“ｎ１”を入力変数リストに追加する。また、「ｐｖ７」の変数“ｎ２”に対するデータ構造において、データ依存逆ポインタリストを参照し、ノードＮｂとしてステートメント１を発見する。そこで、ステートメント１のデータ構造において、範囲内フラグを参照すると、「０」なので、ステップ１３２での判断は「ＹＥＳ」となり、変数“ｎ２”を入力変数リストに追加する。なお、ステートメント８のデータ構造において、データ依存順ポインタリストが「ＮＵＬＬ」のため、ノードＮｆは発見されず、ステップ１３５での判断は「ＮＯ」となり、出力変数は抽出されない。
【００５２】
次に、ステートメント９に着目して、図１２の処理を行う。即ち、ステートメント９のデータ構造において、変数リストを参照し、アドレス「ｐｖ８」から変数“ｎ２”に対するデータ構造を取得する。このデータ構造において、データ依存逆ポインタリストを参照し、ノードＮｂとしてステートメント１を発見する。そこで、ステートメント１のデータ構造において、範囲内フラグを参照すると、「０」なので、ステップ１３２での判断は「ＹＥＳ」となり、変数“ｎ２”を入力変数リストに追加する。また、ステートメント９のデータ構造において、データ依存順ポインタリストを参照し、アドレス「ｐｖ１２」から変数“ｍａｘ”に対するデータ構造を取得する。このデータ構造において、ステートメントへのポインタを参照し、ノードＮｆとしてステートメント１５を発見する。そこで、ステートメント１５のデータ構造において、範囲内フラグを参照すると、「０」なので、ステップ１３５での判断は「ＹＥＳ」となり、変数“ｍａｘ”を出力変数リストに追加する。
【００５３】
次に、ステートメント１１に着目して、図１２の処理を行う。即ち、ステートメント１１のデータ構造において、変数リストを参照し、アドレス「ｐｖ９」から変数“ｎ２”に対するデータ構造を取得する。このデータ構造において、データ依存逆ポインタリストを参照し、ノードＮｂとしてステートメント１を発見する。そこで、ステートメント１のデータ構造において、範囲内フラグを参照すると、「０」なので、ステップ１３２での判断は「ＹＥＳ」となり、変数“ｎ２”を入力変数リストに追加する。また、ステートメント１１のデータ構造において、データ依存順ポインタリストを参照し、アドレス「ｐｖ１１」から変数“ｍｉｎ”に対するデータ構造を取得する。このデータ構造において、ステートメントへのポインタを参照し、ノードＮｆとしてステートメント１４を発見する。そこで、ステートメント１４のデータ構造において、範囲内フラグを参照すると、「０」なので、ステップ１３５での判断は「ＹＥＳ」となり、変数“ｍｉｎ”を出力変数リストに追加する。
【００５４】
なお、以上の説明では、範囲内フラグを用いてノードＮｂ、Ｎｆがプログラム断片内にあるかどうかを判断したが、例えば、図１０のステップ１２１で作成されたリストを辿る等、各ステートメントがプログラム断片内にあるかどうかを判断できる方法であれば、いかなる方法を用いて判断してもよい。
また、上記においては、入力／出力変数を、入力／出力変数リストに同じ入力／出力変数を出力済みであるかどうかに関わらず出力していたが、入力／出力変数リストに同じ入力／出力変数が出力済みであるかどうかを検査し、出力済みであれば再度出力しないように構成してもよい。
本実施の形態では、コンピュータにより実現される依存関係情報追跡部１７が以上のような処理を行うことにより、指定されたプログラム断片からインターフェース情報を抽出することを可能にしている。
【００５５】
このように、本実施の形態では、プログラムのソースコード上で指定されたプログラム断片のインターフェース情報をＰＤＧに基づき抽出するようにしている。これにより、プログラム断片のインターフェース情報の理解を容易に行えるようにする。
【００５６】
（第２の実施の形態）
第２の実施の形態は、第１の実施の形態によるインターフェース情報の表示方法を利用したメソッド抽出リファクタリングの方法に関するものである。
図１３は、第２の実施の形態の全体構成を示すブロック図である。図１３に示すように、本実施の形態は、プログラム記憶部１１と、構文解析・依存関係情報生成部１２と、依存関係情報記憶部１３と、構文木記憶部１４と、情報入出力部１５と、入出力装置１６と、依存関係情報追跡部１７と、構文木変更部１８とを含む。
【００５７】
プログラム記憶部１１、構文解析・依存関係情報生成部１２、依存関係情報記憶部１３、構文木記憶部１４、情報入出力部１５、入出力装置１６、依存関係情報追跡部１７の各部の機能は、第１の実施の形態と同様であるが、第２の実施の形態では、更に、構文木変更部１８を備えている。
構文木変更部１８は、依存関係情報の追跡後に、関心の無い計算部分（依存関係情報の追跡から漏れることにより分かる）が当初指定したプログラム断片の範囲の外に移動するように、構文木を変更する部分である。メソッド抽出リファクタリング用ユーザインターフェースを実現するために必要となる。
【００５８】
なお、本実施の形態は、コンピュータシステムにより実現される。本実施の形態を実現するコンピュータシステムのハードウェア構成は、中央処理装置（ＣＰＵ）、主記憶装置、ハードディスク装置等の補助記憶装置、入力装置、出力装置を備えた一般的なものでよい。
補助記憶装置には、構文解析・依存関係情報生成部１２、情報入出力部１５、依存関係情報追跡部１７、構文木変更部１８を実現するためのプログラムが記憶され、ＣＰＵがこのプログラムを主記憶装置に読み込んで実行することにより、構文解析・依存関係情報生成部１２、情報入出力部１５、依存関係情報追跡部１７、構文木変更部１８が実現される。また、補助記憶装置は、プログラム記憶部１１、依存関係情報記憶部１３、構文木記憶部１４としても機能する。
【００５９】
次に、本実施の形態の動作について詳細に説明する。
本実施の形態でも、図２に示すようなプログラムのソースコードが与えられたものとして説明を進める。また、本実施の形態でも、プログラム断片のインターフェース情報としては、プログラム断片に対して外部から与えられる値を格納する変数である入力変数と、プログラム断片から外部へ与える値を格納する変数である出力変数とを例にとって説明する。
【００６０】
図１４は、本実施の形態の動作の概略を示すフローチャートである。
まず、構文解析・依存関係情報生成部１２は、プログラム記憶部１１に記憶されたプログラムのソースコードを読み込み、ＰＤＧを生成する（ステップ２０１）。ＰＤＧは、依存関係情報記憶部１３に記憶される。
【００６１】
ＰＤＧが生成された後、情報入出力部１５によりソースコードが表示され（ステップ２０２）、ユーザによりプログラム断片の範囲が指定される（ステップ２０３）。この指定は、例えば、ユーザがそのインターフェース情報を知りたいと思うプログラム断片の開始ステートメントおよび終了ステートメントをマウス等で指定するという操作で行われる。
【００６２】
次に、依存関係情報追跡部１７は、依存関係情報記憶部１３に記憶されたＰＤＧを追跡し、指定されたプログラム断片のインターフェース情報を抽出する（ステップ２０４）。
【００６３】
インターフェース情報が抽出されると、情報入出力部１５が、それを依存関係情報追跡部１７から受け取り、入出力装置１６に表示する（ステップ２０５）。図２のソースコードにおいて、破線で囲まれた範囲がプログラム断片として指定されたとすると、このプログラム断片のインターフェース情報は、例えば、図４に示すように表示される。
【００６４】
ここで、ユーザには、そのインターフェース情報でよいかどうかを再検討する機会が与えられる（ステップ２０６）。ユーザがそのインターフェース情報に満足せず、プログラム断片の範囲を変更したい場合は、ステップ２０３に戻って再度範囲を指定することになる。このようにユーザがプログラム断片のインターフェース情報を確認しながら範囲を指定することにより、ユーザの意図により合致したメソッドを抽出することができる。
【００６５】
なお、図１４のステップ２０１におけるＰＤＧの生成処理は、図３のステップ１０１におけるＰＤＧの生成処理とほぼ同じである。生成されるＰＤＧは、模式図のレベルでは、図６に示されたものと同じである。但し、本実施の形態では、図７（Ａ）に示されるステートメントを表すデータ構造に関係フラグが追加される。なお、関係フラグは、出力変数のうちの一部をユーザが選択した場合に、ステートメントがその選択された変数に格納される値の決定に関係あるかどうかを示すフラグである。関係フラグには、例えば、初期値として「０」を設定し、ステートメントが選択された変数に関係あれば「１」を設定するようにする。但し、ステートメントが選択された変数に関係あるかどうかの印を付することができれば、その他のいかなる手法を用いてもよい。
【００６６】
本実施の形態では、第１の実施の形態とは異なり、最初に指定したプログラム断片のうち、出力変数の一部に関係する部分のみをメソッドとして切り出すことも可能にしている。図１４では、ステップ２０７〜２１４がこの処理に相当する。
【００６７】
まず、ユーザには、出力変数のうちの一部の変数に関係する部分のみをメソッドとして抽出するかどうかを判断する機会が与えられる（ステップ２０７）。ここで、そのような抽出を行いたくない場合は、ステップ２１３へ進むが、行いたい場合、ユーザは、出力変数の中から変数を選択する（ステップ２０８）。依存関係情報追跡部１７は、選択された出力変数（以下、「選択出力変数」という）に関係するステートメントを表すデータ構造の関係フラグに、このステートメントが選択出力変数に関係することを示す値を設定する（ステップ２０９）。その後、そのような値が関係フラグに設定されていないステートメントからなる部分（以下、「抽出対象外部分」という）から、そのような値が関係フラグに設定されているステートメントからなる部分（以下、「抽出対象部分」）に対する依存関係があるかどうかを調査する（ステップ２１０）。ここで、依存関係があると判断された場合（ステップ２１１でＹＥＳ）、処理はステップ２０７に戻るが、依存関係がないと判断された場合（ステップ２１１でＮＯ）、抽出対象外部分を抽出対象部分の下に移動する等、これらの部分の分離を行う（ステップ２１２）。
【００６８】
例えば、ステップ２０５で、第１の実施の形態と同様、出力変数“ｘｘｘ”、“ｍａｘ”、“ｍｉｎ”が表示されているとする。ところが、ユーザがメソッドとして抽出したいのは、出力変数“ｍａｘ”、“ｍｉｎ”の値が決定される処理の部分であるとする。即ち、ユーザは、出力変数“ｘｘｘ”の値の計算部分はメソッドに含んでほしくないとする。このような場合、ユーザは希望するプログラム断片の出力変数として、“ｍａｘ”、“ｍｉｎ”を選択する。すると、ステップ２１２で、ユーザが関心ない入力変数“ｙｙｙ”から出力変数“ｘｘｘ”への計算の部分（抽出対象外部分）と、ユーザが関心ある部分（抽出対象部分）とが分離され、図１５に示すような表示となる。この例では、“ｔｔｔ  ：＝  ｙｙｙ  ／  ２”；”、“ｘｘｘ  ：＝  ｔｔｔ；”が移動されている。ユーザは、図１５において、入力変数が“ｎ１”と“ｎ２”、出力変数が“ｍａｘ”と“ｍｉｎ”であることを確認して、メソッド抽出を起動する。これにより、依存関係情報追跡部１７は、メソッドを切り出して元の部分はメソッド呼び出しに変換し（ステップ２１３）、変換後のソースコードを表示する（ステップ２１４）。
【００６９】
次に、図１４のステップ２０９における関係フラグの設定処理について、図１６を参照しながら詳細に説明する。
まず、依存関係情報追跡部１７は、出力変数用ダミーノードとして、選択出力変数を含むノード「Ｄｏ１」と、それ以外の出力変数を含むノード「Ｄｏ２」とを作成する（ステップ２２１）。
次に、依存関係情報追跡部１７は、指定したプログラム断片の内側から外側へ出るデータ依存関係と同じものをダミーノード「Ｄｏ１」および「Ｄｏ２」に張る（ステップ２２２）。
そして、選択出力変数を含むダミーノード「Ｄｏ１」へのポインタを返す（ステップ２２３）。
更に、依存関係情報追跡部１７は、依存関係追跡を行い、選択出力変数に関係するノードの関係フラグに関係する旨の情報を設定する（ステップ２２４）。
【００７０】
図１７に、ダミーノード「Ｄｏ１」および「Ｄｏ２」を含むＰＤＧを模式的に示している。図１７に示すように、出力変数用ダミーノード「Ｄｏ１」に含まれる変数“ｍａｘ”には、ステートメント１５に含まれる変数“ｍａｘ”と同様のデータ依存関係が張られ、出力変数用ダミーノード「Ｄｏ１」に含まれる変数“ｍｉｎ”には、ステートメント１４に含まれる変数“ｍｉｎ”と同様のデータ依存関係が張られる。また、出力変数用ダミーノード「Ｄｏ２」に含まれる変数“ｘｘｘ”には、ステートメント１３に含まれる変数“ｘｘｘ”と同様のデータ依存関係が張られる。
【００７１】
次に、図１７に示すＰＤＧに含まれるダミーノード「Ｄｏ１」および「Ｄｏ２」のコンピュータ内部における管理方法の一例について詳細に説明する。
図１７に示したダミーノード「Ｄｏ１」および「Ｄｏ２」は、例えば、図１８に示すようなデータ構造を有するデータにより管理される。なお、本実施の形態では、ステートメントを表すデータ構造には、図７（Ａ）に示すデータ構造に「関係フラグ」を追加した構造となっているので、これらのダミーノードを表すデータ構造も、それに合わせたデータ構造としている。
【００７２】
次に、図１６のステップ２２４における処理について、図１９を参照しながら詳細に説明する。
まず、依存関係情報追跡部１７は、着目するノードに入って来るデータ／制御依存関係の１つに着目し、その依存関係を逆に辿ってノードを発見する（ステップ２３１）。なお、ここでは、データ依存関係だけでなく、制御依存関係も辿っていく。
ノードを発見すると、依存関係情報追跡部１７は、発見されたノードが指定したプログラム断片の範囲外であるかどうかを判断し（ステップ２３２）、範囲外であれば、ステップ２３５へ進む。一方、範囲外でなければ、そのノードの関係フラグに関係している旨の情報を設定し（ステップ２３３）、そのノードについて図１９の処理を再帰的に呼び出す（ステップ２３４）。
依存関係情報追跡部１７は、これらの処理が終了すると、着目する依存関係を示すポインタを次の依存関係に移動する（ステップ２３５）。そこで、処理すべき依存関係がまだあれば（ステップ２３６でＮＯ）、ステップ２３１に進み、処理すべき依存関係がもうなければ（ステップ２３６でＹＥＳ）、図１６に戻る。
【００７３】
ここで、以上の処理を具体的に説明する。図１７に示すＰＤＧのうち、ダミーノード「Ｄｏ１」、「Ｄｏ２」については、図１８に示すような管理がなされ、それ以外の部分については、図８、９に示したような管理がなされているものとする。但し、図８における各ステートメントのデータ構造には、関係フラグを格納するためのフィールドが追加されているものとする。
【００７４】
まず、ダミーノード「Ｄｏ１」のデータ構造において、変数リストを参照し、変数“ｍａｘ”および変数“ｍｉｎ”のデータ構造を取得する。変数“ｍａｘ”のデータ構造において、データ依存逆ポインタリストを参照し、ステートメント４および９を発見する。また、変数“ｍｉｎ”のデータ構造において、データ依存逆ポインタリストを参照し、ステートメント５および１１を発見する。なお、ダミーノード「Ｄｏ１」のデータ構造において、制御依存逆ポインタは「ＮＵＬＬ」であるので、制御依存関係を辿ることにより発見されるノードはない。
従って、ステートメント４、９、５、１１について、ステップ２３２〜２３４の処理を行うことになる。
【００７５】
まず、ステートメント４のデータ構造において、範囲内フラグを参照すると、「１」なので、ステップ２３２での判断は「ＮＯ」となり、ステートメント４の関係フラグに関係ありと設定される。
次に、ステートメント４のデータ構造において、変数リストを参照し、アドレス「ｐｖ２」から変数“ｎ１”のデータ構造を取得する。このデータ構造において、データ依存逆ポインタリストを参照し、ステートメント１を発見する。そこで、ステートメント１のデータ構造において、範囲内フラグを参照すると、「０」なので、ステップ２３２での判断は「ＹＥＳ」となり、関係フラグは更新されない。なお、ステートメント４のデータ構造において、制御依存逆ポインタは「ＮＵＬＬ」であるので、制御依存関係を辿ることにより発見されるノードはない。
【００７６】
また、ステートメント９のデータ構造において、範囲内フラグを参照すると、「１」なので、ステップ２３２での判断は「ＮＯ」となり、ステートメント９の関係フラグに関係ありと設定される。
次に、ステートメント９のデータ構造において、変数リストを参照し、アドレス「ｐｖ８」から変数“ｎ２”のデータ構造を取得する。このデータ構造において、データ依存逆ポインタリストを参照し、ステートメント１を発見する。そこで、ステートメント１のデータ構造において、範囲内フラグを参照すると、「０」なので、ステップ２３２での判断は「ＹＥＳ」となり、関係フラグは更新されない。また、ステートメント９のデータ構造において、制御依存逆ポインタを参照し、ステートメント８を発見する。そこで、ステートメント８のデータ構造において、範囲内フラグを参照すると、「１」なので、ステップ２３２での判断は「ＮＯ」となり、関係フラグに関係ありと設定される。
【００７７】
更に、ステートメント５のデータ構造において、範囲内フラグを参照すると、「１」なので、ステップ２３２での判断は「ＮＯ」となり、ステートメント５の関係フラグに関係ありと設定される。
次に、ステートメント５のデータ構造において、変数リストを参照し、アドレス「ｐｖ３」から変数“ｎ１”のデータ構造を取得する。このデータ構造において、データ依存逆ポインタリストを参照し、ステートメント１を発見する。そこで、ステートメント１のデータ構造において、範囲内フラグを参照すると、「０」なので、ステップ２３２での判断は「ＹＥＳ」となり、関係フラグは更新されない。なお、ステートメント５のデータ構造において、制御依存逆ポインタは「ＮＵＬＬ」であるので、制御依存関係を辿ることにより発見されるノードはない。
【００７８】
次に、ステートメント１１のデータ構造において、変数リストを参照し、アドレス「ｐｖ９」から変数“ｎ２”のデータ構造を取得する。このデータ構造において、データ依存逆ポインタリストを参照し、ステートメント１を発見する。そこで、ステートメント１のデータ構造において、範囲内フラグを参照すると、「０」なので、ステップ２３２での判断は「ＹＥＳ」となり、関係フラグは更新されない。また、ステートメント１１のデータ構造において、制御依存逆ポインタを参照し、ステートメント８を発見する。そこで、ステートメント８のデータ構造において、範囲内フラグを参照すると、「１」なので、ステップ２３２での判断は「ＮＯ」となり、関係フラグに関係ありと設定される。
【００７９】
以上の処理の結果、図１７に示すＰＤＧを表すデータ構造は、図２０に示すようになる。即ち、範囲内フラグが「１」であるステートメント４、５、６、７、８、９、１１のうち、ステートメント４、５、８、９、１１の関係フラグが「１」になっている。
【００８０】
次に、図１４のステップ２１０における依存関係の調査処理について、図２１を参照しながら詳細に説明する。
選択出力変数に関係しないと判断された部分（抽出対象外部分）から選択出力変数に関係すると判断された部分（抽出対象部分）へ依存関係があっても、抽出対象部分をメソッドとして抽出することは可能である。しかし、その場合、メソッドとして切り出した抽出対象部分に含まれる一部のステートメントを、元のソースコードにも残しておく必要が生ずる。
【００８１】
例えば、図２に示したソースコードのステートメント７が、“ｘｘｘ  ：＝  ｔｔｔ  ＋  ｍａｘ；”であったとする。この状況で、出力変数の中から“ｍａｘ”、“ｍｉｎ”が選択された場合、図１９のフローチャートによれば、ステートメント７の関係フラグは更新されない。従って、抽出対象部分をメソッドとして切り出した時に、ステートメント７の“ｘｘｘ  ：＝  ｔｔｔ  ＋  ｍａｘ；”は、元のソースコードに残ることになるが、変数“ｍａｘ”の値が決められていないため、切り出したメソッドに含めた“ｍａｘ  ：＝  ｎ１；”を、元のソースコードにも重複して記述しておかなければならない。
こうなると、重複した部分に修正の必要が生じた場合には、重複した部分の両方を修正しなければならなくなる。その際には、一方を修正し忘れる可能性もあるため、メソッド抽出リファクタリングを行った後のプログラムの保守性が低下する。
従って、ここでは、抽出対象外部分から抽出対象部分へ依存関係がある際には、選択出力変数に関係する部分のメソッド抽出は行わないという立場を取っている。
【００８２】
依存関係情報追跡部１７は、プログラム断片内で関係フラグに関係ある旨の値が設定されていないノードを選択し（ステップ２４１）、データ／制御依存関係を逆に辿りノードを発見する（ステップ２４２）。発見されたノードがプログラム断片の外であるかどうかを判断し（ステップ２４３）、プログラム断片の外でないと判断された場合は、発見されたノードの関係フラグに関係ある旨の値が設定されているかどうかを判断する（ステップ２４４）。ここで、関係フラグに関係する旨の値が設定されていると判断された場合は、抽出対象部分への依存ありと決定する（ステップ２４８）。
一方、ステップ２４３でプログラム断片の外であると判断された場合や、ステップ２４４で関係フラグに関係ある旨の値が設定されていないと判断された場合は、関係フラグに関係ある旨の値が設定されていない次のノードへ移動する（ステップ２４５）。ここで、ノードがまだ存在すれば（ステップ２４６でＮＯ）、処理はステップ２４１へ進むが、ノードがもう存在しなければ（ステップ２４６でＹＥＳ）、抽出対象部分への依存なしと決定する（ステップ２４７）。
【００８３】
このように抽出対象外部分から抽出対象部分への依存関係があるかどうかを判定することにより、かかる依存関係がある場合は、再度出力変数を選択し直すか、出力変数を選択することを止めて、当初範囲指定したプログラム断片をメソッドとして切り出すことになる。
【００８４】
また、依存関係がない場合には、抽出対象外部分を抽出対象部分とは分離するが、その場合、構文木変更部１８が、構文木記憶部１４に記憶された構文木を、分離後のソースコードの構造に合うように変更する。
なお、図１５のような表示がなされた場合のＰＤＧを図２２に示す。但し、図２２におけるノードとアークの関係は、図１７におけるものと全く同一であり、図１７と図２２とで管理されるステートメントや変数に関するデータの内容が実質的に異なることを意味するものではない。
【００８５】
以上の処理の後に、メソッドを抽出する。なお、抽出するメソッドは、ユーザの関心のある抽出対象部分とするのが普通であるが、抽出対象外部分をメソッドとして抽出するようにしてもよい。図２３に、メソッドの抽出の様子を示す。図２３（Ａ）は、メソッドにおいて入出力変数をパラメータ化しない場合の例であり、図２３（Ｂ）は、メソッドにおいて入出力変数をパラメータ化する場合の例である。オブジェクト指向系の言語の場合は、インスタンス変数の変数スコープがクラスという範囲で限定され、メソッドもインスタンス変数へのアクセスを行うというスタイルでの定義が多いので、パラメータ化無しでのメソッド呼び出しにすることが多いと考えられる。
Ｐａｓｃａｌ系の言語や、Ｃ、ＰＬ／Ｉ等の手続き型の言語の場合は、クラスという単位での変数スコープが無いこともあり、メソッド呼び出しはパラメータ化することが望ましい。Ｐａｓｃａｌ系の言語であれば、入力変数はｃａｌｌ  ｂｙ  ｖａｌｕｅで指定し、出力変数は  ｃａｌｌ  ｂｙ  ｒｅｆｅｒｅｎｃｅで指定する必要がある。図２３（Ｂ）でｐｒｏｃｅｄｕｒｅ  ｍａｘ＿ｍｉｎのパラメータの定義で、ｍａｘとｍｉｎのパラメータ変数にはｖａｒ  オプションが付いていることで、ｃａｌｌ  ｂｙ  ｒｅｆｅｒｅｎｃｅが指定されている。これにより、このメソッド内で変数ｍａｘとｍｉｎに代入された値が、このメソッド呼び出しの実引数への変更として反映される。ＰＬ／Ｉでは、メソッド呼び出しが、ｃａｌｌ  ｂｙ  ｒｅｆｅｒｅｎｃｅなので、特にここでのｖａｒ  に相当する指定は必要ない。Ｃ言語の場合はｃａｌｌ  ｂｙ  ｖａｌｕｅしかないので、出力変数に相当するものは、パラメータとして変数へのポインタ（アドレス）を渡して、メソッド内でそのポインタの先の領域にデータを代入して返すように修正して抽出する必要がある。
【００８６】
図２４に、入出力変数をパラメータ化する場合のＰＤＧを模式的に示す。入力変数“ｎ１”、“ｎ２”を含む入力変数用ダミーノード「Ｄｉ１」と、出力変数“ｍａｘ”、“ｍｉｎ”  を含む出力変数用ダミーノード「Ｄｏ１」とを用意し、メソッドとしての抽出対象の断片への入出力は、一度そのノード／変数を経由するように、データ依存関係を張りなおしている。ダミーノード「Ｄｉ１」および「Ｄｏ１」では、その上流で設定された値をそのダミーノード中の変数が参照し、それと同時にそのダミーノードでその変数の値をそのまま（変更せずに）設定するものとしている。図２４の「Ｄｉ１」中の変数を入力変数、「Ｄｏ１」の中の変数を出力変数としてメソッド抽出ができる。それらのダミーノードは、メソッドの入出力用仮引数と、呼び出しの際の入出力用実引数に対応する。
【００８７】
このように、本実施の形態では、プログラム断片のインターフェース情報の中から特定のインターフェース情報を選択することにより、プログラム断片からその選択されたインターフェース情報に関係する部分のみを抽出するようにしている。これにより、プログラム断片のインターフェース情報の理解を踏まえてリファクタリング等を行うことができ、効率的なプログラム保守を可能にする。
【００８８】
【発明の効果】
このように、本発明によれば、プログラム断片のインターフェース情報の理解を容易にするとともに、リファクタリング等のプログラム保守を効率的に行えるようにできる。
【図面の簡単な説明】
【図１】本発明の第１の実施の形態の全体構成を示すブロック図である。
【図２】本発明の第１および第２の実施の形態の説明で用いるソースコードを示す図である。
【図３】本発明の第１の実施の形態の動作を示すフローチャートである。
【図４】本発明の第１の実施の形態における出力結果を示す図である。
【図５】本発明の第１の実施の形態におけるＰＤＧ生成処理の動作を示すフローチャートである。
【図６】本発明の第１の実施の形態の説明で用いるＰＤＧを示す図である。
【図７】本発明の第１の実施の形態におけるステートメントおよび変数を表すデータ構造を示す図である。
【図８】本発明の第１の実施の形態におけるステートメントの情報の管理の例を示す図である。
【図９】本発明の第１および第２の実施の形態における変数の情報の管理の例を示す図である。
【図１０】本発明の第１の実施の形態におけるインターフェース情報抽出処理の動作を示すフローチャートである。
【図１１】本発明の第１の実施の形態におけるステートメントの情報の管理の例を示す図である。
【図１２】本発明の第１の実施の形態におけるインターフェース情報抽出処理の動作を示すフローチャートである。
【図１３】本発明の第２の実施の形態の全体構成を示すブロック図である。
【図１４】本発明の第２の実施の形態の動作を示すフローチャートである。
【図１５】本発明の第２の実施の形態における出力結果を示す図である。
【図１６】本発明の第２の実施の形態における関係フラグ設定処理の動作を示すフローチャートである。
【図１７】本発明の第２の実施の形態の説明で用いるＰＤＧを示す図である。
【図１８】本発明の第２の実施の形態におけるダミーノードの情報の管理の例を示す図である。
【図１９】本発明の第２の実施の形態における関係フラグ設定処理の動作を示すフローチャートである。
【図２０】本発明の第２の実施の形態におけるステートメントの情報の管理の例を示す図である。
【図２１】本発明の第２の実施の形態における依存関係調査処理の動作を示すフローチャートである。
【図２２】本発明の第２の実施の形態の説明で用いるＰＤＧを示す図である。
【図２３】本発明の第２の実施の形態におけるメソッド抽出の例を示す図である。
【図２４】本発明の第２の実施の形態の説明で用いるＰＤＧを示す図である。
【符号の説明】
１１…プログラム記憶部、１２…構文解析・依存関係情報生成部、１３…依存関係情報記憶部、１４…構文木記憶部、１５…情報入出力部、１６…入出力装置、１７…依存関係情報追跡部、１８…構文木変更部
【図１】
2005018114.tif 000003
【図２】
2005018114.tif 000004
【図３】
2005018114.tif 000005
【図４】
2005018114.tif 000006
【図５】
2005018114.tif 000007
【図６】
2005018114.tif 000008
【図７】
2005018114.tif 000009
【図８】
2005018114.tif 000010
【図９】
2005018114.tif 000011
【図１０】
2005018114.tif 000012
【図１１】
2005018114.tif 000013
【図１２】
2005018114.tif 000014
【図１３】
2005018114.tif 000015
【図１４】
2005018114.tif 000016
【図１５】
2005018114.tif 000017
【図１６】
2005018114.tif 000018
【図１７】
2005018114.tif 000019
【図１８】
2005018114.tif 000020
【図１９】
2005018114.tif 000021
【図２０】
2005018114.tif 000022
【図２１】
2005018114.tif 000023
【図２２】
2005018114.tif 000024
【図２３】
2005018114.tif 000025
【図２４】
2005018114.tif 000026