(57)【要約】【課題】  ソフトウェアの保守において，仕様変更の過程で使用されなくなったプログラム部品を検出し，保守対象ソースコードを必要なプログラム部品のみに保つ事で保守作業を効率化するシステムを提供する。【解決手段】  対象ソフトウェアを構成するプログラム部品の中間コードから対象プログラム部品自身の情報と他のプログラム部品との依存関係を抽出してデータベースに格納する手段と，ソフトウェア毎の独自のルールに従って抽出した依存関係の中から対象ソフトウェアを構成するプログラム部品群の中から不要プログラム部品が存在するプログラム部品群に含まれるプログラム部品同士の依存関係に絞り込む手段とを備えることにより、課題を解決する。【選択図】  図１
2009093239.tif 000002
【特許請求の範囲】
【請求項１】
ソースコードから実行モジュールへの変換過程で中間コードを生成するオブジェクト指向言語を用い、複数のプログラム部品で構成されるソフトウェアの保守作業を行うために、前記ソフトウエアから不要プログラム部品を検出する不要プログラム部品検出システムにおいて、
前記プログラム部品の中間コードが有する呼出し対象プログラムの識別子を用いてプログラム部品間の依存関係を抽出する手段と、
前記抽出された依存関係を示す依存関係情報を格納するデータベースと、
前記データベースに格納された依存関係情報について、前記入力手段を介して入力されるのパラメタに従って、所定の依存関係情報に変換する手段と、
前記データベースに格納された依存関係情報を、前記変換する手段での変換内容に従って前記所定の依存関係情報に書き換える手段と、
前記データベースに格納された前記所定の依存関係情報に従って、前記複数のプログラム部品のうち、不要プログラム部品を検出する手段とを有することを特徴とする不要プログラム部品検出システム。
【請求項２】
請求項１に記載の不要プログラム部品検出システムにおいて、
前記変換する手段は、前記データベースに格納された依存関係情報について、前記入力手段を介して入力される第１のパラメタに従って特定範囲のプログラム部品同士の依存関係とそれ以外の依存関係とを区別する手段を有することを特徴とする不要プログラム部品検出システム。
【請求項３】
請求項１または２のいずれかに記載の不要プログラム検出システムにおいて、
前記変換する手段は、前記データベースに格納された依存関係情報について、前記入力手段を介して入力される第２のパラメタに従って、間接的なプログラム部品間の依存関係を直接的な依存関係に置き換える手段を有することを特徴とする不要プログラム検出システム。
【請求項４】
請求項１乃至３のいずれかに記載の不要プログラム検出システムにおいて、
前記検出する手段は、前記不要プログラム部品の一覧を作成する手段とを有することを特徴とする不要プログラム部品検出システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソフトウェアの保守作業において，対象ソフトウェアに含まれるプログラム部品の中から，他プログラム部品からの依存関係の無いプログラム部品を検出する技術に関する。なお、本明細書での「不要プログラム部品」とは、他のプログラム部品との依存関係が無い、もしくは無視できる程度のプログラム部品を指す。
【背景技術】
【０００２】
ソフトウェア開発には，プログラムを部品化する事により他のソフトウェアまたは対象ソフトウェア中に含まれる他のプログラム部品から再利用するという考え方が存在する。オブジェクト指向言語によって開発されたソフトウェアは特にこの傾向が強く，多数のプログラム部品が相互に作用する事で全体の機能を実現しており，保守作業に際しては，対象ソフトウェアを構成するプログラム部品の依存関係を把握できる事が重要である。この依存関係の調査作業を支援する事を目的として，プログラム中の関数や変数の参照先を一覧化するクロスリファレンスという概念が存在する。特にオブジェクト指向プログラミングにおいては，関数呼出しやプログラム間共有変数の参照の他に，継承や実体化といった特有の概念を持っており，これらの依存関係を抽出し，ソフトウェアの構造解析を支援するシステムとして特許文献１が存在する。
【０００３】
一般にクロスリファレンスはプログラミング環境が備える一部として提供され，変更対象となる単一プログラム部品を起点に依存関係をツリー状の様式で表示する機能がよく知られている。
【０００４】
【特許文献１】特開平６−１２４２００号公報
【発明の開示】
【発明が解決しようとする課題】
【０００５】
ソフトウェアの保守では，対象ソフトウェアを構成するプログラム部品の依存関係を管理する事が求められる。これは，プログラムの変更によって発生する他プログラムへの影響を把握する必要がある事の他に，プログラム変更の過程で使用されなくなった部品の検出(以下，不要プログラム部品と略す)が必要となる為である。これは通常，変更に伴ってどのプログラム部品からも使用されなくなったプログラム部品は，変更を行なう担当者自身が把握しているが，多数の担当者が関わる大規模なソフトウェア開発において，システム全体を通じて利用されるプログラム部品については，全ての依存関係の把握が困難な場合が存在するからである。
【０００６】
上記従来の技術背景を受け，不要プログラム部品の一覧作成を実現するにあたっては２つの課題が挙げられる。
【０００７】
第一の課題は，従来のクロスリファレンスは，プログラム部品の変更による影響範囲を求める事を目的としている為，単一のプログラム部品を起点として他のプログラム部品との依存関係を抽出する機能を有している。しかし．従来のクロスリファレンスでは不要プログラム部品の一覧を作成するにあたっては対象ソフトウェアを構成する全てのプログラム部品を起点として総当り式に依存関係を抽出する事が求められる為，全プログラム部品の分だけ機能の実行を繰返さなければならず，ソフトウェア保守作業の一環として継続的に実施するには，作業効率において問題となる。
【０００８】
第二の課題は，ソフトウェアを構成するプログラム部品の中には依存関係が無くても将来的な利用を想定して意図的に残してあるプログラム部品が存在し，これを区別して管理する事である。具体的には，データベースのテーブルレイアウトに対応付けられた構造体プログラムや，通信スタブに代表される仲介プログラムが該当する。これらのプログラム部品は，多くの場合ソフトウェア毎に独自に定めたルールに基づいて区別されており，不要なプログラムの摘出にあたっては直接的な依存関係だけでなく，対象ソフトウェアにおけるプログラム部品が持つ役割や特性を考慮する事が望まれるが，従来のクロスリファレンスにはソフトウェア毎の独自のルールを加味した処理を行なう機能は無い。
【課題を解決するための手段】
【０００９】
上記の課題を解決するために、本発明では、各プログラム部品間の依存関係を、パラメータに従って変換し、変換された内容に従って不要プログラム部品を検出するものである。すなわち、ソースコードから実行モジュールへの変換過程で中間コードを生成するオブジェクト指向言語を用い、複数のプログラム部品で構成されるソフトウェアの保守作業を行うために、前記ソフトウエアから不要プログラム部品を検出する不要プログラム部品検出システムにおいて、
前記プログラム部品の中間コードが有する呼出し対象プログラムの識別子を用いてプログラム部品間の依存関係を抽出する手段と、
前記抽出された依存関係を示す依存関係情報を格納するデータベースと、
前記データベースに格納された依存関係情報について、前記入力手段を介して入力されるのパラメタに従って、所定の依存関係情報に変換する手段と、
前記データベースに格納された依存関係情報を、前記変換する手段での変換内容に従って前記所定の依存関係情報に書き換える手段と、
前記データベースに格納された前記所定の依存関係情報に従って、前記複数のプログラム部品のうち、不要プログラム部品を検出する手段とを有する不要プログラム部品検出システムである。
【００１０】
また、この不要プログラム部品検出システムにおいて、前記変換する手段は、前記データベースに格納された依存関係情報について、前記入力手段を介して入力される第１のパラメタに従って特定範囲のプログラム部品同士の依存関係とそれ以外の依存関係とを区別する手段を有する不要プログラム部品検出システムも本発明に含まれる。
【００１１】
また、これらの不要プログラム検出システムにおいて、前記変換する手段は、前記データベースに格納された依存関係情報について、前記入力手段を介して入力される第２のパラメタに従って、間接的なプログラム部品間の依存関係を直接的な依存関係に置き換える手段を有する不要プログラム検出システムも本発明に含まれる。
【００１２】
さらに、これらの不要プログラム検出システムにおいて、前記検出する手段は、前記不要プログラム部品の一覧を作成する手段とを有する不要プログラム部品検出システムも本発明に含まれる。
【００１３】
より詳細には、以下の態様も本発明に含まれる。上記２つの課題の解決にあたって本発明の不要プログラム部品検出システムは，対象ソフトウェアの開発言語をソースコードから実行モジュールへの変換過程で中間コードを生成するプログラミング言語を対象とし，中間コードからプログラム部品間の依存関係情報を抽出してデータベースに格納するプログラム部品情報抽出処理と，データベースに格納された依存関係情報を用いて不要プログラム部品の一覧を作成する不要プログラム部品検出処理とを設ける。また，プログラム部品情報抽出処理は，対象ソフトウェアを構成するプログラム部品の中間コードから対象プログラム部品自身の情報と他のプログラム部品との依存関係を抽出してデータベースに格納する手段と，ソフトウェア毎の独自のルールに従って抽出した依存関係の中から対象ソフトウェアを構成するプログラム部品群の中から不要プログラム部品が存在するプログラム部品群に含まれるプログラム部品同士の依存関係に絞り込む手段とを備える。不要プログラム部品検出処理は，ソフトウェア毎の独自のルールに従って仲介プログラムとの依存関係を仲介プログラムが仲介する先のプログラムとの依存関係に置き換える手段と，データベースに格納したプログラム部品自身の情報と依存関係から不要プログラム部品一覧として(1)不要クラス一覧と(2)不要フィールド一覧と(3)不要メソッド一覧の３つを出力する手段とを備える。
【００１４】
本発明の不要プログラム部品検出システムは，第一の課題の解決手段として，全プログラム部品を起点に総当り式に依存関係を抽出して不要プログラム部品の一覧を出力する専用の機能を備える。また，第二の課題解決の手段として，ソフトウェア毎の独自のルールを用いて読み込んだプログラム部品の中から不要プログラム部品が存在するプログラム部品群に限定して依存関係の抽出とデータベース格納を行なう事により構造体プログラムや仲介プログラムが不要プログラム部品と見なされないようにする事に加え，仲介プログラムとの依存関係を仲介先プログラムとの依存関係に置き換える機能を備える事で，仲介先プログラムが仲介プログラムとだけ依存している場合でも不要プログラム部品として検出できるようにする。
【００１５】
本発明における不要プログラム部品の検出は次のような手順で実施する。
まず利用者がプログラム部品情報抽出処理を実行すると，本発明の不要プログラム部品検出システムは対象ソフトウェアのライブラリファイルから全てのプログラム部品の中間コードを取得する。次に，ライブラリから取得した全てのプログラム部品について以下を実施する。当該システムの外部より取得した抽出ルールに従ってプログラム部品が依存関係の抽出処理の対象となるかをチェックする。この時，構造体プログラムは抽出処理の対象外となり，中間プログラム及びそれ以外のプログラムは抽出処理の対象となる。プログラム部品が依存関係の抽出処理の対象である場合は，中間コードからプログラム部品自身の情報としてクラス名称とメソッド名称及び引数のデータ型の名称とフィールド名称とを取得し，同じクラス名称を持つプログラム部品がデータベースに格納済みかどうかをチェックする。同じクラス名称を持つプログラム部品がデータベースに格納されていない場合は抽出した情報を中間コードのファイル更新日付及び更新時刻と一緒にデータベースに格納する。同じクラス名称を持つプログラム部品がデータベースに格納されている場合はデータベースに格納済みのファイル更新日付及び更新時刻と，抽出した中間コードのファイル更新日付と更新時刻とを比較し，後者の方が新しければ抽出した情報でデータベースを更新する。続いて他のプログラム部品との依存関係の情報として，継承しているプログラム部品のクラス名称とフィールドのデータ型に使用されているプログラム部品のクラス名称とメソッドの引数に使用されているプログラム部品のクラス名称とメソッドの中で呼出しているメソッドのメソッド名称及び引数のデータ型の名称とメソッドの中でアクセスしているフィールドの名称とを取得し，それぞれ依存関係の先のプログラム部品が依存関係の抽出処理の対象となるかをチェックして依存関係の抽出処理の対象であれば，データベースに格納する。プログラム部品が依存関係の抽出処理の対象となるかをチェックした結果，プログラム部品が依存関係の抽出処理の対象でなければ処理は行なわず，次のプログラム部品のチェック処理に移る。全てのプログラム部品についてチェック処理及び依存関係の抽出処理が完了すると，プログラム部品情報抽出処理は終了する。
【００１６】
続いて利用者が不要プログラム部品検出処理を実行すると，本発明の不要プログラム部品検出システムはデータベースに格納されている全てのプログラム部品のクラス名称を取得し，1つのプログラム部品につき以下３つの処理を実施する。第一の処理として，対象プログラム部品のクラス名称を検索条件に他のプログラム部品からの継承とフィールドのデータ型とメソッドのデータ型のいずれかの依存関係がデータベースに格納されているかを検索する。第二の処理として，対象プログラム部品のクラス名称を検索条件に対象プログラム部品に含まれる全てのフィールド名称を取得し，それぞれのフィールドが対象プログラム部品または他のプログラム部品からアクセスされている依存関係がデータベースに格納されているかを検索する。第三の処理として，対象プログラム部品のクラス名称を検索条件に対象プログラム部品に含まれる全てのメソッド名称及び引数のデータ型の名称を取得し，それぞれのメソッドが対象プログラム部品または他のプログラム部品から呼出されている依存関係がデータベースに格納されているかを検索し，更に当該システムの外部より取得した抽出ルールに従って対象メソッドに対応する仲介プログラムがあるかどうかを検索する。
【００１７】
対象メソッドに対応する仲介プログラムが存在した場合は，他のプログラム部品から仲介メソッドを呼出している依存関係を，他のプログラム部品から対象メソッドの呼出している依存関係に置き換え，仲介メソッドから対象メソッドを呼出している依存関係を検索結果から削除する。対象メソッドに対応する仲介プログラムが存在しなかった場合は，検索結果に対して置き換え，削除の処理は行なわない。以上３つの処理の結果として，まず３つの処理全て依存関係が見つからなかった場合と第一の処理で依存関係が無く且つ第二の処理で他プログラム部品からのアクセスしている依存関係が無く且つ第三の処理で他プログラム部品からの呼出している依存関係が無い場合は，対象プログラム部品を不要クラスと判断し不要クラスの一覧に加える。次に不要クラスと見なされなかったプログラム部品のうち，第二の処理で依存関係が無いフィールドを不要フィールドと判断し不要フィールドの一覧に加える。続いて不要クラスと見なされなかったプログラム部品のうち，第三の処理で依存関係が無いメソッドを不要メソッドと判断し不要メソッド一覧に加える。これらの処理を全てのプログラム部品について完了すると，不要クラスの一覧と不要フィールドの一覧と不要メソッドの一覧をテキストファイルに出力し，不要プログラム部品検出処理は終了する。
【００１８】
以上の過程を経る事で不要クラスの一覧と不要フィールドの一覧と不要メソッドの一覧の３つがテキストファイルとして作成され，不要プログラム部品の検出が実現する。
【００１９】
なお、本発明には、上述したシステムを用いた方法、システムをコンピュータとして実現するためのプログラムやこれを格納した記憶媒体も含まれる。
【発明の効果】
【００２０】
本発明の不要プログラム部品検出システムにより不要プログラム部品の検出を実施する事で，保守作業の対象母体であるソフトウェアを構成するプログラム部品の冗長性を排除しソフトウェアが備える機能に対して適正な規模を保つ事ができ，ソフトウェア保守における作業効率の向上と規模による開発成果の評価をより適正に実施する事が期待できる。特に，パッケージソフトウェアに代表されるプログラム部品の再利用を重視した形態のソフトウェア保守及びカスタマイズに際して，本発明を利用して対象規模を適切に保つ事により適正な開発作業量の見積りと，保守作業の効率向上が期待できる。
【００２１】
また、以下の３点の工夫により，従来技術を転用して不要プログラム部品検出を実現する場合に比べプログラム依存関係抽出処理の所要時間短縮も期待できる。一点目は中間コードを入力情報とする事でソースコードから依存関係の抽出する場合に比べ処理時間の長い字句解析と構文解析と意味解析の３つの処理工程が省略できる事である。二点目は２回目以降の依存関係の抽出処理時において前回から格納時から変更のあったプログラム部品だけを依存関係の抽出とデータベース格納処理の対象とする事で仕様変更によりソフトウェアを構成するプログラム部品群のうちの一部のみが変更された場合の抽出処理対象を必要最小限に限定できる事である。三点目はソフトウェア毎の独自のルールを用いてプログラム部品の中から不要プログラム部品が存在するプログラム部品群のみをプログラム依存関係抽出処理の対象に限定できる事である。
【発明を実施するための最良の形態】
【００２２】
以下，本発明の実施の一形態について図面を使用して詳細に説明する。図１はＪａｖａ（登録商標）言語により開発したソフトウェアを対象とした，本発明の不要プログラム部品検出システムの構成図である。
【００２３】
図１において，不要プログラム部品検出システム１００は本システム全体を示している。入出力装置１１０と主記憶装置１１１と外部記憶装置１１２から構成される。プログラム部品情報抽出処理プログラム１２０は中間コードからプログラム部品間の依存関係情報を抽出してデータベースに格納するプログラムであり，ライブラリファイル読み取り部１２１と中間コード読み取り部１２２と構造体プログラム依存関係チェックアウト部１２３とデータベース格納部１２４から構成される。不要プログラム部品検出処理プログラム１３０はデータベースに格納された依存関係情報を用いて不要プログラム部品の一覧を作成するプログラムであり，プログラム情報読み取り部１３１と継承関係チェック部１３２とインターフェース実装関係チェック部１３３とフィールドアクセスチェック部１３４とメソッド呼出チェック部１３５と仲介プログラム依存関係１３６と不要プログラム部品判定部１３７と不要プログラム部品一覧ファイル作成１３８から構成される。ライブラリファイル１４０は保守対象ソフトウェアのライブラリファイルである。依存関抽出ルール１５０は構造体プログラム及び仲介プログラムを識別する為のソフトウェア独自のルールを設定するファイルである。プログラム部品情報データベース１６０はプログラム部品情報抽出処理プログラム１２０が依存関抽出ルール１５０から読み込んだルールに従ってライブラリファイル１４０から抽出した情報を格納する為のデータベースで，クラス情報テーブル１６１とフィールド情報テーブル１６２とメソッド情報テーブル１６３とインターフェース実装情報テーブル１６４とフィールドアクセス情報テーブル１６５とメソッド呼出情報テーブル１６６から構成される。不要プログラム部品一覧ファイル群１７０は不要プログラム部品検出処理プログラム１３０が依存関抽出ルール１５０から読み込んだルールに従ってプログラム部品情報データベース１６０から読み込んだ情報を用いて作成するファイル群で，不要クラス一覧ファイル１７１と不要フィールド一覧ファイル１７２と不要メソッド一覧ファイル１７３から構成される。
【００２４】
また，図１０はプログラム情報データベース１６０の各テーブルにおけるカラムの構成とテーブル間の関連を示している。図１０においてクラス情報テーブル１０１０は図１におけるクラス情報クラス情報１６１に対応しており，中間コード１つにつき１レコード作成される。構成するカラムはクラス名１０１１と親クラス名１０１２とクラス修飾子１０１３と中間コード更新日付１０１４の４つで，クラス名１０１１を主キーに持つ。フィールド情報テーブル１０２０は図１におけるフィールド情報テーブル１６２に対応しており，クラス情報テーブル１０１０に対しクラスが持つフィールドの数のレコードが作成される。構成するカラムはクラス名１０２１とフィールド名１０２２とデータ型１０２３とフィールド修飾子１０２４の４つで，クラス名１０２１とフィールド名１０２２を主キーとし，クラス名１０２１をクラス情報テーブル１０１０との外部キーに持つ。メソッド情報テーブル１０３０は図１におけるメソッド情報テーブル１６３に対応しており，クラス情報テーブル１０１０に対しクラスが持つメソッドの数のレコードが作成される。構成するカラムはクラス名１０３１とメソッドシグネチャ１０３２とメソッド修飾子１０３３の３つで，クラス名１０３１とメソッドシグネチャ１０３２を主キーとし，クラス名１０３１をクラス情報テーブル１０１０との外部キーに持つ。インターフェース実装情報テーブル１０４０は図１におけるインターフェース実装情報テーブル１６４に対応しており，クラス情報テーブル１０１０に対しクラスが実装するインターフェースの数のレコードが作成される。構成するカラムはクラス名１０４１と実装インターフェース名１０４２の２つで，クラス名１０４１と実装インターフェース名１０４２を主キーとし，クラス名１０４１をクラス情報テーブル１０１０との外部キーに持つ。メソッド呼出情報テーブル１０５０は図１におけるメソッド呼出情報テーブル１６６に対応しており，メソッド情報テーブル１０３０に対しメソッド内におけるメソッド呼出処理の数のレコードが作成される。構成するカラムはクラス名１０５１とメソッドシグネチャ１０５２と命令順序１０５３と対象クラス名１０５４と対象メソッドシグネチャ１０５５の５つで，クラス名１０５１とメソッドシグネチャ１０５２と命令順序１０５３を主キーとし，クラス名１０５１とメソッドシグネチャ１０５２をメソッド情報テーブル１０３０との外部キーに持つ。フィールドアクセス情報テーブル１０６０は，図１におけるフィールドアクセス情報テーブル１６５に対応しており，メソッド情報テーブル１０３０に対しメソッド内におけるフィールドアクセス処理の数のレコードが作成される。構成するカラムはクラス名１０６１とメソッドシグネチャ１０６２と命令順序１０６３と対象クラス名１０６４と対象フィールドデータ型１０６５と対象フィールド名１０６６の６つで，クラス名１０６１とメソッドシグネチャ１０６２と命令順序１０６３を主キーとし，クラス名１０６１とメソッドシグネチャ１０６２をメソッド情報テーブル１０３０との外部キーに持つ。
【実施例１】
【００２５】
以下，上記形態における実施例の動作について，図を用いて説明する。
図２は、保守対象ソフトウェアにおけるクラス図であり，保守対象ソフトウェアがクラス”SuperClass110”２００と”SuperClass120”２０５と”Inteface210”２１０と”Interface220”２１５と”BusinessClass310”２２０と”BusinessClass320”２２５と”BusinessClass330”２３０と”BusinessClass340”２３５と”BusinessClass350”２４０と”StructClass510_st”２４５と”StructClass520_st”２５０から構成される事を示している。また，図２において関連線２２１は”BusinessClass310”２２０のいずれかのメソッドにおいて”BusinessClass320”２２５のいずれかのメソッドを呼出す事を示しておいる。関連線２２６は”Business Class320”２２５が”SuperClass120”２０５を継承している事を示している。関連線２２７は”BusinessClass320”２２５が”Interface220”２１５をインターフェースとして実装している事を示している。関連線２２８は”BusinessClass320”２２５のいずれかのメソッドが”BusinessClass340”２３５のいずれかのメソッドを呼出す（依存関係の１つ）事を示しており，”BusinessClass320”２２５と”BusinessClass350”２４０の間においても同様の関連がある。関連線２２９は”BusinessClass320”２２５が”StructClass510_st”２４５をフィールドとして保持する事を示している。実施例は，図２に示される設計に基づいて開発されたソフトウェアが，保守作業を経た状態に対して本発明のシステムを適用したものとして説明する。
【００２６】
まず，本実施例の動作にあたり，図１におけるライブラリファイル１４０と依存関係抽出ルール１５０を用意する。図３におけるexample.jar３００は，保守対象ソフトウェアの各プログラム部品（全てであっても構わない）の中間コードを内包するZIP形式ファイルであり，ライブラリファイル１４０に相当する。またSuperClass110.classファイル３１０は，図２におけるプログラム部品SuperClass110クラス２００の中間コードファイルである。このようにＪａｖａ（登録商標）言語ではプログラム部品と中間コードのファイル単位が一対一に対応付いている。図４におけるextract_rule.propertiesファイル４００は，構造体プログラムと仲介プログラムを識別する為の条件を示したファイルであり，図１における依存関係抽出ルール１５０に相当する。４１０は構造体プログラムの識別条件であり，クラス名称の末尾が文字列”_st”に合致するプログラム部品が構造体プログラムとして認識される事を示している。４２０は仲介プログラムの識別条件であり，いずれかのクラスに含まれる”callLogic341()V”メソッドが，”example.BusinessClass340”クラスの”execLogic341()V”メソッドに対する仲介プログラムとして認識されるという事を示している。
【００２７】
次に，利用者が入出力装置１１０を介してプログラム部品情報抽出処理プログラム１２０を実行すると，ライブラリファイル１４０に含まれる中間コードの情報がライブラリ読み取り部１２１，中間コード読み取り部１２２，構造体プログラム依存関係チェックアウト部１２３，データベース格納部１２４での処理過程を経てプログラム部品情報データベース１６０に格納される。この一連の処理の詳細を図３に示すフローチャートで説明する。プログラム部品情報抽出処理プログラム１２０が実行されると，まずライブラリファイル５００を読み込む（ステップ５１０）。ここでライブラリファイル５００は外部記憶装置１１２に配された保守対象ソフトウェアのライブラリファイルであり，example.jar３００と同等である。また，ステップ５１０はライブラリ読み取り部１２１に相当する処理であり，ライブラリファイル５００を読み込んで主記憶装置１１１に配する。ステップ５１０の完了に続いて，主記憶装置１１１に読み込んだライブラリファイル５０１から未処理の中間コードを１つ取り出す。（ステップ５１１）。ステップ５１１は中間コード読み取り部１２２に相当する処理である。次にステップ５１１で取り出した中間コードを構造体プログラムチェックアウト処理（ステップ５１２）に引き渡し，チェック結果を受け取る。チェック結果を判定し，真であれば構造体プログラムであるとして以降の処理を行う。すなわち、次の中間コードの処理（ステップ５１１）に移り，チェック結果が偽であれば，ステップ５１４に遷移する（ステップ５１３）。続いて中間コードからステップ５１２と同様の方法を用いてクラス名称を抽出し，このクラス名称をキーとして図１０のクラス情報テーブル１０１０を検索して同じ（もしくは同様など対応するものか）クラス名称のプログラム部品がプログラム情報データベース１６０に登録済みかどうかをチェックする（ステップ５１４）。登録済みでなければデータベース格納処理（ステップ５１６）に中間コードを引き渡す。登録済みであれば，クラス情報テーブル１０１０に格納されている中間コード更新日付１０１４を取得し，中間コードのファイル更新日付と比較する。中間コードの更新日付がデータベースに格納されている更新日付１０１４よりも新しければデータベース格納処理（ステップ５１６）に中間コードを引き渡し，それ以外であれば次の中間コードの処理に移る（ステップ５１５）。ステップ５１６が完了後，ライブラリファイル５０１に未処理の中間コードが残っていればステップ５１１に移り，残っていなければ処理を終了する（ステップ５１７）。
【００２８】
上記手順のうち，ステップ５１２とステップ５１４の詳細について，フローチャートと中間コードの例を用いて説明する。図６はステップ５１２の詳細を示すフローチャート，図７はステップ５１４の処理の詳細を示すフローチャートを示し，図８は図２におけるBusinessClass320２２５の中間コードであるクラスファイルのイメージを示しており，図９に示すソースコードをコンパイルした結果である。なお，Ｊａｖａ（登録商標）言語のクラスファイルでは，クラスやメソッド名などの文字列は定数領域８００に纏めて格納されており，クラス情報領域８０１などの各領域には定数領域への指標が格納されている。図８では説明の便宜上，直接領域に文字列が格納されているイメージを示している。
【００２９】
ステップ５１２では図６において，まず図４のextract_rule.properties４００に相当する依存関係抽出ルールファイル６００から構造体プログラムの識別条件を読み込む（ステップ６１０）。次にステップ５１１から引き渡された中間コードからプログラム部品のクラス名を抽出する（ステップ６１１）。クラス名の抽出は，図８におけるクラス情報領域８３０のクラス名８２２項目の値を参照する事により実現する。ステップ６１１で読み込んだクラス名がステップ６１０で読み込んだ抽出条件に合致するかをチェックする（ステップ６１２）し，合致していれば戻り値に真を設定し（ステップ６１３），合致しなければ偽を設定する（ステップ６１４）。ステップ６１１で読み込んだクラス名”BusinessClass320”は構造体プログラムの識別条件に合致しない為，ステップ６１３にて戻り値に真を設定して終了する。
【００３０】
ステップ５１４では，図７の各ステップを経て図１のプログラム情報データベース１６０の各テーブルに中間コードから情報を抽出して格納する。まずステップ５１３から引き渡された中間コードからクラス情報テーブル７０１に格納する情報を抽出する（ステップ７１０）。抽出する情報は，図８におけるクラス情報領域８３０のクラス修飾子８２１の値”public”とクラス名８２２の値”example.BusinessClass320”と親クラス名８２３の値”example.SuperClass120”を対象とする。次にステップ７１０にて抽出した情報をクラス情報テーブル７０１に格納する（ステップ７１１）。クラス情報テーブル１０１０が示すテーブルレイアウトがクラス情報テーブル７０１に対応しており，クラス修飾子８２１の値をクラス修飾子１０１３に，クラス名８２２の値をクラス１０１１に，親クラス名８２３の値を親クラス名１０１２に，中間コードのファイル更新日付を中間コード更新日付１０１４にそれぞれ格納する。
【００３１】
次に，中間コードからインターフェース実装情報テーブル７０２に格納する情報を抽出する（ステップ７１２）。尚，インターフェース実装情報は，１つの中間コードファイルに複数存在する為，ステップ７１２ではインターフェース１つ分の情報を抽出する。抽出する情報は，図８におけるインターフェース情報領域８４０の実装インターフェース名８４１の値”Interface220”を対象とする。次にステップ７１２にて抽出した情報をインターフェース実装情報テーブル７０２に格納する（ステップ７１３）。インターフェース実装情報テーブル１０４０が示すテーブルレイアウトがインターフェース実装情報テーブル７０２に対応しており，ステップ７１０で抽出したクラス名８２２をクラス名１０４１に，実装インターフェース名８４１の値を実装インターフェース名１０４２に，それぞれ格納する。ステップ７１３が完了したら，中間コードに未処理のインターフェース実装情報が存在するかをチェックし，存在すればステップ７１２に戻り，無ければステップ７１５に遷移する（ステップ７１４）。ステップ７１５では，中間コードからフィールド情報テーブル７０３に格納する情報を抽出する。尚，フィールド情報は１つの中間コードファイルに複数存在する為，ステップ７１５ではフィールド１つ分の情報を抽出する。抽出する情報は，図８におけるフィールド情報領域８５０の変数修飾子８５１の値”private”とフィールド名８５２の値”property321”とデータ型８５３の値”int”を対象とする。次にステップ７１５にて抽出した情報をフィールド情報テーブル７０３に格納する（ステップ７１６）。フィールド情報テーブル１０２０が示すテーブルレイアウトがフィールド情報テーブル７０３に対応しており，ステップ７１０で抽出したクラス名８２２をクラス名１０２１に，フィールド名８５２の値をフィールド名１０２２に，データ型８５３の値をデータ型１０２３に，変数修飾子８５１の値をフィールド修飾子１０２４に，それぞれ格納する。ステップ７１６が完了したら，中間コードに未処理のフィールド情報が存在するかをチェックし，存在すればステップ７１５に戻り，無ければステップ７１８に遷移する（ステップ７１７）。ステップ７１８では，中間コードからメソッド情報テーブル７０４に格納する情報を抽出する。
【００３２】
尚，メソッド情報は１つの中間コードファイルに複数存在する為，ステップ７１８ではメソッド１つ分の情報を抽出する。抽出する情報は，図８におけるメソッド情報領域８６０のメソッド修飾子８６１の値”public”とメソッド名８６２の値”execLogic321”と引数・戻り値８６３の値”()V”を対象とする。次にステップ７１８にて抽出した情報をメソッド情報テーブル７０４に格納する（ステップ７１９）。メソッド情報テーブル１０３０が示すテーブルレイアウトがメソッド情報テーブル７０４に対応しており，ステップ７１０で抽出したクラス名８２２をクラス名１０３１に，メソッド名８６２の値と引数・戻り値８６３の値を連結した値” execLogic321()V”をメソッドシグネチャ１０３２に，メソッド修飾子８６３の値をメソッド修飾子１０３３にそれぞれ格納する。続いて，フィールドアクセス情報テーブル７０５及びメソッド呼出情報テーブル７０６に格納する情報の抽出を行なう（ステップ７２０）。ステップ７２０では，メソッド情報領域８６０のコード８６４に格納されている命令の情報を抽出の対象とする。命令とはＪａｖａ（登録商標）言語の処理の最小の単位であり，ソースコードの各ステップは，コンパイラによって命令の単位に分割されて格納される。命令の構成は命令の種類によって異なるものの，命令順序８８１と命令コード８８２と処理対象８８３と行番号８８４を主たる要素として持っている。コード８６４には複数の命令がメソッドの処理内容として格納されており，ステップ７２０では1つの命令情報を取り出し，ステップ７２１に遷移する。ステップ７２１では命令コード８８２の値に応じて次の遷移先を分岐する。命令コード８８２が”getfield”，”getstatic”，”putfield”，”putstatic”のいずれかであればフィールドアクセス処理としてステップ７２２に遷移し，命令コード８８２が”invokeinterface”，”invokespecial”，”invokestatic”，”invokevirtual”のいずれかであればメソッド呼出処理としてステップ７２４に遷移する。上記のいずれにも該当しない場合はプログラム部品の関連に関しない命令と判断し処理は行なわず，ステップ７２６に遷移する。ステップ７２２では，未処理のコードがあればステップ７１７に戻る。その為，図８の例では命令８９１と命命令８９５がステップ７２４に，命令８９２と命令８９３と命令８９４がステップ７２２に遷移する。ステップ７２２では，フィールドアクセス情報テーブル７０５に格納する情報を抽出する。
【００３３】
抽出する情報は、図８における命令８９２を例に取ると，命令順序８８１の値”8”と命令コード８８２の値”putfield”と処理対象８８３の値”example.StructClass510_st. property322”と行番号８８４の値”15”となる。次にステップ７２２にて抽出した情報をフィールドアクセス情報テーブル７０５に格納する（ステップ７２３）。フィールドアクセス情報テーブル１０６０が示すテーブルレイアウトがフィールドアクセス情報テーブル７０５に対応しており，ステップ７１０で抽出したクラス名８２２をクラス名１０６１に，ステップ７１８で抽出したメソッド名８６２と引数・戻り値８６３を連結した値をメソッドシグネチャ１０６２に，命令順序８８１を命令順序１０６３に，処理対象８８３のクラス名を表す部分文字列”example.StructClass510_st”を対象クラス名１０６４に，処理対象８８３のフィールド名を表す部分文字列”property322”を対象フィールド名１０６５に，それぞれ格納する。ステップ７２４では，メソッド呼出情報テーブル７０６に格納する情報を抽出する。抽出する情報は図８における命令８９５を例に取ると，命令順序８８１の値”21”と命令コード８８２の値”invokespecial”と処理対象８８３の値” example.BusinessClass320.callLogic341()V”と行番号８８４の値”17”となる。次にステップ７２４にて抽出した情報をフィールドアクセス情報テーブル７０５に格納する（ステップ７２５）。
【００３４】
メソッド呼出情報テーブル１０５０が示すテーブルレイアウトがメソッド呼出情報テーブル７０６に対応しており，ステップ７１０で抽出したクラス名８２２をクラス名１０５１に，ステップ７１８で抽出したメソッド名８６２と引数・戻り値８６３を連結した値をメソッドシグネチャ１０５２に，命令順序８８１を命令順序１０５３に，処理対象８８３のクラス名を表す部分文字列” example.BusinessClass320”を対象クラス名１０５４に，処理対象８８３のメソッド名及び引数・戻り値を表す部分文字列”callLogic341()V”を対象フィールド名１０５５に，それぞれ格納する。対象メソッド中の各コードの処理が完了すると，ステップ７２６からステップ７２７に遷移する。ステップ７２７では未処理のメソッドがあればステップ７１８に戻り，未処理のメソッドが無ければ終了する。
【００３５】
プログラム部品情報抽出処理プログラム１２０を完了後，利用者が入出力装置１１０を介して不要プログラム部品検出処理プログラム１３０を実行すると，クラス情報読み取り部１３１，継承関係チェック部１３２，インターフェース実装関係チェック部１３３，フィールドアクセスチェック部１３４，メソッド呼出チェック部１３５，仲介プログラム依存関係置換部１３６，不要プログラム部品判定部１３７，不要プログラム部品一覧ファイル作成部１３８の処理過程を経て不要プログラムファイル群１７０が作成される。この一連の処理の詳細を図１１に示すフローチャートで説明する。まず図１１において入出力に使用する外部記憶装置及び主記憶装置の領域について説明する。クラス情報テーブル１１０１とインターフェース実装情報テーブル１１０２とフィールド情報テーブル１１０３とフィールドアクセス情報テーブル１１０４とメソッド情報テーブル１１０５とメソッド呼出情報テーブル１１０６は図１におけるプログラム情報データベース１６０の各テーブルを示しており，不要クラス一覧ファイル１１０８と不要フィールド一覧ファイル１１０９と不要メソッド一覧ファイル１１１０は不要プログラム一覧ファイル群１７０の各ファイルに対応している。また，継承チェック結果１１３１とインターフェース実装チェック結果１１３２とフィールドアクセスチェック結果１１３３とメソッド呼出検索結果１１３４とメソッド呼出チェック結果１１３５と不要クラスリスト１１３６と不要フィールドリスト１１３７と不要メソッドリスト１１３８は不要プログラム部品検出処理プログラムの実行において主記憶装置１００上に確保される一時的な作業領域である。この作業領域の格納イメージを図１７に示す。続いて図１１における処理の流れについて説明する。不要プログラム部品検出処理プログラム１３０が実行されると，まずクラス情報テーブル１１０１から格納されているクラス情報を1件読み込み，クラス名１０１１を取得する（ステップ１１１１）。次にクラス情報テーブル１１０１から親クラス名１０１１にステップ１１１１にて読み込んだクラス名１０１１を持つプログラム部品を検索し，1件以上あれば継承依存関係があると判断し次の処理に移り，0件であれば依存関係が無いと判断し，継承チェック結果１０３１にクラス名１０１１を保存する（ステップ１１１２）。
【００３６】
続いて、インターフェース情報実装テーブル１１０２から実装インターフェース名１０４２にステップ１１１１にて読み込んだクラス名１０１１を持つプログラム部品を検索し，1件以上あればインターフェース実装関係があると判断し次の処理に移り，0件であれば依存関係が無いと判断し，インターフェース実装チェック結果１０３２にクラス名１０１１を保存する（ステップ１１１３）。ステップ１１１３が完了すると，次にフィールド情報テーブル１１０３からクラス名１０２１にステップ１１１１にて読み込んだクラス名１０１１を持つフィールド情報のフィールド名１０２２を1件読み込む(ステップ１１１４)。続いてフィールドアクセス情報テーブル１１０４から対象クラス名１０６4にステップ１１１１でにて読み込んだクラス名１０１１，対象フィールド名１０６５にステップ１１１４で読み込んだフィールド名１０２２を持つ情報を検索し，1件以上あればフィールドアクセス関係があると判断し次の処理に移り，0件であればフィールドアクセス関係が無いと判断し，フィールドアクセスチェック結果１０３３にクラス名１０１１とフィールド名１０２２を保存する（ステップ１１１５）。ステップ１１１５が完了したら，他にフィールド情報があれば１１１４に戻り，無ければステップ１１１８に遷移する（ステップ１１１６）。
【００３７】
ステップ１１１８では，メソッド情報テーブル１１０５からクラス名１０３１にステップ１１１１にて読み込んだクラス名１０１１を持つメソッド情報のメソッドシグネチャ１０３２を1件読み込む。続いてメソッド呼出情報テーブル１１０６から対象クラス名１０１０５４にステップ１１１１でにて読み込んだクラス名１０１１，対象メソッドシグネチャ１０６５にステップ１１１８で読み込んだメソッドシグネチャ１０３２を持つ情報を検索し，結果をメソッド呼出検索結果１０３４に保存し，ステップ１１２０に遷移する（ステップ１１２１）。ステップ１１２０の結果，検索結果が1件以上あればメソッド呼出関係があると判断し次の処理に移り，0件であればメソッド呼出関係が無いと判断し，メソッド呼出チェック結果１０３５にクラス名１０１１とメソッドシグネチャ１０３２を保存し，他にメソッド情報があれば１１１８に戻り，無ければステップ１１２２に遷移する（ステップ１１２１）。ステップ１１２２では，クラス情報が他にあればステップ１１１１に戻り，無ければステップ１１２３に遷移する。その後，ステップ１１２３の結果をステップ１１２４にて不要クラス一覧ファイル１１０８，不要フィールド情報１１０９，不要メソッド一覧ファイル１１１０に書込み，不要プログラム部品検出処理プログラム１３０は終了する。
【００３８】
上記手順のうち，ステップ１１２０とステップ１１２３の詳細について，図を用いて説明する。図１２はステップ１１２０のフローチャートを，図１３はステップ１１２３のフローチャートを示しており，図１２において依存関係抽出ルール１２０１は図１の依存関係抽出ルール１５０に対応し，メソッド情報テーブル１２０２はメソッド情報テーブル１６３に対応し，メソッド呼出検索結果１２０３は図１１のメソッド呼出検索結果１１３４に対応し，メソッド呼出情報テーブル１２０４はメソッド呼出情報テーブル１６６に対応する。また，図１３において継承チェック結果１３０１は図１１の継承チェック結果１１３１に対応し，インターフェース実装チェック結果１３０２はインターフェース実装チェック結果１１３２に対応し，フィールドアクセスチェック結果１３０３はフィールドアクセスチェック結果１１３３に対応し，メソッド呼出チェック結果１３０４はメソッド呼出チェック結果１１３５に対応し，不要クラスリスト１３０５は不要クラスリスト１１３６に対応し，不要フィールドリスト１３０６は不要フィールドリスト１１３７に対応し，不要メソッドリスト１３０７は不要メソッドリスト１１３８に対応する。以降，ステップ１１２０とステップ１１２３における処理の流れの詳細を説明する。
【００３９】
ステップ１１２０が実行されると，まず依存関係抽出ルールを読み込み（ステップ１２１１），次に処理対象メソッドに対するスタブ名称の抽出条件を取得し，該当する抽出条件が有ればステップ１２１３に遷移し，無ければそのまま終了する（ステップ１２１２）。ステップ１２１２の処理内容の例として，メソッド”example.BusinessClass320. execLogic321()V”とメソッド”example.BusinessClass340.execLogic341()V”を挙げると，前者の場合，図４の４２０に本メソッドを仲介先プログラムに持つ仲介プログラムの条件が無い為，仲介プログラムは無いと判断し，後者の場合は図４の４２０に本メソッドを仲介先プログラムに持つ仲介プログラムの条件が有る為，仲介プログラムが有ると見なす。以降は後者を処理対象メソッドの例として説明する。ステップ１２１３では，メソッド情報テーブル１２０２から処理対象メソッドの仲介プログラム抽出条件に該当するメソッド情報を検索する。具体的な処理内容としては，メソッド”example.BusinessClass340. execLogic341()V”に対する仲介プログラムの抽出条件は各クラスにおけるメソッドシグネチャ”callLogic341()V”を持つメソッドであるので，図１０のメソッドシグネチャ１０３２に対し”callLogic341()V”をキーとして検索を行なう。この結果として，メソッド”example.BusinessClass320. callLogic341()V”が得られ，次のステップ１２１４に遷移する。ステップ１２１４では，仲介プログラムから処理対象メソッドに対するメソッド呼出情報を，メソッド呼出検索結果１２０３から削除する。例では，”example. BusinessClass320.callLogic341()V”からメソッド”example.BusinessClass340. execLogic341()V”に対するメソッド呼出情報が削除される。次に他のプログラムからの仲介プログラムの呼出情報をメソッド呼出情報テーブル１２０４から検索する（ステップ１２１５）。例では，図１０の対象クラス名１０５４に対し” example.BusinessClass320”，対象メソッドシグネチャ１０５５に対し，”callLogic341()V”をキーとして検索を行う。
【００４０】
この結果としてメソッド”example.BusinessClass320.execLogic321()V”から”example. BusinessClass320. callLogic341()V”に対するメソッド呼出情報が得られる。続くステップ１２１６では，メソッド呼出検索結果１２０３に対しステップ１２１５で得られた検索結果を追加する。ステップ１２１６が完了すると，他に仲介プログラムとなるメソッドがある場合はステップ１２１２に戻り，無い場合は終了する（ステップ１２１７）。
【００４１】
ステップ１１２３が実行されると，まず継承チェック結果１３０１とインターフェース実装チェック結果１３０２とフィールドアクセスチェック結果１３０３とメソッド呼出チェック結果１３０４を読み込み，全てのリストに存在するクラス名を不要クラスと判断し，不要クラスリスト１３０５にクラス名を保存する（ステップ１３１１）。次にフィールドアクセスチェック１３０３と不要クラスリスト１３０５を読み込み，不要フィールドアクセスチェック結果のうち，不要クラスリストに含まれないクラスのフィールドを不要フィールドと判断し，不要フィールドリスト１３０６にクラス名とフィールド名を保存する（ステップ１３１２）。続いてメソッド呼出チェック結果１３０４と不要クラスリスト１３０５を読み込み，メソッド呼出チェック結果のうち，不要クラスリストに含まれないクラスのメソッドを不要メソッドと判断し，不要メソッドリスト１３０７にクラス名とメソッドシグネチャを保存する（ステップ１３１３）。
【００４２】
不要プログラム部品検出処理プログラム１３０を完了後，利用者は不要クラス一覧ファイル１１０８，不要フィールド情報１１０９，不要メソッド一覧ファイル１１１０を参照する事で不要プログラム部品の検出が実現する。以下，これら３つのファイルの内容について図を用いて説明する。図１４は不要クラス一覧ファイル１１０８の内容で，useless_classes .csv１４００が第一フィールド１４０１にパッケージ名，第二フィールドにクラス名を持つcsv形式ファイルであり，クラス”example.SuperClass110”と”example.Interface210”と”example.BusinessClass310”と”example.BusinessClass330”と”example.Business Class350”と”example.StructClass520_st”が不要クラスとして検出された事を示している。図１５は不要フィールド一覧ファイル１１０９の出力結果イメージで，useless_fields .csv１５００が第一フィールド１５０１にパッケージ名，第二フィールドにクラス名，第三フィールドにフィールド名を持つcsv形式ファイルであり，フィールド”example. SuperClass120.property121”と”example.BusinessClass320.property321”と”example. BusinessClass320.property322”と”example.BusinessClass340.property341”と”example. StructClass510_st.property512”が不要フィールドとして検出された事を示している。図１６は不要メソッド一覧ファイル１１１０の出力結果イメージで，useless_fields .csv１５００が第一フィールド１５０１にパッケージ名，第二フィールドにクラス名，第三フィールドにメソッドシグネチャを持つcsv形式ファイルであり，メソッド”example.  SuperClass120.execLogic121()V”と”example.Interface220.execLogic221()V” と”example.  BusinessClass320.execLogic221()V” と”example.BusinessClass320.execLogic322()V” と” example.BusinessClass320.callLogic351()V” と”example.BusinessClass340.execLogic221()V”が不要メソッドとして検出された事を示している。
【図面の簡単な説明】
【００４３】
【図１】本発明の不要プログラム部品検出システムにおける構成図である。
【図２】実施例１における対象ソフトウェアのプログラム部品構成(クラス図)である。
【図３】実施例１におけるライブラリファイルのイメージである。
【図４】実施例１における依存関係抽出ルールの定義内容である。
【図５】プログラム部品情報抽出処理プログラムのフローチャートである。
【図６】構造体プログラムチェックアウト処理のフローチャートである。
【図７】データベース格納処理のフローチャートである。
【図８】プログラム部品”BusinessClass320”の中間コードのイメージである。
【図９】プログラム部品”BusinessClass320”のソースコードである。
【図１０】プログラム情報データベースのテーブルレイアウト図である。
【図１１】不要プログラム検出処理プログラムのフローチャートである。
【図１２】仲介プログラム依存関係置換部のフローチャートである。
【図１３】不要プログラム部品判定処理のフローチャートである。
【図１４】実施例１における不要クラス一覧ファイルの出力結果である。
【図１５】実施例１における不要フィールド一覧ファイルの出力結果である。
【図１６】実施例１における不要メソッド一覧ファイルの出力結果である。
【図１７】不要プログラム部品判定処理で使用する作業領域のイメージである。
【符号の説明】
【００４４】
１００ 不要プログラム部品検出システム
１１０ 入出力装置
１１１ 主記憶装置
１１２ 外部記憶装置
１２０ プログラム部品情報抽出処理プログラム
１２１ ライブラリファイル読み取り部
１２２ 中間コード読み取り部
１２３ 構造体プログラム依存関係チェックアウト部
１２４ データベース格納部
１３０ 不要プログラム検出処理プログラム
１３１ クラス情報読み取り部
１３２ 継承関係チェック部
１３３ インターフェース実装関係チェック部
１３４ フィールドアクセスチェック部
１３５ メソッド呼出チェック部
１３６ 仲介プログラム依存関係
１３７ 不要プログラム部品判定部
１３８ 不要プログラム部品一覧ファイル作成部
１４０ 保守対象ソフトウェアのライブラリファイル
１５０ 依存関係抽出ルール
１６０ プログラム情報データベース
１６１ クラス情報テーブル
１６２ フィールド情報テーブル
１６３ メソッド情報テーブル
１６４ 継承情報テーブル
１６５ インターフェース実装情報テーブル
１６６ フィールドアクセス情報テーブル
１６７ メソッド呼出情報テーブル
１７０ 不要プログラム一覧ファイル群
１７１ 不要クラス一覧ファイル
１７２ 不要フィールド一覧ファイル
１７３ 不要メソッド一覧ファイル
【図１】
2009093239.tif 000003
【図２】
2009093239.tif 000004
【図３】
2009093239.tif 000005
【図４】
2009093239.tif 000006
【図５】
2009093239.tif 000007
【図６】
2009093239.tif 000008
【図７】
2009093239.tif 000009
【図８】
2009093239.tif 000010
【図９】
2009093239.tif 000011
【図１０】
2009093239.tif 000012
【図１１】
2009093239.tif 000013
【図１２】
2009093239.tif 000014
【図１３】
2009093239.tif 000015
【図１４】
2009093239.tif 000016
【図１５】
2009093239.tif 000017
【図１６】
2009093239.tif 000018
【図１７】
2009093239.tif 000019