(57)【特許請求の範囲】
【請求項１】
呼び出し元プログラムと、前記呼び出し元プログラムが呼び出しに用いる引数の内容により異なる処理を行う呼び出し先プログラムとを含むプログラム群の変換をコンピュータに実行させるプログラム変換プログラムであって、
変換前のプログラム群をコンピュータの記憶装置から取得するステップと、
取得した前記変換前のプログラム群から、前記呼び出し先プログラムの処理を異ならせる引数のうち、条件式で使用され、前記呼び出し先プログラム内で値が変更されておらず、分岐経路の実行の有無が該引数と定数との比較により決まり、該引数の影響を受ける分岐経路中で前記呼び出し先プログラム外に影響を与える処理が行われるものを処理区分引数としてその値と共に抽出し、その処理区分引数を持つ呼び出し先プログラムと共に検出する処理区分引数検出ステップと、
前記処理区分引数検出ステップで検出した前記呼び出し先プログラムの処理のうち引数の内容に応じた処理のみを実行するプログラムを専用呼び出し先プログラムとして、前記引数と前記引数の内容毎に生成する専用呼び出し先プログラム生成ステップと、
前記変換前のプログラム群の呼び出し元プログラムの中の、前記呼び出し先プログラムを呼び出す呼び出し箇所を検出し、呼び出し箇所における処理区分引数に該当する変数の取り得る値を求め、変数の取り得る値が有限個に確定しない場合は呼び出し場所を書き換えずに終了し、有限個に確定する場合は呼び出し箇所における呼び出し先変更前の呼び出し先プログラムを、前記専用呼び出し先プログラム生成ステップにより生成された専用呼び出し先プログラムを呼び出すように、前記呼び出し箇所を書き換えた変換後のプログラムを出力する呼び出し元プログラム書き換えステップと、
をコンピュータに実行させるプログラム変換プログラム。
【請求項２】
請求項１に記載のプログラム変換プログラムにおいて、
前記専用呼び出し先プログラム生成ステップは、前記呼び出し先プログラムのプログラム名と、前記引数の名前と、前記引数の内容とを用いて前記専用呼び出し先プログラムのプログラム名を生成し、
前記呼び出し元プログラム書き換えステップは、前記呼び出し箇所を前記専用呼び出し先プログラムのプログラム名に書き換えることを特徴とするプログラム変換プログラム。
【請求項３】
請求項１または請求項２に記載のプログラム変換プログラムにおいて、
前記専用呼び出し先プログラム生成ステップは、前記呼び出し先プログラムの内容のうち、前記引数の内容に従って実行されない処理を削除することにより前記専用呼び出し先プログラムを生成することを特徴とするプログラム変換プログラム。
【請求項４】
請求項１乃至請求項３のいずれかに記載のプログラム変換プログラムにおいて、
前記引数の内容は、引数の値であり、前記専用呼び出し先プログラム生成ステップは前記引数の値毎の専用呼び出し先プログラムを生成することを特徴とするプログラム変換プログラム。
【請求項５】
請求項１乃至請求項３のいずれかに記載のプログラム変換プログラムにおいて、
前記引数の内容は、オブジェクト指向言語におけるスーパークラスであり、前記専用呼び出し先プログラム生成ステップは前記スーパークラスを承継したサブクラス毎の専用呼び出し先プログラムを生成することを特徴とするプログラム変換プログラム。
【請求項６】
呼び出し元プログラムと、前記呼び出し元プログラムが呼び出しに用いる引数の内容により異なる処理を行う呼び出し先プログラムとを含むプログラム群の変換を行うプログラム変換装置であって、
変換前のプログラム群がコンピュータの記憶装置から取得され、取得された前記変換前のプログラム群から、前記呼び出し先プログラムの処理を異ならせる引数のうち、条件式で使用され、前記呼び出し先プログラム内で値が変更されておらず、分岐経路の実行の有無が該引数と定数との比較により決まり、該引数の影響を受ける分岐経路中で前記呼び出し先プログラム外に影響を与える処理が行われるものを処理区分引数としてその値と共に抽出し、その処理区分引数を持つ呼び出し先プログラムと共に検出し、検出した前記呼び出し先プログラムの処理のうち引数の内容に応じた処理のみを実行するプログラムを専用呼び出し先プログラムとして、前記引数と前記引数の内容毎に生成する専用呼び出し先プログラム生成部と、
前記変換前のプログラム群の呼び出し元プログラムの中の、前記呼び出し先プログラムを呼び出す呼び出し箇所を検出し、呼び出し箇所における処理区分引数に該当する変数の取り得る値を求め、変数の取り得る値が有限個に確定しない場合は呼び出し場所を書き換えずに終了し、有限個に確定する場合は呼び出し箇所における呼び出し先変更前の呼び出し先プログラムを、前記専用呼び出し先プログラム生成部により生成された専用呼び出し先プログラムを呼び出すように、前記呼び出し箇所を書き換えた変換後のプログラムを出力する呼び出し元プログラム書き換え部と、
を有するプログラム変換装置。
【請求項７】
請求項６に記載のプログラム変換装置において、
前記専用呼び出し先プログラム生成部は、前記呼び出し先プログラムのプログラム名と、前記引数の名前と、前記引数の内容とを用いて前記専用呼び出し先プログラムのプログラム名を生成し、
前記呼び出し元プログラム書き換え部は、前記呼び出し箇所を前記専用呼び出し先プログラムのプログラム名に書き換えることを特徴とするプログラム変換装置。
【請求項８】
呼び出し元プログラムと、前記呼び出し元プログラムが呼び出しに用いる引数の内容により異なる処理を行う呼び出し先プログラムとを含むプログラム群の変換をコンピュータが実行するプログラム変換方法であって、
コンピュータが、
変換前のプログラム群をコンピュータの記憶装置から取得するステップと、
取得した前記変換前のプログラム群から、前記呼び出し先プログラムの処理を異ならせる引数のうち、条件式で使用され、前記呼び出し先プログラム内で値が変更されておらず、分岐経路の実行の有無が該引数と定数との比較により決まり、該引数の影響を受ける分岐経路中で前記呼び出し先プログラム外に影響を与える処理が行われるものを処理区分引数としてその値と共に抽出し、その処理区分引数を持つ呼び出し先プログラムと共に検出する処理区分引数検出ステップと、
前記処理区分引数検出ステップで検出した前記呼び出し先プログラムの処理のうち引数の内容に応じた処理のみを実行するプログラムを専用呼び出し先プログラムとして、前記引数と前記引数の内容毎に生成する専用呼び出し先プログラム生成ステップと、
前記変換前のプログラム群の呼び出し元プログラムの中の、前記呼び出し先プログラムを呼び出す呼び出し箇所を検出し、呼び出し箇所における処理区分引数に該当する変数の取り得る値を求め、変数の取り得る値が有限個に確定しない場合は呼び出し場所を書き換えずに終了し、有限個に確定する場合は呼び出し箇所における呼び出し先変更前の呼び出し先プログラムを、前記専用呼び出し先プログラム生成ステップにより生成された専用呼び出し先プログラムを呼び出すように、前記呼び出し箇所を書き換えた変換後のプログラムを出力する呼び出し元プログラム書き換えステップと、
を実行するプログラム変換方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、引数の内容により処理が異なるプログラムの解析の容易にするプログラム変換プログラム、プログラム変換装置、プログラム変換方法に関するものである。
【背景技術】
【０００２】
企業の基幹業務をシステム化したような業務アプリケーションプログラムは、プログラムの規模が大きく、多くの人と時間を費やして開発されている。また、このようなプログラムは、長期にわたって保守、運用されており高い品質が要求されると共に、業務の変更などによる修正が頻繁に行われるという特徴を持つ。
【０００３】
このようなプログラムの保守については、いくつかの課題が存在する。まず、保守担当者の入れ替わりがあることから、属人的なスキルに頼ることができない。また、規模が大きいため、プログラムの全体像の把握が容易ではない。また、仕様書は、保守がおろそかになりプログラムの現状を正しく反映していないことが多い。更に、プログラムに修正を加える際には、修正による影響を知るために大規模なテストを行う必要がある。
【０００４】
これらの課題に対処するためには、プログラムを分析することによりプログラムの仕様書を生成する、あるいは、プログラム間の呼び出し関係やデータの関連などを抽出する、などの機能を持つリバースエンジニアリングツールが利用されている。例えば、プログラムの保守においてプログラムの処理内容を把握するために、プログラム内の処理経路やサブルーチンの呼び出し関係を呼び出し関係図として図示することが良く行われている、
【０００５】
図１は、アクセスルーチンを使用したプログラムの一例を示すソースコードである。このプログラムは、ＣＯＢＯＬ言語で書かれており、呼び出し元プログラムと呼び出し先プログラムからなる。ここで、呼び出し先プログラムはサブルーチンである。また、図１９は、従来のリバースエンジニアリングツールにより表示される呼び出し関係図の一例を示す図である。この呼び出し関係図は、図１のプログラムのものであり、従来のリバースエンジニアリングツールにより得られるものである。
【０００６】
図１のプログラムは、あるファイルにアクセスする機能が呼び出し先プログラムの一つのサブルーチンで実現されており、読み込み処理と書き込み処理などの入出力処理が処理区分を示す引数ＫＵＢＵＮによって切り替わる。このような場合、単に呼び出し関係図を見るだけでは、そこで読み込みが行われるのか書き込みが行われるのか判断ができない。例えば、図１９の呼び出し関係図からは、前処理からの呼び出しにおいてＯＰＥＮ処理だけが実行されるということが判断できないため、人間が該当箇所のソースコードを見て確認する必要がある。
【０００７】
このような図は、サブルーチン内の処理が一定である場合は有用であるが、サブルーチン内の処理が引数などによって大きく変わるような場合、呼び出し関係図だけでは実際にどのような処理が実行されるのかを把握することができないという問題がある。また、従来の静的分析ツールは、呼び出し関係図の表示だけでなく、データの入出力の分析など、様々な用途に用いられているが、このツールだけでは、処理区分を持ったプログラムの処理内容の把握ができないという大きな問題があり、開発・保守作業を阻害する大きな原因となっていた。
【０００８】
なお、本発明の関連ある従来技術として、例えば、下記に示す特許文献１が知られている。このプログラム解析装置及びプログラム解析方法及び記録媒体は、上述した課題を解決するために、呼び出し箇所における引数の値が特定可能かどうかを分析し、その値の場合に実行される経路だけを抽出し、呼び出し関係図を表示する。
【特許文献１】特開２００２−２１５３９１号公報
【発明の開示】
【発明が解決しようとする課題】
【０００９】
しかしながら、上述した特許文献１の技術は、正確な構文解析に基づいた複雑な分析を行う必要がある。従って、呼び出し関係図生成ツール、プログラム仕様書生成ツール、プログラム・データ関連情報抽出ツール、プログラム・データ関連情報抽出ツールなどの既存のリバースエンジニアリングツールを改造して特許文献１の技術を組み込むことは容易ではなく、一般には用いられていない。
【００１０】
また、呼び出し関係図を表示することはできても、上述した他のリバースエンジニアリングツールを利用することはできない。
【００１１】
本発明は上述した問題点を解決するためになされたものであり、引数の内容により処理が異なるプログラムを、解析の容易なプログラムに変換するプログラム変換プログラム、プログラム変換装置、プログラム変換方法を提供することを目的とする。
【課題を解決するための手段】
【００１２】
上述した課題を解決するため、本発明は、呼び出し元プログラムと呼び出し先プログラムを含み、前記呼び出し元プログラムが前記呼び出し先プログラムの呼び出しに用いる引数の内容により前記呼び出し先プログラムの処理が異なるプログラム群の変換をコンピュータに実行させるプログラム変換プログラムであって、前記プログラム群から、前記呼び出し先プログラムと前記呼び出し先プログラムの処理を異ならせる引数と該引数の内容とを検出し、前記呼び出し先プログラムの処理のうち引数の内容に応じた処理のみを実行するプログラムを専用呼び出し先プログラムとして、前記引数と前記引数の内容毎に生成する専用呼び出し先プログラム生成ステップと、前記プログラム群から、前記呼び出し先プログラムを呼び出す呼び出し箇所を検出し、前記専用呼び出し先プログラム生成ステップにより生成された専用呼び出し先プログラムを呼び出すように、前記呼び出し箇所を書き換える呼び出し元プログラム書き換えステップとをコンピュータに実行させるものである。
【００１３】
また、本発明に係るプログラム変換プログラムにおいて、前記呼び出し元プログラム書き換えステップは、前記呼び出し元プログラムにおいて前記呼び出し先プログラムの呼び出しに用いる引数の取り得る値を検出することにより、前記引数の取り得る値が限定できる場合、引数の取り得る値毎に対応する前記専用呼び出し先プログラムの呼び出しを行うように前記呼び出し箇所を書き換えることを特徴とするものである。
【００１４】
また、本発明に係るプログラム変換プログラムにおいて、前記専用呼び出し先プログラム生成ステップと前記呼び出し元書き換えステップは、前記引数と前記引数の内容に応じて生成される前記専用呼び出し先プログラム名を用いることを特徴とするものである。
【００１５】
また、本発明に係るプログラム変換プログラムにおいて、前記専用呼び出し先プログラム生成ステップは、前記呼び出し先プログラムの内容のうち、前記引数の内容に従って実行されない処理を削除することにより前記専用呼び出し先プログラムを生成することを特徴とするものである。
【００１６】
また、本発明に係るプログラム変換プログラムにおいて、前記引数の内容は、引数の値であり、前記呼び出し先プログラムは前記引数の値によって処理が異なり、前記専用呼び出し先プログラム生成ステップは前記引数の値毎の専用呼び出し先プログラムを生成することを特徴とするものである。
【００１７】
また、本発明に係るプログラム変換プログラムにおいて、前記引数の内容は、引数のクラスであり、前記呼び出し先プログラムは前記引数のクラスによって処理が異なり、前記専用呼び出し先プログラム生成ステップは前記引数のクラス毎の専用呼び出し先プログラムを生成することを特徴とするものである。
【００１８】
また、本発明は、呼び出し元プログラムと呼び出し先プログラムを含み、前記呼び出し元プログラムが前記呼び出し先プログラムの呼び出しに用いる引数の内容により前記呼び出し先プログラムの処理が異なるプログラム群の変換を行うプログラム変換装置であって、前記プログラム群から、前記呼び出し先プログラムと前記呼び出し先プログラムの処理を異ならせる引数と該引数の内容とを検出し、前記呼び出し先プログラムの処理のうち引数の内容に応じた処理のみを実行するプログラムを専用呼び出し先プログラムとして、前記引数と前記引数の内容毎に生成する専用呼び出し先プログラム生成部と、前記プログラム群から、前記呼び出し先プログラムを呼び出す呼び出し箇所を検出し、前記専用呼び出し先プログラム生成部により生成された専用呼び出し先プログラムを呼び出すように、前記呼び出し箇所を書き換える呼び出し元プログラム書き換え部とを備えたものである。
【００１９】
また、本発明に係るプログラム変換装置において、前記呼び出し元プログラム書き換え部は、前記呼び出し元プログラムにおいて前記呼び出し先プログラムの呼び出しに用いる引数の取り得る値を検出することにより、前記引数の取り得る値が限定できる場合、引数の取り得る値毎に対応する前記専用呼び出し先プログラムの呼び出しを行うように前記呼び出し箇所を書き換えることを特徴とするものである。
【００２０】
また、本発明に係るプログラム変換装置において、前記専用呼び出し先プログラム生成部と前記呼び出し元書き換え部は、前記引数と前記引数の内容に応じて生成される前記専用呼び出し先プログラム名を用いることを特徴とするものである。
【００２１】
また、本発明に係るプログラム変換装置において、前記専用呼び出し先プログラム生成部は、前記呼び出し先プログラムの内容のうち、前記引数の内容に従って実行されない処理を削除することにより前記専用呼び出し先プログラムを生成することを特徴とするものである。
【００２２】
また、本発明に係るプログラム変換装置において、前記引数の内容は、引数の値であり、前記呼び出し先プログラムは前記引数の値によって処理が異なり、前記専用呼び出し先プログラム生成部は前記引数の値毎の専用呼び出し先プログラムを生成することを特徴とするものである。
【００２３】
また、本発明に係るプログラム変換装置において、前記引数の内容は、引数のクラスであり、前記呼び出し先プログラムは前記引数のクラスによって処理が異なり、前記専用呼び出し先プログラム生成部は前記引数のクラス毎の専用呼び出し先プログラムを生成することを特徴とするものである。
【００２４】
また、本発明は、呼び出し元プログラムと呼び出し先プログラムを含み、前記呼び出し元プログラムが前記呼び出し先プログラムの呼び出しに用いる引数の内容により前記呼び出し先プログラムの処理が異なるプログラム群の変換を実行するプログラム変換方法であって、前記プログラム群から、前記呼び出し先プログラムと前記呼び出し先プログラムの処理を異ならせる引数と該引数の内容とを検出し、前記呼び出し先プログラムの処理のうち引数の内容に応じた処理のみを実行するプログラムを専用呼び出し先プログラムとして、前記引数と前記引数の内容毎に生成する専用呼び出し先プログラム生成ステップと、前記プログラム群から、前記呼び出し先プログラムを呼び出す呼び出し箇所を検出し、前記専用呼び出し先プログラム生成ステップにより生成された専用呼び出し先プログラムを呼び出すように、前記呼び出し箇所を書き換える呼び出し元プログラム書き換えステップとを実行するものである。
【発明の効果】
【００２５】
本発明のプログラム変換を行うことにより、ソースコード上で処理内容が理解しやすくなる。更に、プログラム変換の結果は、既存の静的分析ツールに手を加えることなく利用でき、より処理内容が理解しやすくなる。
【発明を実施するための最良の形態】
【００２６】
以下、本発明の実施の形態について図面を参照しつつ説明する。
【００２７】
実施の形態１．
本実施の形態では、ＣＯＢＯＬ言語で書かれたプログラムを変換するプログラム変換装置について説明する。
【００２８】
まず、本発明に係るプログラム変換装置の構成について説明する。
【００２９】
図２は、本発明に係るプログラム変換装置の構成の一例を示すブロック図である。このプログラム変換装置は、構文木生成部１１、引数検出部１２、専用ルーチン生成部１３、専用ルーチン一覧記憶部１４、呼び出し箇所検出部２１、呼び出し箇所書き換え部２２を備える。プログラム変換装置による変換前のプログラムの集合を変換前プログラム群、変換後のプログラムの集合を変換後プログラム群と呼ぶ。本実施の形態では、主に図１のプログラムを変換前プログラム群として説明する。
【００３０】
次に、本発明に係るプログラム変換装置の動作について説明する。
【００３１】
図３は、本発明に係るプログラム変換装置の動作の一例を示すフローチャートである。まず、構文木生成部１１は、変換前プログラムを取得し、構文木を生成する（Ｓ１０）。構文木生成部１１は、パーサとも呼ばれ、構文解析を行うことにより、プログラム中の全ての文を構文木として表す。この構文木を用いることにより、引数検出部１２と呼び出し箇所検出部２１は、処理区分引数プログラム中の変数、文の情報を参照することができる。図４は、構文木の一例を示すフローチャートである。この構文木は、図１の呼び出し先プログラムについて生成されたものである。
【００３２】
次に、引数検出部１２は、変換前プログラム群中の全てのプログラムから、処理区分引数、処理区分引数値、その処理区分引数を持つサブルーチンを検出する処理区分引数検出処理を行う（Ｓ１１）。次に、専用ルーチン生成部１３は、引数検出部１２により抽出された全てのサブルーチン、処理区分引数、処理区分引数値について専用サブルーチン生成処理が終了したか否かの判断を行う（Ｓ１２）。終了した場合（Ｓ１２，Ｙ）、処理Ｓ２１へ移行する。一方、終了していない場合（Ｓ１２，Ｎ）、専用ルーチン生成部１３は、次のサブルーチン、処理区分引数、処理区分引数値について専用サブルーチン生成処理を行い（Ｓ１３）、処理Ｓ１２へ戻る。
【００３３】
次に、呼び出し箇所定数検出部２１は、変換前プログラム群中の全てのプログラムから、専用ルーチン生成部１３により生成された全ての専用サブルーチンについて呼び出し箇所を検出する呼び出し箇所検出処理を行う（Ｓ１１）。次に、呼び出し箇所書き換え部２２は、呼び出し箇所検出部２１により検出された全ての呼び出し箇所について呼び出し箇所書き換え処理が終了したか否かの判断を行う（Ｓ２２）。終了した場合（Ｓ２２，Ｙ）、このフローを終了する。一方、終了していない場合（Ｓ２２，Ｎ）、呼び出し箇所書き換え部２２は、次の専用サブルーチンについて呼び出し箇所書き換え処理を行い（Ｓ２３）、処理Ｓ２２へ戻る。
【００３４】
次に、処理区分引数検出処理について説明する。
【００３５】
処理区分引数検出処理として、引数検出部１２は、サブルーチンにおいて引数の値がそのまま参照される場合に処理区分引数等の検出を行う処理区分引数検出処理と、サブルーチンにおいて引数の値が一旦別の変数に転送される場合に処理区分引数等の検出を行う第２の処理区分引数検出処理を行う。更に、引数の値に応じて別の変数の値を設定する場合を検出するようにしても良い。
【００３６】
図５は、本発明に係る第１の処理区分引数検出処理の動作の一例を示すフローチャートである。まず、引数検出部１２は、引数のうち条件式で使われているものを抽出する（Ｓ３１）。次に、引数検出部１２は、抽出された引数のうち、プログラム内で値が変更されていないものを抽出する（Ｓ３３）。次に、引数検出部１２は、抽出された引数のうち、分岐経路の実行の有無が引数と定数との比較により決まるものを抽出する（Ｓ３４）。次に、引数検出部１２は、抽出された引数のうち、引数の影響を受ける分岐経路中でプログラム外に影響を与える処理が行われるものを抽出し（Ｓ３５）、残った引数を処理区分引数とし、処理区分引数と共に、その処理区分引数の値、その処理区分引数を持つサブルーチンを出力し（Ｓ３６）、このフローを終了する。
【００３７】
図６は、本発明に係る第２の処理区分引数検出処理の動作の一例を示すフローチャートである。まず、引数検出部１２は、変数のうち条件式で使われているものを抽出する（Ｓ４１）。次に、引数検出部１２は、抽出された変数のうち、引数の値をそのまま設定しているものを抽出する（Ｓ４２）。次に、引数検出部１２は、抽出された変数のうち、プログラム内で値が変更されていないものを抽出する（Ｓ４３）。次に、引数検出部１２は、抽出された変数のうち、設定位置以降の分岐経路の実行の有無が変数と定数との比較により決まるものを抽出する（Ｓ４４）。次に、引数検出部１２は、抽出された変数のうち、変数の影響を受ける分岐経路中でプログラム外に影響を与える処理が行われるものを抽出し（Ｓ４５）、残った変数の代入元の引数を処理区分引数とし、処理区分引数と共に、その処理区分引数の値、その処理区分引数を持つサブルーチンを出力し（Ｓ４６）、このフローを終了する。
【００３８】
次に、専用サブルーチン生成処理について説明する。
【００３９】
ここで、引数検出部１２により検出された処理区分引数を持つサブルーチンを変換前サブルーチンと呼ぶ。専用サブルーチン生成処理として、引数の値が処理区分として用いられている変換前サブルーチンから専用サブルーチンを生成する第１の専用サブルーチン生成処理と、引数の値がそのまま別の専用サブルーチンの引数として用いられている変換前サブルーチンから専用サブルーチンを生成する第２の専用サブルーチン生成処理が行われる。
【００４０】
図７は、本発明に係る第１の専用サブルーチン生成処理の動作の一例を示すフローチャートである。まず、専用ルーチン生成部１３は、引数検出部１２により出力された処理区分引数とその値を一つ選択する（Ｓ５１）。次に、専用ルーチン生成部１３は、対象となる変換前サブルーチン名の末尾に、処理区分引数名と値の組み合わせを付加し、専用サブルーチン名を生成する（Ｓ５２）。次に、専用ルーチン生成部１３は、選択した処理区分と値の下で、実行されない分岐経路を検索する（Ｓ５３）。次に、専用ルーチン生成部１３は、実行されない分岐経路の処理内容を空にする（Ｓ５４）。次に、専用ルーチン生成部１３は、分岐経路が１つだけになった条件文を取り除き、残った分岐経路だけの経路にする（Ｓ５５）。次に、専用ルーチン生成部１３は、専用ルーチン一覧記憶部１４の専用ルーチン一覧にこの専用サブルーチンの情報を追加する（Ｓ５６）。次に、専用ルーチン生成部１３は、書き換えた内容を変換後プログラムとして出力し（Ｓ５７）、このフローを終了する。
【００４１】
なお、このフローでは、分岐経路が一意に確定する場合に、条件文を取り除くようにしているが、条件文にも実行の副作用がある言語においては、取り除かない。
【００４２】
また、複数の処理区分を持ったサブルーチンの場合、それぞれの値の組み合わせに対応した専用サブルーチンを生成するが、実際に呼び出されるものだけを選択し、変換後プログラムとして出力することで変換後プログラムの生成量を削減するようにしても良い。
【００４３】
図８は、本発明に係る第１の専用サブルーチン生成処理における変換前プログラムと変換後プログラムの一例を示すソースコードである。この例において、変換前プログラムは図１の呼び出し先プログラムである。上述した第１の専用サブルーチン生成処理により、処理区分引数の値毎に実行する処理内容だけを表した専用サブルーチンが生成され、変換後プログラムとして出力される。
【００４４】
図９は、本発明に係る第２の専用サブルーチン生成処理の動作の一例を示すフローチャートである。ここで、専用サブルーチン生成処理の対象となる変換前サブルーチンを対象変換前サブルーチンと呼び、対象変換前サブルーチンの呼び出し先である変換前サブルーチンを呼び出し先変換前サブルーチンと呼び、呼び出し先変換前サブルーチンを元に生成された専用サブルーチンを呼び出し先専用サブルーチンと呼ぶ。
【００４５】
まず、専用ルーチン生成部１３は、対象変換前サブルーチンが、呼び出し先専用サブルーチンの元となる呼び出し先変換前サブルーチンを呼び出しているか否かの判断を行う（Ｓ６１）。呼び出し先変換前サブルーチンを呼び出していない場合（Ｓ６１，Ｎ）、このフローを終了する。一方、呼び出し先変換前サブルーチンを呼び出している場合（Ｓ６１，Ｙ）、専用ルーチン生成部１３は、対象変換前サブルーチンへの引数が呼び出し先専用サブルーチンの処理区分に渡されているか否かの判断を行う（Ｓ６２）。
【００４６】
渡されていない場合（Ｓ６２，Ｎ）、このフローを終了する。一方、渡されている場合（Ｓ６２，Ｙ）、専用ルーチン生成部１３は、呼び出し先変換前サブルーチン名の末尾に、処理区分引数名と値の組み合わせを付加し、呼び出し先専用サブルーチン名を生成し（Ｓ６３）、呼び出し先専用サブルーチン名を呼び出すように呼び出し箇所を書き換える（Ｓ６４）。次に、専用ルーチン生成部１３は、専用ルーチン一覧記憶部１４の専用ルーチン一覧にこの専用サブルーチンの情報を追加する（Ｓ６５）。次に、専用ルーチン生成部１３は、書き換えた内容を変換後プログラムとして出力し（Ｓ６６）、このフローを終了する。
【００４７】
図１０は、本発明に係る第２の専用サブルーチン生成処理における変換前プログラムと変換後プログラムの一例を示すソースコードである。図１０の変換前プログラムは、呼び出されるときに渡された引数を、そのまま図８の変換前プログラムを呼び出すときの引数として渡すものである。上述した第２の専用サブルーチン生成処理により、処理区分引数の値毎に、対応する専用サブルーチンを呼び出す専用サブルーチンが生成され、変換後プログラムとして出力される。
【００４８】
図１１は、本発明に係る専用ルーチン一覧の一例を示す表である。専用ルーチン一覧記憶部１４に記憶される専用ルーチン一覧は、ルーチン名、引数位置、値、書き換えルーチン名の項目を持ち、これらの項目は処理区分引数とその値毎に記憶される。ルーチン名は、変換前プログラムにおけるサブルーチン名を表す。引数位置は、呼び出し先プログラムにおける引数のうち対象となる処理区分引数の位置を表す。値は、対象となる処理区分引数の値を表す。書き換えルーチン名は、専用ルーチン生成部１３により生成された、出力プログラムにおけるサブルーチン名を表す。
【００４９】
なお、サブルーチンのソースが得られない場合、あるいはサブルーチンが別言語で記述されており解析できない場合、ここまでの処理を行わずに、専用ルーチン一覧を外部で作成して与えることにより、以降の処理を行うようにしても良い。また、専用ルーチン一覧の内容を利用者に提示し、自動生成されたルーチン名の代わりに、利用者が内容を的確に表すルーチン名に変更した後で、以降の処理を行うようにしても良い。
【００５０】
次に、呼び出し箇所書き換え処理について説明する。
【００５１】
図１２は、本発明に係る呼び出し箇所書き換え処理の動作の一例を示すフローチャートである。ここで、呼び出し箇所書き換え処理の対象となる変換前プログラムを対象変換前プログラムと呼び、対象変換前プログラムの呼び出し先である変換前サブルーチンを呼び出し先変換前サブルーチンと呼び、呼び出し先変換前サブルーチンを元に生成された専用サブルーチンを呼び出し先専用サブルーチンと呼ぶ。
【００５２】
まず、呼び出し箇所書き換え部２２は、呼び出し箇所検出部２１により検出された、呼び出し先変換前サブルーチンを呼び出している箇所のうち１箇所を選択する（Ｓ７１）。次に、呼び出し箇所書き換え部２２は、選択した呼び出し箇所から実行経路を遡り、呼び出し箇所における処理区分引数に該当する変数の取り得る値を求める（Ｓ７２）。次に、呼び出し箇所書き換え部２２は、その変数の取り得る値が有限個に確定するか否かの判断を行う（Ｓ７３）。有限個に確定しない場合（Ｓ７３，Ｎ）、処理Ｓ７７へ移行する。一方、有限個に確定する場合（Ｓ７３，Ｙ）、呼び出し箇所書き換え部２２は、その変数の取り得る値が１個に確定するか否かの判断を行う（Ｓ７４）。
【００５３】
１個に確定する場合（Ｓ７４，Ｙ）、呼び出し箇所書き換え部２２は、専用ルーチン一覧記憶部１４に記憶された専用ルーチン一覧から、その変数の値に該当する専用サブルーチン名を取得する（Ｓ７５）。次に、呼び出し箇所書き換え部２２は、呼び出し箇所における呼び出し先変更前サブルーチン名を専用サブルーチン名に書き換え（Ｓ７６）、変換後プログラムとして出力し（Ｓ７７）、このフローを終了する。
【００５４】
図１３は、本発明に係る呼び出し箇所書き換え処理により出力される変換後プログラムの第１の例を示すソースコードである。この図は、処理区分引数に該当する変数の取り得る値が１個に確定する場合を表す。
【００５５】
一方、１個に確定しない場合（Ｓ７４，Ｎ）、呼び出し箇所書き換え部２２は、専用ルーチン一覧記憶部１４に記憶された専用ルーチン一覧から、その変数の値に該当する専用サブルーチン名を取得する（Ｓ７８）。次に、呼び出し箇所書き換え部２２は、呼び出し箇所をＥＶＡＬＵＡＴＥ文に書き換え、各分岐内の処理で専用サブルーチンを呼び出す文を実行するように書き換え（Ｓ７９）、処理Ｓ７７へ移行する。
【００５６】
図１４は、本発明に係る処理区分引数の値が複数個となる変換前プログラムの一例を示すソースコードである。図１５は、本発明に係る呼び出し箇所書き換え処理により出力される変換後プログラムの一例を示すソースコードである。この例では、処理区分引数に該当する変数の取り得る値が２と３に限定できることから、分岐によりそれぞれの専用サブルーチンを呼び出す処理に書き換えている。更に、呼び出し箇所書き換え部２２は、この図に示すように処理区分の値が変換後プログラム中のどこで設定されるのかをコメントとして付加しているが、付加しなくても良い。
【００５７】
図１６は、本発明に係るプログラム変換装置により出力される変換後プログラムの一例を示すソースコードである。この変換後プログラムは、図１の変換元プログラムからプログラム変換装置により得られたものであり、呼び出し元プログラムである図１３の変換後プログラムと呼び出し先プログラムである図８の変換後プログラムからなる。呼び出し先プログラムは、処理区分の値毎に専用サブルーチンとして表されたことにより、処理内容の把握が容易なプログラムとなっている。
【００５８】
また、呼び出し関係図生成ツールを用いてこの変換後プログラムから呼び出し関係図を作成することにより、処理内容の把握が容易な呼び出し関係図を生成することができる。図１７は、本発明に係る変換後プログラムを呼び出し関係図生成ツールに入力して得られる呼び出し関係図の一例を示す図である。変換前プログラムから生成される呼び出し関係図である図１９と比較すると、実行される処理内容だけが表されることにより、呼び出し関係図の無駄な表示が削減されると共に、処理内容の把握を容易にしている。
【００５９】
実施の形態２．
本実施の形態では、オブジェクト指向言語で書かれたプログラムを変換するプログラム変換装置について説明する。
【００６０】
図１８は、オブジェクト指向言語で書かれたプログラムについて本発明に係るプログラム変換装置による変換結果の一例を示すソースコードである。この例では、オーバーライドと呼ばれる、スーパークラスのメソッドと同じ名前のメソッドをサブクラスに定義することで処理内容を切り替える手法に対して、本発明のプログラム変換装置を適用する場合について述べる。
【００６１】
図１８の例において、スーパークラスｆｉｇｕｒｅを継承したサブクラスＣｉｒｃｌｅ，Ｂｏｘにおいてそれぞれ別の処理のＤｒａｗ（）メソッドが定義されている場合、ＡｄｄＦｉｇｕｒｅ（）から呼び出されるＤｒａｗ（）メソッドは、引数となるｆのクラスに依存している。本実施の形態におけるプログラム変換装置は、実施の形態１における専用サブルーチンと同様、それぞれのクラスに対応する専用メソッドＡｄｄＦｉｇｕｒｅ（Ｃｉｒｃｌｅ  ｆ），ＡｄｄＦｉｇｕｒｅ（Ｂｏｘ  ｆ）を生成する。更に、実施の形態１における引数に該当する変数の値と同様、ＡｄｄＦｉｇｕｒｅ（）の呼び出し箇所において引数に該当する変数のクラスが特定可能である場合、対応する専用メソッドを呼び出すようにキャストを追加することにより、呼び出し先の処理内容の特定が可能となる。
【００６２】
このように、本発明のプログラム変換装置は、実施の形態１で述べたＣＯＢＯＬ言語だけでなく、実施の形態２で述べたオブジェクト指向言語など、他の言語に適用することが可能である。
【００６３】
更に、プログラム変換装置を構成するコンピュータにおいて上述した各ステップを実行させるプログラムを、プログラム変換プログラムとして提供することができる。上述したプログラムは、コンピュータにより読取り可能な記録媒体に記憶させることによって、プログラム変換装置を構成するコンピュータに実行させることが可能となる。ここで、上記コンピュータにより読取り可能な記録媒体としては、ＲＯＭやＲＡＭ等のコンピュータに内部実装される内部記憶装置、ＣＤ−ＲＯＭやフレキシブルディスク、ＤＶＤディスク、光磁気ディスク、ＩＣカード等の可搬型記憶媒体や、コンピュータプログラムを保持するデータベース、或いは、他のコンピュータ並びにそのデータベースや、更に回線上の伝送媒体をも含むものである。
【００６４】
なお、専用呼び出し先プログラム生成部は、実施の形態における引数検出部と専用ルーチン生成部に対応する。また、呼び出し元プログラム書き換え部は、実施の形態における呼び出し箇所検出部と呼び出し箇所書き換え部に対応する。また、専用呼び出し先プログラム生成ステップは、実施の形態における処理Ｓ１１，Ｓ１２，Ｓ１３に対応する。また、呼び出し元プログラム書き換えステップは、実施の形態における処理Ｓ２１，Ｓ２２，Ｓ２３に対応する。
【００６５】
（付記１）  呼び出し元プログラムと呼び出し先プログラムを含み、前記呼び出し元プログラムが前記呼び出し先プログラムの呼び出しに用いる引数の内容により前記呼び出し先プログラムの処理が異なるプログラム群の変換をコンピュータに実行させるプログラム変換プログラムであって、
前記プログラム群から、前記呼び出し先プログラムと前記呼び出し先プログラムの処理を異ならせる引数と該引数の内容とを検出し、前記呼び出し先プログラムの処理のうち引数の内容に応じた処理のみを実行するプログラムを専用呼び出し先プログラムとして、前記引数と前記引数の内容毎に生成する専用呼び出し先プログラム生成ステップと、
前記プログラム群から、前記呼び出し先プログラムを呼び出す呼び出し箇所を検出し、前記専用呼び出し先プログラム生成ステップにより生成された専用呼び出し先プログラムを呼び出すように、前記呼び出し箇所を書き換える呼び出し元プログラム書き換えステップと、
をコンピュータに実行させるプログラム変換プログラム。
（付記２）  付記１に記載のプログラム変換プログラムにおいて、
前記呼び出し元プログラム書き換えステップは、前記呼び出し元プログラムにおいて前記呼び出し先プログラムの呼び出しに用いる引数の取り得る値を検出することにより、前記引数の取り得る値が限定できる場合、引数の取り得る値毎に対応する前記専用呼び出し先プログラムの呼び出しを行うように前記呼び出し箇所を書き換えることを特徴とするプログラム変換プログラム。
（付記３）  付記１または付記２に記載のプログラム変換プログラムにおいて、
前記専用呼び出し先プログラム生成ステップと前記呼び出し元書き換えステップは、前記引数と前記引数の内容に応じて生成される前記専用呼び出し先プログラム名を用いることを特徴とするプログラム変換プログラム。
（付記４）  付記１乃至付記３のいずれかに記載のプログラム変換プログラムにおいて、
前記専用呼び出し先プログラム生成ステップは、前記呼び出し先プログラムの内容のうち、前記引数の内容に従って実行されない処理を削除することにより前記専用呼び出し先プログラムを生成することを特徴とするプログラム変換プログラム。
（付記５）  付記１乃至付記４のいずれかに記載のプログラム変換プログラムにおいて、
前記引数の内容は、引数の値であり、前記呼び出し先プログラムは前記引数の値によって処理が異なり、前記専用呼び出し先プログラム生成ステップは前記引数の値毎の専用呼び出し先プログラムを生成することを特徴とするプログラム変換プログラム。
（付記６）  付記１乃至付記４のいずれかに記載のプログラム変換プログラムにおいて、
前記引数の内容は、引数のクラスであり、前記呼び出し先プログラムは前記引数のクラスによって処理が異なり、前記専用呼び出し先プログラム生成ステップは前記引数のクラス毎の専用呼び出し先プログラムを生成することを特徴とするプログラム変換プログラム。
（付記７）  呼び出し元プログラムと呼び出し先プログラムを含み、前記呼び出し元プログラムが前記呼び出し先プログラムの呼び出しに用いる引数の内容により前記呼び出し先プログラムの処理が異なるプログラム群の変換を行うプログラム変換装置であって、
前記プログラム群から、前記呼び出し先プログラムと前記呼び出し先プログラムの処理を異ならせる引数と該引数の内容とを検出し、前記呼び出し先プログラムの処理のうち引数の内容に応じた処理のみを実行するプログラムを専用呼び出し先プログラムとして、前記引数と前記引数の内容毎に生成する専用呼び出し先プログラム生成部と、
前記プログラム群から、前記呼び出し先プログラムを呼び出す呼び出し箇所を検出し、前記専用呼び出し先プログラム生成部により生成された専用呼び出し先プログラムを呼び出すように、前記呼び出し箇所を書き換える呼び出し元プログラム書き換え部と、
を備えてなるプログラム変換装置。
（付記８）  付記７に記載のプログラム変換装置において、
前記呼び出し元プログラム書き換え部は、前記呼び出し元プログラムにおいて前記呼び出し先プログラムの呼び出しに用いる引数の取り得る値を検出することにより、前記引数の取り得る値が限定できる場合、引数の取り得る値毎に対応する前記専用呼び出し先プログラムの呼び出しを行うように前記呼び出し箇所を書き換えることを特徴とするプログラム変換装置。
（付記９）  付記７または付記８に記載のプログラム変換装置において、
前記専用呼び出し先プログラム生成部と前記呼び出し元書き換え部は、前記引数と前記引数の内容に応じて生成される前記専用呼び出し先プログラム名を用いることを特徴とするプログラム変換装置。
（付記１０）  付記７乃至付記９のいずれかに記載のプログラム変換装置において、
前記専用呼び出し先プログラム生成部は、前記呼び出し先プログラムの内容のうち、前記引数の内容に従って実行されない処理を削除することにより前記専用呼び出し先プログラムを生成することを特徴とするプログラム変換装置。
（付記１１）  付記７乃至付記１０のいずれかに記載のプログラム変換装置において、
前記引数の内容は、引数の値であり、前記呼び出し先プログラムは前記引数の値によって処理が異なり、前記専用呼び出し先プログラム生成部は前記引数の値毎の専用呼び出し先プログラムを生成することを特徴とするプログラム変換装置。
（付記１２）  付記７乃至付記１０のいずれかに記載のプログラム変換装置において、
前記引数の内容は、引数のクラスであり、前記呼び出し先プログラムは前記引数のクラスによって処理が異なり、前記専用呼び出し先プログラム生成部は前記引数のクラス毎の専用呼び出し先プログラムを生成することを特徴とするプログラム変換装置。
（付記１３）  呼び出し元プログラムと呼び出し先プログラムを含み、前記呼び出し元プログラムが前記呼び出し先プログラムの呼び出しに用いる引数の内容により前記呼び出し先プログラムの処理が異なるプログラム群の変換を実行するプログラム変換方法であって、
前記プログラム群から、前記呼び出し先プログラムと前記呼び出し先プログラムの処理を異ならせる引数と該引数の内容とを検出し、前記呼び出し先プログラムの処理のうち引数の内容に応じた処理のみを実行するプログラムを専用呼び出し先プログラムとして、前記引数と前記引数の内容毎に生成する専用呼び出し先プログラム生成ステップと、
前記プログラム群から、前記呼び出し先プログラムを呼び出す呼び出し箇所を検出し、前記専用呼び出し先プログラム生成ステップにより生成された専用呼び出し先プログラムを呼び出すように、前記呼び出し箇所を書き換える呼び出し元プログラム書き換えステップと、
を実行するプログラム変換方法。
（付記１４）  付記１３に記載のプログラム変換方法において、
前記呼び出し元プログラム書き換えステップは、前記呼び出し元プログラムにおいて前記呼び出し先プログラムの呼び出しに用いる引数の取り得る値を検出することにより、前記引数の取り得る値が限定できる場合、引数の取り得る値毎に対応する前記専用呼び出し先プログラムの呼び出しを行うように前記呼び出し箇所を書き換えることを特徴とするプログラム変換方法。
（付記１５）  付記１３または付記１４に記載のプログラム変換方法において、
前記専用呼び出し先プログラム生成ステップと前記呼び出し元書き換えステップは、前記引数と前記引数の内容に応じて生成される前記専用呼び出し先プログラム名を用いることを特徴とするプログラム変換方法。
（付記１６）  付記１３乃至付記１５のいずれかに記載のプログラム変換方法において、
前記専用呼び出し先プログラム生成ステップは、前記呼び出し先プログラムの内容のうち、前記引数の内容に従って実行されない処理を削除することにより前記専用呼び出し先プログラムを生成することを特徴とするプログラム変換方法。
（付記１７）  付記１３乃至付記１６のいずれかに記載のプログラム変換方法において、
前記引数の内容は、引数の値であり、前記呼び出し先プログラムは前記引数の値によって処理が異なり、前記専用呼び出し先プログラム生成ステップは前記引数の値毎の専用呼び出し先プログラムを生成することを特徴とするプログラム変換方法。
（付記１８）  付記１３乃至付記１６のいずれかに記載のプログラム変換方法において、
前記引数の内容は、引数のクラスであり、前記呼び出し先プログラムは前記引数のクラスによって処理が異なり、前記専用呼び出し先プログラム生成ステップは前記引数のクラス毎の専用呼び出し先プログラムを生成することを特徴とするプログラム変換方法。
【図面の簡単な説明】
【００６６】
【図１】アクセスルーチンを使用したプログラムの一例を示すソースコードである。
【図２】本発明に係るプログラム変換装置の構成の一例を示すブロック図である。
【図３】本発明に係るプログラム変換装置の動作の一例を示すフローチャートである。
【図４】構文木の一例を示すフローチャートである。
【図５】本発明に係る第１の処理区分引数検出処理の動作の一例を示すフローチャートである。
【図６】本発明に係る第２の処理区分引数検出処理の動作の一例を示すフローチャートである。
【図７】本発明に係る第１の専用サブルーチン生成処理の動作の一例を示すフローチャートである。
【図８】本発明に係る第１の専用サブルーチン生成処理における変換前プログラムと変換後プログラムの一例を示すソースコードである。
【図９】本発明に係る第２の専用サブルーチン生成処理の動作の一例を示すフローチャートである。
【図１０】本発明に係る第２の専用サブルーチン生成処理における変換前プログラムと変換後プログラムの一例を示すソースコードである。
【図１１】本発明に係る専用ルーチン一覧の一例を示す表である。
【図１２】本発明に係る呼び出し箇所書き換え処理の動作の一例を示すフローチャートである。
【図１３】本発明に係る呼び出し箇所書き換え処理により出力される変換後プログラムの第１の例を示すソースコードである。
【図１４】本発明に係る処理区分引数の値が複数個となる変換前プログラムの一例を示すソースコードである。
【図１５】本発明に係る呼び出し箇所書き換え処理により出力される変換後プログラムの一例を示すソースコードである。
【図１６】本発明に係るプログラム変換装置により出力される変換後プログラムの一例を示すソースコードである。
【図１７】本発明に係る変換後プログラムを呼び出し関係図生成ツールに入力して得られる呼び出し関係図の一例を示す図である。
【図１８】オブジェクト指向言語で書かれたプログラムについて本発明に係るプログラム変換装置による変換結果の一例を示すソースコードである。
【図１９】従来のリバースエンジニアリングツールにより表示される呼び出し関係図の一例を示す図である。
【符号の説明】
【００６７】
１１  構文木生成部、１２  引数検出部、１３  専用ルーチン生成部、１４  専用ルーチン一覧記憶部、２１  呼び出し箇所検出部、２２  呼び出し箇所書き換え部。
【図１】
0004712512.tif 000002
【図２】
0004712512.tif 000003
【図３】
0004712512.tif 000004
【図４】
0004712512.tif 000005
【図５】
0004712512.tif 000006
【図６】
0004712512.tif 000007
【図７】
0004712512.tif 000008
【図８】
0004712512.tif 000009
【図９】
0004712512.tif 000010
【図１０】
0004712512.tif 000011
【図１１】
0004712512.tif 000012
【図１２】
0004712512.tif 000013
【図１３】
0004712512.tif 000014
【図１４】
0004712512.tif 000015
【図１５】
0004712512.tif 000016
【図１６】
0004712512.tif 000017
【図１７】
0004712512.tif 000018
【図１８】
0004712512.tif 000019
【図１９】
0004712512.tif 000020