(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024142008
(43)【公開日】2024-10-10
(54)【発明の名称】検証プログラム、検証方法、および情報処理装置
(51)【国際特許分類】
G06F 11/36 20060101AFI20241003BHJP
【FI】
G06F11/36 192
【審査請求】未請求
【請求項の数】8
【出願形態】OL
(21)【出願番号】P 2023053942
(22)【出願日】2023-03-29
(71)【出願人】
【識別番号】000005223
【氏名又は名称】富士通株式会社
(74)【代理人】
【識別番号】110002918
【氏名又は名称】弁理士法人扶桑国際特許事務所
(72)【発明者】
【氏名】大畑 貴史
(72)【発明者】
【氏名】浦本 貴正
【テーマコード(参考)】
5B042
【Fターム(参考)】
5B042HH30
5B042HH32
5B042JJ17
5B042JJ29
5B042MA08
5B042MA14
5B042MC02
5B042MC40
(57)【要約】
【課題】非互換動作の解消を容易にできるようにする。
【解決手段】情報処理装置10は、第1のデータ変更命令による変更内容を記録させる第1の記録命令を追加した第1の実行プログラム2を第1のプログラム実行環境12aで実行させることで第1のデータ変更履歴6を取得する。次に情報処理装置10は、第2の実行プログラム3に、第2のデータ変更命令による第2の変更内容を記録させる第2の記録命令と非互換検出命令とを追加する。非互換検出命令は、第2のデータ変更履歴7と第1のデータ変更履歴6とに基づいて非互換情報8を出力させ、第2のデータ変更命令による第2のデータ5の変更後の値を修正させる非互換検出命令を追加する命令である。そして情報処理装置10は、第2のプログラム実行環境12bで第2の実行プログラム3を実行させることで、非互換情報8を取得する。
【選択図】
図1
【特許請求の範囲】
【請求項1】
データの値を変更する検証対象命令を含む第1の検証対象プログラムを第1のプログラム実行環境用に翻訳した第1の実行プログラムに、前記検証対象命令を翻訳した第1のデータ変更命令による変更内容を記録させる第1の記録命令を追加し、
前記第1のプログラム実行環境で前記第1の実行プログラムを実行させることで、前記第1のデータ変更命令により変更された第1のデータの値の変更内容が記録された第1のデータ変更履歴を取得し、
前記第1の検証対象プログラムに基づいて生成された第2の検証対象プログラムを第2のプログラム実行環境用に翻訳した第2の実行プログラムに、前記検証対象命令を翻訳した第2のデータ変更命令による変更内容を記録させる第2の記録命令を追加し、
前記第2の実行プログラムに、前記第2のデータ変更命令による第2のデータの値の変更内容を示す第2のデータ変更履歴と前記第1のデータ変更履歴とに基づいて実行環境の違いに起因する非互換動作を検出させ、前記非互換動作を検出した場合に、前記非互換動作の発生箇所を示す非互換情報を出力させると共に、前記第1のデータ変更命令による前記第1のデータの変更後の値に基づいて前記第2のデータ変更命令による前記第2のデータの変更後の値を修正させる非互換検出命令を追加し、
前記第2のプログラム実行環境で前記第2の実行プログラムを実行させることで、前記非互換情報を取得する、
処理をコンピュータに実行させる検証プログラム。
【請求項2】
前記非互換検出命令を追加する処理では、前記第1のデータ変更命令による前記第1のデータの変更後の値のデータ形式を変換し、変換後の値に前記第2のデータの値を修正させる前記非互換検出命令を追加する、
請求項1記載の検証プログラム。
【請求項3】
前記第1の記録命令を追加する処理では、前記第1のデータ変更命令による変更内容に対して前記第1の検証対象プログラム内での前記検証対象命令の行番号を含めて、前記第1のデータ変更命令による変更内容を記録させる前記第1の記録命令を追加し、
前記第2の記録命令を追加する処理では、前記第2のデータ変更命令による変更内容に対して前記第2の検証対象プログラム内での前記検証対象命令の行番号を含めて、前記第2のデータ変更命令による変更内容を記録させる前記第2の記録命令を追加し、
前記非互換情報を取得する処理では、前記非互換検出命令の実行時に、前記第1の検証対象プログラムと前記第2の検証対象プログラムとの間の行の対応関係を示す行対応情報における行番号間の対応関係に基づいて、前記非互換動作の検出時に前記第2のデータ変更履歴と比較する前記第1のデータ変更履歴を特定する、
請求項1記載の検証プログラム。
【請求項4】
前記非互換情報を取得する処理では、前記行対応情報において、前記第2のデータ変更履歴に含まれる行番号に対応する、前記第1の検証対象プログラム内での前記検証対象命令の行番号がない場合、前記非互換動作を検出する処理の実行を抑止する、
請求項3記載の検証プログラム。
【請求項5】
前記第1の検証対象プログラムと前記第2の検証対象プログラムとを比較して前記行対応情報を生成する処理を、
前記コンピュータにさらに実行させる請求項3記載の検証プログラム。
【請求項6】
前記非互換情報を取得する処理では、前記非互換検出命令の実行により前記非互換動作を検出した後も前記第2の実行プログラムの実行を継続し、前記非互換検出命令が実行対象となるごとに前記非互換動作の検出を行い、1または複数の前記非互換動作を示す前記非互換情報を取得する、
請求項1から5までのいずれかに記載の検証プログラム。
【請求項7】
データの値を変更する検証対象命令を含む第1の検証対象プログラムを第1のプログラム実行環境用に翻訳した第1の実行プログラムに、前記検証対象命令を翻訳した第1のデータ変更命令による変更内容を記録させる第1の記録命令を追加し、
前記第1のプログラム実行環境で前記第1の実行プログラムを実行させることで、前記第1のデータ変更命令により変更された第1のデータの値の変更内容が記録された第1のデータ変更履歴を取得し、
前記第1の検証対象プログラムに基づいて生成された第2の検証対象プログラムを第2のプログラム実行環境用に翻訳した第2の実行プログラムに、前記検証対象命令を翻訳した第2のデータ変更命令による変更内容を記録させる第2の記録命令を追加し、
前記第2の実行プログラムに、前記第2のデータ変更命令による第2のデータの値の変更内容を示す第2のデータ変更履歴と前記第1のデータ変更履歴とに基づいて実行環境の違いに起因する非互換動作を検出させ、前記非互換動作を検出した場合に、前記非互換動作の発生箇所を示す非互換情報を出力させると共に、前記第1のデータ変更命令による前記第1のデータの変更後の値に基づいて前記第2のデータ変更命令による前記第2のデータの変更後の値を修正させる非互換検出命令を追加し、
前記第2のプログラム実行環境で前記第2の実行プログラムを実行させることで、前記非互換情報を取得する、
処理をコンピュータが実行する検証方法。
【請求項8】
データの値を変更する検証対象命令を含む第1の検証対象プログラムを第1のプログラム実行環境用に翻訳した第1の実行プログラムに、前記検証対象命令を翻訳した第1のデータ変更命令による変更内容を記録させる第1の記録命令を追加し、前記第1のプログラム実行環境で前記第1の実行プログラムを実行させることで、前記第1のデータ変更命令により変更された第1のデータの値の変更内容が記録された第1のデータ変更履歴を取得し、前記第1の検証対象プログラムに基づいて生成された第2の検証対象プログラムを第2のプログラム実行環境用に翻訳した第2の実行プログラムに、前記検証対象命令を翻訳した第2のデータ変更命令による変更内容を記録させる第2の記録命令を追加し、前記第2の実行プログラムに、前記第2のデータ変更命令による第2のデータの値の変更内容を示す第2のデータ変更履歴と前記第1のデータ変更履歴とに基づいて実行環境の違いに起因する非互換動作を検出させ、前記非互換動作を検出した場合に、前記非互換動作の発生箇所を示す非互換情報を出力させると共に、前記第1のデータ変更命令による前記第1のデータの変更後の値に基づいて前記第2のデータ変更命令による前記第2のデータの変更後の値を修正させる非互換検出命令を追加し、前記第2のプログラム実行環境で前記第2の実行プログラムを実行させることで、前記非互換情報を取得する処理部、
を有する情報処理装置。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、検証プログラム、検証方法、および情報処理装置に関する。
【背景技術】
【0002】
業務に使用されるアプリケーションソフトウェア(以下、単に「アプリケーション」と呼ぶ)の中には、古くに開発され、現在も運用され続けているものがある。特にCOBOL言語で記述されたアプリケーションにはそのようなものが多い。
【0003】
それに対して、アプリケーションを実行する実行環境(ハードウェア、OS(Operating System)、文字コード体系など)は、時代と共に変遷する。そのため長期にわたって同じアプリケーションを運用し続けるために、実行環境の変化に合わせたアプリケーションの新たな実行環境への移行作業が行われる。
【0004】
新たな実行環境へアプリケーションを移行させる場合、アプリケーションを大きく改修することなく実行環境の切り替えのみで移行できることが望まれる。しかし、移行前後の実行環境で取り扱うデータのデータ形式(CPU(Central Processing Unit)のビット幅、エンディアン、浮動小数点形式、文字コードなど)が異なる場合がある。この場合、アプリケーションのプログラムの処理ロジックに変更がなくとも、データ形式の違いに起因して、アプリケーション実行時に意図しない動作(非互換動作)が発生する可能性がある。そのため運用者は、アプリケーションの実行環境を変更する場合、移行先環境での動作検証を行うこととなる。
【0005】
移行先環境での動作検証には、プログラムの動作検証を支援する技術が利用できる。プログラムの動作検証を支援する技術としては、例えば、プログラムの実行時のエラーの原因となるデータが設定されている箇所を特定する技術が提案されている。
【先行技術文献】
【特許文献】
【0006】
【発明の概要】
【発明が解決しようとする課題】
【0007】
アプリケーション実行時に発生する非互換動作は、1箇所に留まらず、複数の箇所で発生する可能性がある。また、移行先のアプリケーション実行時に非互換動作が発生すると、それ以後はそのアプリケーションを正常に実行することができない。そのため非互換動作の発生箇所が複数ある場合には、非互換動作の発生箇所の検出とプログラム修正とを交互に繰り返し行わなければすべての非互換動作の発生箇所を検出することができない。その結果、非互換動作の解消に時間がかかっている。
【0008】
1つの側面では、本件は、非互換動作の解消を容易にできるようにすることを目的とする。
【課題を解決するための手段】
【0009】
1つの案では、以下の処理をコンピュータに実行させる検証プログラムが提供される。
コンピュータは、データの値を変更する検証対象命令を含む第1の検証対象プログラムを第1のプログラム実行環境用に翻訳した第1の実行プログラムに、検証対象命令を翻訳した第1のデータ変更命令による変更内容を記録させる第1の記録命令を追加する。コンピュータは、第1のプログラム実行環境で第1の実行プログラムを実行させることで、第1のデータ変更命令により変更された第1のデータの値の変更内容が記録された第1のデータ変更履歴を取得する。コンピュータは、第1の検証対象プログラムに基づいて生成された第2の検証対象プログラムを第2のプログラム実行環境用に翻訳した第2の実行プログラムに、検証対象命令を翻訳した第2のデータ変更命令による変更内容を記録させる第2の記録命令を追加する。コンピュータは、第2の実行プログラムに、第2のデータ変更命令による第2のデータの値の変更内容を示す第2のデータ変更履歴と第1のデータ変更履歴とに基づいて実行環境の違いに起因する非互換動作を検出させ、非互換動作を検出した場合に、非互換動作の発生箇所を示す非互換情報を出力させると共に、第1のデータ変更命令による第1のデータの変更後の値に基づいて第2のデータ変更命令による第2のデータの変更後の値を修正させる非互換検出命令を追加する。そしてコンピュータは、第2のプログラム実行環境で第2の実行プログラムを実行させることで、非互換情報を取得する。
【発明の効果】
【0010】
1態様によれば、非互換動作の解消が容易となる。
【図面の簡単な説明】
【0011】
【
図1】第1の実施の形態に係る検証方法の一例を示す図である。
【
図2】第2の実施の形態のシステム構成の一例を示す図である。
【
図3】開発マシンのハードウェアの一例を示す図である。
【
図5】修正されたソースファイルの一例を示す図である。
【
図6】ソースファイルが修正された場合のデータ変更履歴の一例を示す図である。
【
図7】アプリケーションの動作検証のために開発システムが有する機能の一例を示す図である。
【
図8】実行ファイルの生成状況の一例を示す図である。
【
図9】移行元環境の開発マシンにおける処理の一例を示すフローチャートである。
【
図10】移行元環境におけるコンパイル処理の手順の一例を示すフローチャートである。
【
図11】移行元環境におけるコンパイル結果の一例を示す図である。
【
図12】移行先環境の開発マシンにおける処理の一例を示すフローチャートである。
【
図13】移行先環境におけるコンパイル処理の手順の一例を示すフローチャートである。
【
図14】移行先環境におけるコンパイル結果の一例を示す図である。
【
図15】生成される行対応情報の第1の例を示す図である。
【
図16】行対応情報に基づいて特定される比較対象のログレコードの第1の例を示す図である。
【
図17】生成される行対応情報の第2の例を示す図である。
【
図18】行対応情報に基づいて特定される比較対象のログレコードの第2の例を示す図である。
【
図19】移行元と移行先との実行部の機能の一例を示すブロック図である。
【
図20】データ変更履歴の比較処理の一例を示す図である。
【
図21】プログラム実行処理の手順の一例を示すフローチャートである。
【
図22】データ変更履歴比較処理の手順の一例を示すフローチャートである。
【
図23】データ比較処理の第1の例を示す図である。
【
図24】データ修正処理の手順の一例を示すフローチャートである。
【
図25】非互換データの値の修正処理の一例を示す図である。
【発明を実施するための形態】
【0012】
以下、本実施の形態について図面を参照して説明する。なお各実施の形態は、矛盾のない範囲で複数の実施の形態を組み合わせて実施することができる。
〔第1の実施の形態〕
第1の実施の形態は、プログラムの実行環境を移行させる際に、データ形式の違いに起因する非互換動作の解消を容易にできるようにする検証方法である。
【0013】
図1は、第1の実施の形態に係る検証方法の一例を示す図である。
図1には、検証方法を実現する情報処理装置10の例を示している。情報処理装置10は、検証プログラムを実行することにより、第1の実施の形態に係る検証方法を実施することができる。
【0014】
情報処理装置10は、記憶部11と処理部12とを有する。記憶部11は、例えば情報処理装置10が有するメモリまたはストレージ装置である。処理部12は、例えば情報処理装置10が有するプロセッサまたは演算回路である。
【0015】
記憶部11は、第1の検証対象プログラム1aと第2の検証対象プログラム1bとを記憶する。第1の検証対象プログラム1aは、例えば高級言語で記述されたソースプログラムである。第1の検証対象プログラム1aには、データの値を変更する検証対象命令が含まれる。第2の検証対象プログラム1bは、第1の検証対象プログラム1aに基づいて生成されたソースプログラムである。第2の検証対象プログラム1bにも検証対象命令が含まれる。例えば第2の検証対象プログラム1bは、第1の検証対象プログラム1aのコピーである。または第2の検証対象プログラム1bは、第1の検証対象プログラム1aのコピーに修正(命令文の追加または削除など)を行ったものである。
【0016】
処理部12は、第1のプログラム実行環境12aと第2のプログラム実行環境12bとを有する。処理部12は、例えば第1の検証対象プログラム1aを第1のプログラム実行環境12a用に翻訳(コンパイルと呼ぶこともある)するコンパイラと、第2のプログラム実行環境12b用に翻訳するコンパイラとを有する。
【0017】
第1のプログラム実行環境12aと第2のプログラム実行環境12bとは、ハードウェア、OSなどを含めたプログラムの実行環境である。第1のプログラム実行環境12aと第2のプログラム実行環境12bとは、例えば仮想マシンを用いて実現することができる。また情報処理装置10が複数のコンピュータを含むコンピュータシステムであれば、第1のプログラム実行環境12aと第2のプログラム実行環境12bとを異なるコンピュータ上に実現してもよい。また第1のプログラム実行環境12aと第2のプログラム実行環境12bとは、主として取り扱うデータのデータ形式(CPUのビット幅、エンディアン、浮動小数点形式、文字コードなど)が異なる。
【0018】
ここで、第1の検証対象プログラム1aを第1のプログラム実行環境12a用に翻訳した第1の実行プログラム2を用いて第1のプログラム実行環境12aで運用しているサービスを、第2のプログラム実行環境12bに移行させる場合を想定する。この場合、ユーザは、第2の検証対象プログラム1bを第2のプログラム実行環境12b用に翻訳した第2の実行プログラム3が正常に動作するかの動作検証を行う。動作検証では、ユーザは、処理部12に以下の処理を実行させる。
【0019】
処理部12は、第1の検証対象プログラム1aを第1のプログラム実行環境12a用に翻訳した第1の実行プログラム2に第1の記録命令を追加する。第1の記録命令は、検証対象命令を翻訳した第1のデータ変更命令による変更内容を、第1のプログラム実行環境12aに記録させる命令である。そして処理部12は、第1のプログラム実行環境12aで第1の実行プログラム2を実行させることで、第1のデータ変更命令により変更された第1のデータ4の値の変更内容が記録された第1のデータ変更履歴6を取得する。
【0020】
また処理部12は、第2の検証対象プログラム1bを第2のプログラム実行環境12b用に翻訳した第2の実行プログラム3に、検証対象命令を翻訳した第2のデータ変更命令による変更内容を記録させる第2の記録命令を追加する。
【0021】
さらに処理部12は、第2の実行プログラム3の第2の記録命令の後に非互換検出命令を追加する。非互換検出命令は、次の一連の処理(非互換検出処理)の実行命令である。第1の処理は、第2のデータ変更命令による第2のデータ5の値の変更内容を示す第2のデータ変更履歴7と第1のデータ変更履歴6とに基づいて実行環境の違いに起因する非互換動作を検出させる処理である。第2の処理は、非互換動作を検出した場合に、検出した非互換動作の発生箇所を示す非互換情報8を出力させる処理である。第3の処理は、非互換動作を検出した場合に、第1のデータ変更命令による第1のデータ4の変更後の値に基づいて第2のデータ変更命令による第2のデータ5の変更後の値を修正させる処理である。
【0022】
そして処理部12は、第2のプログラム実行環境12bで第2の実行プログラム3を実行させることで、非互換情報8を取得する。
このような情報処理装置10によれば、移行元環境用の第1の実行プログラム2には、第1のデータ変更命令の後に第1の記録命令が追加される。また移行先環境用の第2の実行プログラム3には、第2のデータ変更命令の後に第2の記録命令に加えて、非互換検出命令が追加される。第1のプログラム実行環境12aで第1の実行プログラム2が実行されると、第1のデータ変更履歴6が取得される。また第2のプログラム実行環境12bで第2の実行プログラムが実行されると、非互換検出処理が実行され、検出された非互換動作を示す非互換情報8が生成される。このとき、非互換動作により誤った値が設定された第2のデータ5は、第1のデータ変更履歴6に基づいて正しい値に修正される。
【0023】
ユーザは、情報処理装置10に第2の実行プログラム3を実行させることで非互換情報8を取得することができる。そしてユーザは、非互換情報8の内容を確認することで、非互換動作を容易に解消できる。
【0024】
また処理部12は、第2の実行プログラム3の実行中に非互換動作の検出を動的に行い、非互換動作が検出されたときに不正な値を修正するようにしたことで、非互換動作の発生箇所以降の処理について正しく実行することができる。そのため処理部12は、第2の実行プログラム3の動作検証中に非互換操作を検出した場合であっても、第2の実行プログラム3の実行を中止せずに済み、検証を継続できる。
【0025】
例えば処理部12は、非互換検出命令の実行により非互換動作を検出した後も第2の実行プログラム3の実行を継続する。そして処理部12は、非互換検出命令が実行対象となるごとに非互換動作の検出を行い、1または複数の非互換動作を示す非互換情報8を取得することができる。これにより、非互換動作の発生箇所が複数ある場合においても、一回の第2の実行プログラム3の実行で、複数の非互換動作の検出が可能である。その結果、複数の非互換動作それぞれの検出が容易となる。
【0026】
非互換動作は、例えば移行元環境と移行先環境とのデータ形式の違いが、第2の実行プログラム3に反映されない場合に生じる。そこで処理部12は、非互換検出命令として、例えば非互換動作を検出した場合に、第1のデータ変更命令による第1のデータ4の変更後の値のデータ形式を変換し、第2のデータ5の値を変換後の値に修正させる非互換検出命令を追加する。これにより処理部12は、移行元環境と移行先環境とのデータ形式の違いが反映されずに第2の実行プログラム3が生成された場合、第2の実行プログラム3の実行時にデータ形式の違いによる不正な値を動的に修正できる。
【0027】
第1のデータ変更履歴6と第2のデータ変更履歴7とには、例えば第1の検証対象プログラム1aまたは第2の検証対象プログラム1b内での検証対象命令の行番号が含まれる。第2の検証対象プログラム1bが第1の検証対象プログラム1aのコピーであれば、第1の検証対象プログラム1aと第2の検証対象プログラム1bとの検証対象命令の行番号は同じとなる。この場合、処理部12は、非互換検出処理において、第2のデータ変更履歴7と同じ行番号の第1のデータ変更履歴6を用いて、非互換を検出する。
【0028】
第2の検証対象プログラム1bが、第1の検証対象プログラム1aのコピーに対して修正を加えたものである場合もある。この場合、処理部12は、例えば第1の検証対象プログラム1aと第2の検証対象プログラム1bとの間の行の対応関係を示す行対応情報に基づいて非互換動作を検出する。
【0029】
例えば処理部12は、第1のデータ変更命令による変更内容に対して第1の検証対象プログラム1a内での検証対象命令の行番号を含めて、第1のデータ変更命令による変更内容を記録させる第1の記録命令を追加する。また処理部12は、第2のデータ変更命令による変更内容に対して第2の検証対象プログラム1b内での検証対象命令の行番号を含めて、第2のデータ変更命令による変更内容を記録させる第2の記録命令を追加する。さらに処理部12は、非互換検出命令の実行時に、行対応情報に基づいて、非互換動作の検出時に第2のデータ変更履歴7と比較する第1のデータ変更履歴6を特定する。
【0030】
これにより、処理部12は、第2の検証対象プログラム1bが、第1の検証対象プログラム1aのコピーに対して修正を加えたものであっても、非互換動作を正しく検出し、その非互換動作を示す非互換情報8を出力することができる。
【0031】
なお、第2の検証対象プログラム1bにおいて、第1の検証対象プログラム1aには含まれないデータ変更命令が含まれる場合もある。このような追加されたデータ変更命令については、非互換検出処理において比較対象とする第1のデータ変更履歴6を取得することはできない。そこで処理部12は、行対応情報において、第2のデータ変更履歴7に含まれる行番号に対応する行番号がない場合、非互換動作を検出する処理の実行を抑止する。これにより、無駄な非互換検出処理を実施せずに済む。
【0032】
行対応情報は、予め生成しておくことができる。例えば処理部12は、第1の検証対象プログラム1aと第2の検証対象プログラム1bとを比較して行対応情報を生成する。処理部12は、行対応情報の生成を、例えば第2の検証対象プログラム1bを翻訳する際に行う。
【0033】
〔第2の実施の形態〕
次に第2の実施の形態について説明する。第2の実施の形態は、ある実行環境のコンピュータで運用中のアプリケーションを、異なる実行環境のコンピュータに移行させる際に、開発環境において事前に動作検証を行い、データ形式の違いによる非互換動作の有無を確認するものである。
【0034】
図2は、第2の実施の形態のシステム構成の一例を示す図である。
図2には、運用システム200において実行されているアプリケーションの実行環境を移行させる際に、開発システム100を用いてアプリケーションの動作検証を事前に実施する場合のシステム構成例が示されている。
【0035】
例えばネットワーク20を介して開発システム100と運用システム200とが接続されている。開発システム100には、アプリケーションの開発者が使用する2台の開発マシン100a,100bが含まれている。運用システム200には、アプリケーションを用いたサービスの提供に使用される2台の運用マシン200a,200bが含まれている。
【0036】
開発マシン100a,100bは、アプリケーションの開発とテスト用に用意されたコンピュータである。運用マシン200a,200bは、アプリケーションを用いた処理を実行し、各種サービスなどの運用を行うために用意されたコンピュータである。
【0037】
ここで運用マシン200aにおいて運用していたアプリケーションを、運用マシン200bに移行させるものとする。運用マシン200bは、運用マシン200aとは異なる動作環境を有している。この場合、開発システム100では、移行元の運用マシン200aと同じ動作環境が開発マシン100aに構築され、移行先の運用マシン200bと同じ動作環境が開発マシン100bに構築される。
【0038】
なお開発マシン100a,100bは、それぞれ運用マシン200a,200bの動作環境を再現した仮想マシンであってもよい。開発マシン100a,100bが共に仮想マシンである場合、同一のコンピュータ内に両方の開発マシン100a,100bを構築することができる。
【0039】
図3は、開発マシンのハードウェアの一例を示す図である。開発マシン100aは、プロセッサ101によって装置全体が制御されている。プロセッサ101には、バス109を介してメモリ102と複数の周辺機器が接続されている。プロセッサ101は、マルチプロセッサであってもよい。プロセッサ101は、例えばCPU、MPU(Micro Processing Unit)、またはDSP(Digital Signal Processor)である。プロセッサ101がプログラムを実行することで実現する機能の少なくとも一部を、ASIC(Application Specific Integrated Circuit)、PLD(Programmable Logic Device)などの電子回路で実現してもよい。
【0040】
メモリ102は、開発マシン100aの主記憶装置として使用される。メモリ102には、プロセッサ101に実行させるOSのプログラムやアプリケーションプログラムの少なくとも一部が一時的に格納される。また、メモリ102には、プロセッサ101による処理に利用する各種データが格納される。メモリ102としては、例えばRAM(Random Access Memory)などの揮発性の半導体記憶装置が使用される。
【0041】
バス109に接続されている周辺機器としては、ストレージ装置103、GPU(Graphics Processing Unit)104、入力インタフェース105、光学ドライブ装置106、機器接続インタフェース107およびネットワークインタフェース108がある。
【0042】
ストレージ装置103は、内蔵した記録媒体に対して、電気的または磁気的にデータの書き込みおよび読み出しを行う。ストレージ装置103は、開発マシン100aの補助記憶装置として使用される。ストレージ装置103には、OSのプログラム、アプリケーションプログラム、および各種データが格納される。なお、ストレージ装置103としては、例えばHDD(Hard Disk Drive)やSSD(Solid State Drive)を使用することができる。
【0043】
GPU104は画像処理を行う演算装置であり、グラフィックコントローラとも呼ばれる。GPU104には、モニタ21が接続されている。GPU104は、プロセッサ101からの命令に従って、画像をモニタ21の画面に表示させる。モニタ21としては、有機EL(Electro Luminescence)を用いた表示装置や液晶表示装置などがある。
【0044】
入力インタフェース105には、キーボード22とマウス23とが接続されている。入力インタフェース105は、キーボード22やマウス23から送られてくる信号をプロセッサ101に送信する。なお、マウス23は、ポインティングデバイスの一例であり、他のポインティングデバイスを使用することもできる。他のポインティングデバイスとしては、タッチパネル、タブレット、タッチパッド、トラックボールなどがある。
【0045】
光学ドライブ装置106は、レーザ光などを利用して、光ディスク24に記録されたデータの読み取り、または光ディスク24へのデータの書き込みを行う。光ディスク24は、光の反射によって読み取り可能なようにデータが記録された可搬型の記録媒体である。光ディスク24には、DVD(Digital Versatile Disc)、DVD-RAM、CD-ROM(Compact Disc Read Only Memory)、CD-R(Recordable)/RW(ReWritable)などがある。
【0046】
機器接続インタフェース107は、開発マシン100aに周辺機器を接続するための通信インタフェースである。例えば機器接続インタフェース107には、メモリ装置25やメモリリーダライタ26を接続することができる。メモリ装置25は、機器接続インタフェース107との通信機能を搭載した記録媒体である。メモリリーダライタ26は、メモリカード27へのデータの書き込み、またはメモリカード27からのデータの読み出しを行う装置である。メモリカード27は、カード型の記録媒体である。
【0047】
ネットワークインタフェース108は、ネットワーク20に接続されている。ネットワークインタフェース108は、ネットワーク20を介して、他のコンピュータまたは通信機器との間でデータの送受信を行う。ネットワークインタフェース108は、例えばスイッチやルータなどの有線通信装置にケーブルで接続される有線通信インタフェースである。またネットワークインタフェース108は、基地局やアクセスポイントなどの無線通信装置に電波によって通信接続される無線通信インタフェースであってもよい。
【0048】
開発マシン100aは、以上のようなハードウェアによって実現することができる。他の開発マシン100bおよび運用マシン200a,200bも、開発マシン100aと同様のハードウェアで実現することができる。また、第1の実施の形態に示した情報処理装置10も、
図3に示した開発マシン100aと同様のハードウェアにより実現することができる。
【0049】
開発マシン100aは、例えばコンピュータ読み取り可能な記録媒体に記録されたプログラムを実行することにより、第2の実施の形態の処理機能を実現する。開発マシン100aに実行させる処理内容を記述したプログラムは、様々な記録媒体に記録しておくことができる。例えば、開発マシン100aに実行させるプログラムをストレージ装置103に格納しておくことができる。プロセッサ101は、ストレージ装置103内のプログラムの少なくとも一部をメモリ102にロードし、プログラムを実行する。また開発マシン100aに実行させるプログラムを、光ディスク24、メモリ装置25、メモリカード27などの可搬型記録媒体に記録しておくこともできる。可搬型記録媒体に格納されたプログラムは、例えばプロセッサ101からの制御により、ストレージ装置103にインストールされた後、実行可能となる。またプロセッサ101が、可搬型記録媒体から直接プログラムを読み出して実行することもできる。
【0050】
例えば運用マシン200aでアプリケーションを実行させてサービスを提供する運用者は、アプリケーションを別の運用マシン200bに移行する場合、例えば事前に開発マシン100a,100bを用いて、アプリケーションの実行環境の互換性の検証を行う。互換性の検証では、データ形式の違いに起因して意図しない動作(非互換動作)が実行されるか否かが検証される。
【0051】
ここでデータ形式の違いに起因する非互換動作としては、例えば以下のような動作がある。
第1の例は、エンディアンの違いに起因する非互換動作である。エンディアンとは、複数のバイトを並べる順序の種類である。エンディアンの種類には、ビッグエンディアン、リトルエンディアンなどがある。ビッグエンディアンでは、バイト単位のデータが上位のバイトから順に並べられる。リトルエンディアンでは、バイト単位のデータが下位のバイトから順に並べられる。
【0052】
ビッグエンディアンのデータ入力を前提とするプログラム実行環境からリトルエンディアンのデータ入力を前提とするプログラム実行環境へ移行する場合がある。例えば移行元のプログラム実行環境では、ネットワークからネットワークバイトオーダー(ビッグエンディアン)のバイト列を4バイト読み込み、それをそのままバイナリ整数と見なして処理しているものとする。このとき移行先のプログラム実行環境では、取得するデータをリトルエンディアンとして取り扱う場合がある。この場合、エンディアンが異なるため、ビッグエンディアンのデータをそのまま実行してしまうと、本来の値とは異なる整数値として処理が実行され、意図しない結果が出力される。
【0053】
第2の例は、文字コードの違いに起因する非互換動作である。例えばプログラムを実行するOSを、システム文字コードがEUCのOSからUTF-16のOSに移行する場合がある。この場合、移行先のコンピュータでは処理ロジックがUTF-16を想定しているため、取得した文字データがEUCのまま入力されると意図しない結果が出力される。
【0054】
その他、浮動小数点の表現形式の違いも非互換動作の原因となり得る。このように、プログラム実行環境において取り扱われるデータ形式の違いにより、非互換動作が発生する。そこで運用者は、開発システム100を用いた実行環境移行に伴う動作検証を行い、データ形式の違いに起因する非互換動作の検出と非互換動作の原因箇所の特定を行う。
【0055】
なお、非互換動作の発生箇所が複数ある場合も考えられる。その場合、非互換動作の複数の発生箇所を漏れなく検出するのは容易ではない。以下、
図4を参照して、非互換動作の複数の発生箇所を検出することの困難性について説明する。
【0056】
図4は、非互換動作の一例を示す図である。
図4の例では、ソースファイル111aとソースファイル111bとに基づくアプリケーションが、移行元の運用マシン200aで実行されているものとする。ソースファイル111aには、ソースファイル111bの呼び出し命令「CALL ”PROG-B” USING WK-ITEM-2.」が含まれている。ソースファイル111bには、「PARAM-NUM」の値を変更する命令「ADD 1 TO PARAM-NUM.」が含まれている。
【0057】
ソースファイル111aとソースファイル111bとに基づくアプリケーションを移行元の同一環境の開発マシン100aで実行したとき、「PARAM-NUM」の値が「0」になったものとする。また、ソースファイル111aとソースファイル111bとに基づくアプリケーションを移行先と同一環境の開発マシン100bで実行したとき、「PARAM-NUM」の値が「-0」になったものとする。この場合、移行先の環境での「PARAM-NUM」の値は不正な値である。
【0058】
移行元の環境の開発マシン100aと移行先の環境の開発マシン100bとのそれぞれにおいて、データの値の変更命令の前後でデータの値をデータ変更履歴として保存しておくことで、非互換動作による不正な値の検出が可能となる。例えば開発マシン100bが、移行元の環境におけるデータ変更履歴と移行先環境におけるデータ変更履歴とを比較して、非互換動作による不正な値を検出する。
【0059】
なお、移行先環境において「PARAM-NUM」に不正な値が設定され、そのまま処理を継続した場合、移行先環境における不正な値設定後の処理は、移行元の処理とは異なる動作となる。そのため開発マシン100bにおいて非互換動作を1件検出すると、その非互換動作後に保存されたデータに不正な値があっても、その原因はすでに検出された非互換動作に起因する可能性がある。そのため、非互換動作による不正な値をそのままにしてアプリケーションの処理を継続した場合、1回のアプリケーション実行で検出できる非互換動作は1件に留まる。すなわち、非互換動作が他にもあるか否かを検出するには、ソースファイル111aとソースファイル111bを修正し、修正後のアプリケーションを再度実行することとなる。
【0060】
このようにアプリケーションをそのまま実行している限り、1度の実行で検出できる非互換動作の発生箇所は1つであり、移行先環境での一度のアプリケーションの実行で非互換動作のすべての発生箇所を特定することは困難である。そのため、非互換発生箇所を検出するごとに、ソースファイルの修正とアプリケーションの再実行とを繰り返すこととなる。
【0061】
なお、ソースファイルを修正すると、ソースコードの行数が変わるため、非互換動作の検出の困難性が増すという問題も発生する。
図5は、修正されたソースファイルの一例を示す図である。例えばファイル名「b.cob」のソースファイル111bが、ソースファイル111cに修正されたものとする。ソースファイル111cには「PARAM-NUM」の値の修正処理を呼び出す命令「CALL FIX-PARAM-NUM USING PARAM-NUM.」が追加されている。
【0062】
図6は、ソースファイルが修正された場合のデータ変更履歴の一例を示す図である。
図6には、移行元環境でのデータ変更履歴115aと移行先環境でのデータ変更履歴145aとが示されている。データ変更履歴115a,145aそれぞれには、複数のログレコードが含まれている。
【0063】
ログレコードには、通し番号、ソース名、行番号、イベント種類、データ名、および内容などのフィールドが含まれる。通し番号のフィールドには、ログレコードに付与された識別番号が設定される。この識別番号は、例えばログレコードへの記録が早い順に1から昇順の番号である。ソース名のフィールドには、実行された実行ファイルの生成元となったソースファイルのファイル名が設定される。行番号のフィールドには、ログレコードを出力する原因となった命令に対応する、ソースファイル内の命令が記述されたソースファイル内の行番号が設定される。イベント種類のフィールドには、ログレコードが、データの変更を伴う命令の実行前のログ(実行前)なのか、あるいはデータの変更を伴う命令の実行後のログ(実行後)なのかを示す情報が設定される。データ名のフィールドには、データを一意に識別できるように修飾された名前が設定される。内容のフィールドには、データの変更前または変更後のそのデータの値が設定される。
【0064】
なお、
図6の例では省略されているが、ログレコードには、アドレス、サイズ、データのフィールドも含まれる。アドレスのフィールドには、変更されたデータのメモリ内でのアドレスが設定される。サイズのフィールドには、変更されたデータのサイズが設定される。データ形式のフィールドには、変更されたデータのデータ形式を示す情報が設定される。
【0065】
図6に示すように移行元と移行先とでソースファイルが異なると、移行元環境でのデータ変更履歴115aと移行先環境でのデータ変更履歴145aとでは、対応する命令のログレコードであっても通し番号が異なる。そのためデータ変更履歴115a,145aの通し番号を利用した、単純なデータ変更履歴115a,145aの比較は困難である。
【0066】
以上のように、アプリケーションをそのまま実行すると、移行先環境での一度のアプリケーションの実行で非互換動作の発生箇所をすべて特定して、その非互換動作を解消することが困難であるという問題がある。このような問題から、ソースファイルの修正とアプリケーションの実行とを繰り返すことになるが、ソースファイルを修正すると、移行元と移行先とのデータ変更履歴の比較が困難となる。
【0067】
そこで第2の実施の形態のシステムでは、移行先と同一環境の開発マシン100bにおいてアプリケーションを実行する際に動的に非互換発生箇所を検出し、その都度、不正な値を修正する。不正な値を修正しながらアプリケーションを実行することで、非互換動作の発生箇所が複数あっても、該当箇所を適切に検出することができる。
【0068】
またソースファイルが修正された場合、例えば開発マシン100bが、修正前後でのソースファイル内の行の対応関係を示す行対応情報を生成する。開発マシン100bは、この行対応情報を参照して非互換動作の検出を行うことで、ソースファイルが修正されていても、非互換動作の検出を適切に行うことが可能となる。
【0069】
図7は、アプリケーションの動作検証のために開発システムが有する機能の一例を示す図である。開発マシン100aは、記憶部110、コンパイラ120、および実行部130を有する。
【0070】
記憶部110は、ソースファイル111、実行ファイル112、複数のデータファイル113a,113b,・・・、ランタイムライブラリ114、およびデータ変更履歴115を記憶する。
【0071】
ソースファイル111は、アプリケーションの処理内容が高級言語で記述されたプログラムファイルである。実行ファイル112は、ソースファイル111に基づいて生成された実行形式の機械語のプログラムファイルである。データファイル113a,113b,・・・は、実行ファイル112の実行時に使用するデータが設定されたファイルである。ランタイムライブラリ114は、実行ファイル112の実行時に利用可能なランタイム(ソフトウェア部品)が登録されたファイルである。データ変更履歴115は、実行ファイル112によるアプリケーション実行時のデータ変更履歴が格納されたログファイルである。
【0072】
コンパイラ120は、ソースファイル111の機械語への翻訳(コンパイル)を実行する。すなわちコンパイラ120は、ソースファイル111に記述されたプログラムを解釈し、開発マシン100aにおけるプログラム実行環境に適合する実行ファイル112を生成する。なお開発マシン100aのプログラム実行環境は運用システム200における移行元の運用マシン200aと同じであるため、生成される実行ファイル112は移行元の運用マシン200aにも適合している。コンパイラ120は、データ領域内のデータの変更を伴う命令を検出した場合、変更前後においてデータの値を記録する命令を、実行ファイル112に追加する。
【0073】
実行部130は、実行ファイル112を実行するプロセスである。実行部130は、実行ファイル112の実行過程で処理対象のデータ読み込み命令がある場合、例えばデータファイル113a,113b,・・・から該当するデータを読み込む。また実行部130は、実行ファイル112の実行途中でランタイムが呼び出された場合、ランタイムライブラリ114から該当するランタイムを取得して、取得したランタイムを実行する。例えば指定されたデータをデータ変更履歴115に記録するランタイムが用意されている場合、実行部130は、データの値を記録する命令の実行時にそのランタイムを呼び出して実行する。実行部130が実行ファイル112を実行することで、実行ファイル112の実行過程で変更されたデータの変更前後での値がデータ変更履歴115に格納される。
【0074】
開発マシン100bは、記憶部140、コンパイラ150、および実行部160を有する。
記憶部140は、ソースファイル141、実行ファイル142、複数のデータファイル143a,143b,・・・、ランタイムライブラリ144、データ変更履歴145、および行対応情報146を記憶する。
【0075】
ソースファイル141は、ソースファイル111と同じ内容のプログラムファイル、またはソースファイル111を修正することで生成されたプログラムファイルである。実行ファイル142は、ソースファイル141に基づいて生成された実行形式のプログラムである。データファイル143a,143b,・・・は、実行ファイル142の実行時に使用するデータが設定されたファイルである。ランタイムライブラリ144は、実行ファイル142の実行時に利用可能なランタイムが登録されたファイルである。データ変更履歴145は、実行ファイル142によるアプリケーション実行時のデータ変更履歴が格納されたログファイルである。行対応情報146は、移行元環境用のソースファイル111と移行先環境用のソースファイル141との間の行の対応関係を示す情報である。
【0076】
なおデータファイル143a,143b,・・・は、例えば開発マシン100aが有するデータファイル113a,113b,・・・に含まれるデータのデータ形式を、移行先のプログラム実行環境に対応するデータ形式に変換することで生成される。ここで、データファイル143a,143b,・・・が大量にあるとき、データ形式の変換漏れが発生する可能性がある。このようなデータ形式の変換漏れは、非互換動作の発生原因となる。
【0077】
コンパイラ150は、ソースファイル141の機械語へのコンパイルを実行する。すなわちコンパイラ150は、ソースファイル141に記述されたプログラムを解釈し、開発マシン100bにおけるプログラム実行環境に適合する実行ファイル142を生成する。なお開発マシン100bのプログラム実行環境は運用システム200における移行先の運用マシン200bと同じであるため、生成される実行ファイル142は移行先の運用マシン200bにも適合している。
【0078】
コンパイラ150は、データ領域内のデータの変更を伴う命令を検出した場合、変更前後においてデータの値を記録する命令を、実行ファイル142に追加する。またコンパイラ150は、データ領域内のデータの変更を伴う命令を検出した場合、変更後においてデータ変更履歴を比較する命令を、実行ファイル142に追加する。さらにコンパイラ150は、移行元環境用のソースファイル111と移行先環境用のソースファイル141とを比較して、行対応情報146を生成する。
【0079】
実行部160は、実行ファイル142を実行するプロセスである。実行部160は、実行ファイル142の実行過程で処理対象のデータ読み込み命令がある場合、例えばデータファイル143a,143b,・・・から該当するデータを読み込む。また実行部160は、実行ファイル142の実行途中でランタイムが呼び出された場合、ランタイムライブラリ144から該当するランタイムを取得して、取得したランタイムを実行する。例えば指定されたデータをデータ変更履歴145に記録するランタイムが用意されている場合、実行部160は、データの値を記録する命令の実行時にそのランタイムを呼び出して実行する。またデータ変更履歴115,145を比較するランタイムが用意されている場合、実行部160は、データ変更履歴115,145を比較する命令の実行時にそのランタイムを呼び出して実行する。
【0080】
実行部160が実行ファイル142を実行することで、実行ファイル142の実行過程で変更されたデータの変更前後での値がデータ変更履歴145に格納される。また実行部160が実行ファイル142を実行する過程で、データ変更履歴115,145の比較により非互換動作を検出した場合、非互換動作で不正な値が設定された非互換データの値を正しい値に修正し、処理を継続する。
【0081】
なお、
図7に示した各要素間を接続する線は通信経路の一部を示すものであり、図示した通信経路以外の通信経路も設定可能である。また、
図7に示した各要素の機能は、例えば、その要素に対応するプログラムモジュールをプロセッサ101に実行させることで実現することができる。
【0082】
開発システム100による非互換動作の検出と非互換動作の原因箇所の特定処理は、以下の手順で行われる。
まずソースファイル111,141に記述されたプログラムの記述言語に対応するコンパイラ120,150が、実行ファイル112,142に示されるプログラム実行時のすべてのデータのデータ変更履歴を自動的に記録するようにプログラムを生成する。
【0083】
図8は、実行ファイルの生成状況の一例を示す図である。例えば開発マシン100aにおいて、コンパイラ120がソースファイル111をコンパイルし、実行ファイル112を生成する。また開発マシン100bにおいて、コンパイラ150がソースファイル141をコンパイルし、実行ファイル142を生成する。なおソースファイル141は、ソースファイル111のコピーそのまま、またはソースファイル111のコピーに修正を加えたものである。コンパイラ120,150は、ソースファイル111,141をコンパイルする際、データの変更を伴う命令を検出すると、その命令の前後に、データの記録命令を追加する。
【0084】
またコンパイラ150は、ソースファイル141をコンパイルする際、データの変更を伴う命令を検出すると、データの記録命令に加えて、データ変更履歴を比較する命令を実行ファイル142に追加する。さらにコンパイラ150は、ソースファイル111とソースファイル141とを比較し、行対応情報146を生成する。例えばコンパイラ150は、ソースファイル141からデータの変更を伴う命令の行を検出すると、その行に対応するソースファイル111内の行を探索し、それらの行の行番号を対応付けて行対応情報146に格納する。またコンパイラ150は、ソースファイル141におけるデータの変更を伴う命令の行に対応する行がソースファイル111内に存在しない場合、対応する行が存在しないことを示す情報を行対応情報146に格納する。
【0085】
次に、移行元環境の開発マシン100aで実行される処理について詳細に説明する。
図9は、移行元環境の開発マシンにおける処理の一例を示すフローチャートである。以下、
図9に示す処理をステップ番号に沿って説明する。
【0086】
[ステップS101]開発マシン100aのコンパイラ120は、ソースファイル111をコンパイルする。例えばコンパイラ120は、ソースファイル111に記述されている命令を解釈し、移行元環境に応じた機械語に翻訳する。そしてコンパイラ120は、ソースファイル111に示される処理を移行元環境で実行するための実行ファイル112を生成する。コンパイル処理の詳細は後述する(
図10参照)。
【0087】
[ステップS102]実行部130は、生成された実行ファイル112に記述された機械語のプログラムを実行する。プログラムの実行の結果、データ変更履歴115が生成される。
【0088】
図10は、移行元環境におけるコンパイル処理の手順の一例を示すフローチャートである。以下、
図10に示す処理をステップ番号に沿って説明する。
[ステップS111]コンパイラ120は、ソースファイル111の命令文を一文ずつ上から順に選択し、選択した命令文に応じて実行する処理を解釈する。
【0089】
[ステップS112]コンパイラ120は、解釈した命令文に応じた処理によりデータの変更が行われるか否かを判断する。例えばコンパイラ120は、メモリ102のデータ領域へのデータの読み込みを伴う命令であれば、データの変更があると判断する。コンパイラ120は、データの変更がある場合、処理をステップS114に進める。またコンパイラ120は、データの変更がなければ、処理をステップS113に進める。
【0090】
[ステップS113]コンパイラ120は、解釈した命令文に対応する機械語の命令を、実行ファイル112に追加する。その後、コンパイラ120は処理をステップS117に進める。
【0091】
[ステップS114]コンパイラ120は、変更されるデータの変更前の値をデータ変更履歴115に記録させる機械語の命令を、実行ファイル112に追加する。
例えばCOBOLなどの高級言語では、ソースファイル111上の記述と翻訳オプションなどによって、データ形式(例えば文字コードUTF-8の文字列)を把握することができる。そこでコンパイラ120は、ソースファイル111の翻訳オプションなどに基づいてデータ形式を把握し、データのデータ形式をデータ変更履歴115への記録対象とすることもできる。またコンパイラ120は、例えば、データとそのデータ形式を対応付けたファイルをソースファイル111と共にコンパイル時の入力とし、そのファイルに基づいてデータ形式を把握し、データのデータ形式をデータ変更履歴115への記録対象とすることもできる。
【0092】
[ステップS115]コンパイラ120は、解釈した命令文に対応する機械語の命令を、実行ファイル112に追加する。
[ステップS116]コンパイラ120は、変更されるデータの変更後の値をデータ変更履歴115に記録させる機械語の命令を、実行ファイル112に追加する。
【0093】
[ステップS117]コンパイラ120は、ソースファイル111に記述されたプログラムの最後の命令まで解釈が終了したか否かを判断する。コンパイラ120は、最後の命令まで解釈が終了した場合、コンパイルを終了する。コンパイラ120は、未解釈の命令がある場合、処理をステップS111に進める。
【0094】
このようにしてコンパイラ120によりコンパイルが実行され、機械語の命令によって処理が記述された実行ファイル112が生成される。
図11は、移行元環境におけるコンパイル結果の一例を示す図である。
図11では、COBOL言語で記述されたプログラムのソースファイル111をコンパイルする例が示されている。ソースファイル111のファイル名は「a.cob」であり、そのソースファイル111に記述されたプログラムは「PROG-A」である。なお実行ファイル112の内容としては、機械語の命令そのものではなく、記述された命令の意味を示している。
【0095】
例えばコンパイラ120は、データの変更を記述するすべての命令文の前後に操作対象データのその時点の値を記録する命令を生成する。以下、プログラム中の「READ FILE-1.」という文(行番号「000100」)に対してデータの値を記録する命令を生成する例を詳細に説明する。
【0096】
コンパイラ120は、その言語の文の仕様を理解している。そのためコンパイラ120は、その文を解析した結果、その文がどのデータを変更する可能性があるかを把握することができる。
図11に示すソースファイル111のREAD文(ファイルからデータを読み込む命令文)の場合、コンパイラ120は以下の事柄を認識する。
・READ文はデータ領域WK-RECORDを書き換える可能性がある。
・WK-RECORDの定義から、WK-RECORDは以下の末端項目から構成されている。
WK-ITEM-1:4バイト
WK-ITEM-2:8バイト
コンパイラ120はこの例のREAD文に対する命令の前後に、変更される可能性のあるデータ領域の値を記録する命令を生成する。この命令生成は、変更される可能性のあるデータ領域のそれぞれに対して行われる。この例の場合、変更される可能性があるデータ領域はWK-RECORDのみなので、コンパイラ120はWK-RECORDに対してのみデータの値を記録する命令を生成する。ただしコンパイラ120は、その命令をWK-RECORDに対して生成するのではなく、末端のデータ項目(この場合、WK-ITEM-1とWK-ITEM-2)ごとに順番に出力する。
【0097】
これにより実行ファイル112には、「READ FILE-1.」に相当する命令の前後に、WK-ITEM-1の値とWK-ITEM-2の値とのそれぞれを記録する命令が追加される。
【0098】
「データ領域の値を記録する命令」は、例えばデータの値をデータ変更履歴115に記録する機能を持つランタイム関数の読み出し命令である。その場合、コンパイラ120は、データの値をデータ変更履歴115に記録するために、ランタイム関数に以下の情報を渡す命令を生成する。
・記録対象とする文の位置(
図11の例では「a.cob」の行「000100」)
・イベント種類(記録対象とする文の実行前か実行後か)
・データ領域の先頭アドレス
・データ領域のサイズ
・データ名(実行プロセス内でデータを一意に識別できるように修飾された名前(例えばPROG-A/WK-RECORD/WK-ITEM-1))
・データ形式
コンパイラ120は、翻訳にあたり、各データ領域のデータ形式を例えば以下の情報から決定する。
・データの種類に応じたCOBOLのデフォルト値(多くは実行環境ごとに設定される)
・COBOL翻訳オプションなどによる指定(例えばユーザによるデフォルト値の書き換え)
・ソースファイル111上でのデータに対する明示的な記述
このようにして、データの値を記録する命令を含む実行ファイル112が生成される。
【0099】
一方、移行先環境を有する開発マシン100bでは、ソースファイル141のコンパイルと、コンパイルで生成された実行ファイル142の実行とが行われる。以下、移行先環境の開発マシン100bによる処理を具体的に説明する。
【0100】
図12は、移行先環境の開発マシンにおける処理の一例を示すフローチャートである。以下、
図12に示す処理をステップ番号に沿って説明する。
[ステップS201]開発マシン100bのコンパイラ150は、ソースファイル141をコンパイルする。例えばコンパイラ150は、ソースファイル141に記述されている命令を解釈し、移行先環境に応じた機械語に翻訳する。そしてコンパイラ150は、ソースファイル141に示される処理を移行先環境で実行するための実行ファイル142を生成する。なお、コンパイラ150は、コンパイルの際に、行対応情報146を生成する。移行先環境の開発マシンにおけるコンパイル処理の詳細は後述する(
図13参照)。
【0101】
[ステップS202]実行部160は、生成された実行ファイル142に記述されたプログラムを実行する。実行ファイル142に基づく処理の実行の結果、データ変更履歴145が生成される。なお、実行部160は、プログラム中にデータ変更履歴の比較を指示する命令がある場合、その命令に従ってデータ変更履歴の比較処理を行う。移行先環境でのプログラム実行処理の詳細は後述する(
図21参照)。
【0102】
図13は、移行先環境におけるコンパイル処理の手順の一例を示すフローチャートである。以下、
図13に示す処理をステップ番号に沿って説明する。
[ステップS211]コンパイラ150は、ソースファイル141の命令文を一文ずつ上から順に選択し、選択した命令文に応じて実行する処理を解釈する。
【0103】
[ステップS212]コンパイラ150は、解釈した命令文に応じた処理によりデータの変更が行われるか否かを判断する。コンパイラ150は、データの変更がある場合、処理をステップS214に進める。またコンパイラ150は、データの変更がなければ、処理をステップS213に進める。
【0104】
[ステップS213]コンパイラ150は、解釈した命令文に対応する機械語の命令を、実行ファイル142に追加する。その後、コンパイラ150は処理をステップS221に進める。
【0105】
[ステップS214]コンパイラ150は、変更されるデータの変更前の値をデータ変更履歴145に記録させる機械語の命令を、実行ファイル142に追加する。
[ステップS215]コンパイラ150は、解釈した命令文に対応する機械語の命令を、実行ファイル142に追加する。
【0106】
[ステップS216]コンパイラ150は、変更されるデータの変更後の値をデータ変更履歴145に記録させる機械語の命令を、実行ファイル142に追加する。
[ステップS217]コンパイラ150は、データ変更履歴115,145の比較を実行させる機械語の命令を、実行ファイル142に追加する。
【0107】
[ステップS218]コンパイラ150は、解釈した命令文に対応する命令文が移行元のソースファイル111にあるか否かを判断する。例えばコンパイラ150は、ソースファイル111から、解釈した命令文と同じ記述の命令文を検索し、該当する命令文がある場合、対応する命令文があると判断する。コンパイラ150は、対応する命令文がある場合、処理をステップS219に進める。またコンパイラ150は、対応する命令文がなければ、処理をステップS220に進める。
【0108】
[ステップS219]コンパイラ150は、解釈した命令文の行番号と、ソースファイル111内の対応する命令文の行番号との組を、行対応情報146に記録する。コンパイラ150は、その後、処理をステップS221に進める。
【0109】
[ステップS220]コンパイラ150は、解釈した命令文の行番号を、対応する命令文の行番号なしで、行対応情報146に記録する。
[ステップS221]コンパイラ150は、ソースファイル141に記述されたプログラムの最後の命令まで解釈が終了したか否かを判断する。コンパイラ150は、最後の命令まで解釈が終了した場合、コンパイルを終了する。コンパイラ150は、未解釈の命令がある場合、処理をステップS211に進める。
【0110】
このようにしてコンパイラ150によりコンパイルが実行され、機械語の命令によって処理が記述された実行ファイル142が生成される。
図14は、移行先環境におけるコンパイル結果の一例を示す図である。
図14に示す移行先環境用のソースファイル141の内容は、移行元環境でコンパイルされたソースファイル111と同じである。ソースファイル141をコンパイルすることで生成される実行ファイル142には、移行元の実行ファイル112に含まれる命令に加えて、データ変更履歴を比較する命令が含まれている。データ変更履歴を比較する命令は、例えば、変更後のデータの値を記録する命令の後に記述される。
【0111】
また移行先環境におけるコンパイルの際には、行対応情報146が生成される。
図15は、生成される行対応情報の第1の例を示す図である。
図15の例では、移行元環境用のソースファイル111bの内容を修正して、移行先環境用のソースファイル141aが生成されている。修正されたソースファイル141aでは、行番号「000300」に新たな行が追加されている。それに伴い、ソースファイル111bにおいて行番号「000300」であった行が、ソースファイル141aでは行番号「000310」に変更されている。
【0112】
コンパイラ150は、ソースファイル111bとソースファイル141aとの差分情報を取得する。コンパイラ150は、例えばソースファイル141aの行番号「000300」、「000310」の行の命令文を翻訳する際に、それらの命令文に対応するレコードを行対応情報146aに登録する。
【0113】
行対応情報146aに登録されるレコードは、id、ソース名、修正前行番号、および修正後行番号のフィールドを有している。idのフィールドには、レコードの通し番号が設定される。ソース名のフィールドには、ソースファイル111b,141aに共通のファイル名が設定される。修正前行番号のフィールドには、修正前のソースファイル111bにおける命令文の行番号が設定される。修正後行番号のフィールドには、修正後のソースファイル141aにおける命令文の行番号が設定される。
【0114】
図15の例では、修正後のソースファイル141aの行番号「000300」の行に記述された命令文に対応する命令文は、修正前のソースファイル111bに含まれていない。そのため、行対応情報146aにおいて、修正後行番号「000300」が設定されたレコードの修正前行番号は空欄「-」となる。
【0115】
また修正後のソースファイル141aの行番号「000310」の行に記述された命令文に対応する命令文は、修正前のソースファイル111bでは行番号「000300」の行に記述されている。そのため、行対応情報146aにおいて、修正後行番号「000310」が設定されたレコードの修正前行番号は「000300」となる。
【0116】
行対応情報146aは、データ変更履歴115,145それぞれにおける比較対象のログレコードの対応関係の判断に利用される。
図16は、行対応情報に基づいて特定される比較対象のログレコードの第1の例を示す図である。データ変更履歴の比較時には、移行先のデータ変更履歴145aから、実行した命令に対応するログレコードが抽出される。例えば移行先のソースファイル141aの行番号「000300」の行の命令文に対応する機械語の命令が実行された場合、行番号「000300」のログレコードが抽出される。行対応情報146aにおいて、抽出されたログレコードの行番号「000300」(修正後行番号)には修正前行番号が対応付けられていない。この場合、行番号「000300」の命令文は修正によって追加された追加コードであり、データの値の比較対象外であると判断される。
【0117】
また例えば移行先のソースファイル141aの行番号「000310」の行の命令文に対応する機械語の命令が実行された場合、行番号「000310」のログレコードが抽出される。行対応情報146aにおいて、抽出されたログレコードの行番号「000310」(修正後行番号)には修正前行番号「000300」が対応付けられている。この場合、移行元のデータ変更履歴115aにおける行番号「000300」のログレコードと、移行先のデータ変更履歴145aにおける行番号「000310」のログレコードとが比較対象であると判断される。
【0118】
図17は、生成される行対応情報の第2の例を示す図である。
図17の例では、移行元環境用のソースファイル111dの内容を修正して、移行先環境用のソースファイル141bが生成されている。修正されたソースファイル141bでは、移行元環境用のソースファイル111dにおける行番号「000300」の行が削除されている。それに伴い、ソースファイル111dにおいて行番号「000310」であった行が、ソースファイル141bでは行番号「000300」に変更されている。
【0119】
コンパイラ150は、ソースファイル111dとソースファイル141bとの差分情報を取得する。コンパイラ150は、例えばソースファイル141bの行番号「000300」の行の命令文を翻訳する際に、それらの命令文に対応するレコードを行対応情報146bに登録する。
【0120】
図17の例では、修正後のソースファイル141bの行番号「000300」の行に記述された命令文に対応する命令文は、修正前のソースファイル111dでは行番号「000310」の行に記述されている。そのため、行対応情報146bにおいて、修正後行番号「000300」が設定されたレコードの修正前行番号は「000310」となる。
【0121】
図18は、行対応情報に基づいて特定される比較対象のログレコードの第2の例を示す図である。データ変更履歴の比較時には、移行先のデータ変更履歴145bから、実行した命令に対応するログレコードが抽出される。例えば移行先のソースファイル141bの行番号「000300」の行の命令文に対応する機械語の命令が実行された場合、行番号「000300」のログレコードが抽出される。行対応情報146bにおいて、抽出されたログレコードの行番号「000300」(修正後行番号)には修正前行番号「000310」が対応付けられている。この場合、移行元のデータ変更履歴115bにおける行番号「000310」のログレコードと、移行先のデータ変更履歴145bにおける行番号「000300」のログレコードとが比較対象であると判断される。
【0122】
コンパイルによって生成された移行元環境用の実行ファイル112は、移行元環境の開発マシン100aの実行部130で実行され、その結果、データ変更履歴115が生成される。また移行先環境用の実行ファイル142は、移行先環境の開発マシン100bの実行部160で実行され、その結果、データ変更履歴145が生成される。移行先環境用の実行ファイル142を実行する際には、データ変更履歴115,145と行対応情報146とを用いて、非互換動作の検出と修正が行われる。
【0123】
図19は、移行元と移行先との実行部の機能の一例を示すブロック図である。移行元環境の開発マシン100aにおける実行部130は、実行ファイル112に基づいて、実行ファイル112内に記述されているプログラム112aを実行する。また実行部130は、プログラム112a内にランタイム114aを呼び出す命令がある場合、ランタイムライブラリ114から該当するランタイム114aを呼び出して実行する。例えば実行部130は、データの値を記録する処理のランタイム114aの呼び出し命令に応じて該当するランタイム114aを実行する。その結果、データ変更履歴115が生成される。
【0124】
移行先環境の開発マシン100bにおける実行部160は、実行ファイル142に基づいて、実行ファイル142内に記述されているプログラム142aを実行する。また実行部160は、プログラム142a内にランタイム144aを呼び出す命令がある場合、ランタイムライブラリ144から該当するランタイム144aを呼び出して実行する。例えば実行部160は、データの値を記録する処理のランタイム144aの呼び出し命令に応じて該当するランタイム144aを実行する。その結果、データ変更履歴145が生成される。
【0125】
また実行部160は、データ変更履歴115,145を比較する処理の呼び出し命令に応じて、データ差分検出部161を呼び出す。例えば実行部160は、データ差分検出部161に対してデータ変更履歴115,145の比較を指示するランタイム144aの呼び出し命令に応じて、該当するランタイム144aを介してデータ差分検出部161にデータ変更履歴115,145の比較を指示する。
【0126】
図20は、データ変更履歴の比較処理の一例を示す図である。プログラム142a実行時にデータ変更履歴115,145の比較を指示する命令によって、ランタイム144aを介してデータ差分検出部161にデータ変更履歴115,145の比較が指示される。データ差分検出部161は、データ変更履歴115,145と行対応情報146とに基づいて非互換動作を検出する。そしてデータ差分検出部161は、非互換動作で値が変更されたデータの移行先環境の値を、移行元環境における値に修正し、ランタイム144aを介して、修正後の値をプログラム142aの該当データの値として設定する。
【0127】
またデータ差分検出部161は、非互換動作を検出すると、特定のデータの移行元環境での値と移行先環境での値との違いを示す差分発生ログ162を出力する。ユーザは、差分発生ログ162に基づいて、1または複数の非互換動作の発生箇所があったことを認識できる。
【0128】
次に、プログラム実行処理の手順について具体的に説明する。
図21は、プログラム実行処理の手順の一例を示すフローチャートである。以下、
図21に示す処理をステップ番号に沿って説明する。
【0129】
[ステップS231]実行部160は、実行ファイル142に記述されているプログラムの命令を順番に実行する。
[ステップS232]実行部160は、実行した命令によりデータ内容を記録するランタイムの呼び出しが行われた場合、処理をステップS233に進める。また実行部160は、他の命令が実行された場合、処理をステップS234に進める。
【0130】
[ステップS233]実行部160は、ランタイムを用いて、変更対象のデータの内容を示すログレコードをデータ変更履歴145に登録する。その後、実行部160は処理をステップS236に進める。
【0131】
[ステップS234]実行部160は、データ変更履歴115,145を比較するランタイムの呼び出しが行われた場合、処理をステップS235に進める。また実行部160は、データ変更履歴115,145を比較するランタイムの呼び出しが行われていなければ、処理をステップS236に進める。
【0132】
[ステップS235]実行部160は、データ差分検出部161を呼び出し、データ変更履歴比較処理を実行させる。データ変更履歴比較処理の詳細は後述する(
図22参照)。
【0133】
[ステップS236]実行部160は、プログラムの最後の命令まで処理が終了した場合、プログラム実行を終了する。また実行部160は、未実行の命令があれば、処理をステップS231に進める。
【0134】
次にデータ変更履歴比較処理について詳細に説明する。
図22は、データ変更履歴比較処理の手順の一例を示すフローチャートである。以下、
図22に示す処理をステップ番号に沿って説明する。
【0135】
[ステップS241]データ差分検出部161は、移行先環境のデータ変更履歴145から、データの値を記録する命令によって最後に記録されたログレコードを取得する。
[ステップS242]データ差分検出部161は、行対応情報146を参照し、取得したログレコードに示される行番号(移行先行番号)に対応する移行元行番号を取得する。
【0136】
[ステップS243]データ差分検出部161は、データの比較処理を行うか否かを判断する。例えばデータ差分検出部161は、行対応情報146において対応する移行元行番号が設定されておらず、移行元行番号が取得できなかった場合、比較をしないと判断する。またデータ差分検出部161は、移行元行番号が取得できた場合、比較をすると判断する。データ差分検出部161は、比較をする場合、処理をステップS244に進める。またデータ差分検出部161は、比較をしない場合はデータ変更履歴比較処理を終了する。
【0137】
[ステップS244]データ差分検出部161は、行対応情報146から取得した移行元行番号に対応するログレコードを、移行元のデータ変更履歴115から取得する。
[ステップS245]データ差分検出部161は、取得した2つのログレコードを比較対象とし、それらのログレコードに示されるデータ名が同一か否かを判断する。データ差分検出部161は、データ名が同一であれば処理をステップS247に進める。またデータ差分検出部161は、データ名が異なれば処理をステップS246に進める。
【0138】
[ステップS246]データ差分検出部161は、データ変更履歴115,145それぞれを生成する際に実行されたプログラムが不一致であると判定し、データ変更履歴比較処理を終了する。
【0139】
[ステップS247]データ差分検出部161は、比較対象のログレコードに示されるデータ形式に相違があるか否かを判断する。当該判断処理の詳細は後述する(
図23参照)。データ差分検出部161は、データ形式が異なる場合、処理をステップS248に進める。またデータ差分検出部161は、データ形式が同じ場合、処理をステップS249に進める。
【0140】
[ステップS248]データ差分検出部161は、比較対象のログレコードのデータのデータ形式を統一する。例えばデータ差分検出部161は、一方のデータのデータ形式に他方のデータのデータ形式を変換する。またデータ差分検出部161は、比較対象のログレコード両方のデータのデータ形式を所定のデータ形式に変換する。例えばデータ差分検出部161は、浮動小数点を数値形式(例えば数字と小数点との文字列)に変換する。
【0141】
[ステップS249]データ差分検出部161は、比較対象のログレコードに示されるデータの値を比較する。
[ステップS250]データ差分検出部161は、データの値が同一か否かを判断する。データ差分検出部161は、データの値が同一であればデータ変更履歴比較処理を終了する。またデータ差分検出部161は、データの値が相違する場合、処理をステップS251に進める。
【0142】
[ステップS251]データ差分検出部161は、差分が発生した位置(ソース名・行番号・データ名)を、移行先環境のデータ変更履歴145から取得し、差分発生ログ162に記録する。
【0143】
[ステップS252]データ差分検出部161は、非互換動作により非互換データが設定された位置を取得し、差分発生ログ162に記録する。例えばデータ差分検出部161は、非互換データが格納されている不正領域の範囲を特定する。先頭アドレスが「12345674」でありサイズが4バイトの場合は、非互換データが格納されている不正領域の範囲として「12345674」から始まる4バイトの領域が特定される。次に、データ差分検出部161は、移行先環境のデータ変更履歴145のログレコードのうちで、特定した不正領域の範囲内のアドレスが設定されたログレコードを特定する。データ差分検出部161は、特定したログレコードの内容として非互換データが格納されている場合に、そのログレコードに設定されている行番号を、非互換データが設定されている箇所として特定する。
【0144】
[ステップS253]データ差分検出部161は、非互換データを正しく修正するデータ修正処理を行う。データ修正処理の詳細は後述する(
図24参照)。
このように、データ差分検出部161は、行対応情報146に基づいて比較するログレコードの行番号を判断し、データ変更履歴115,145内の対応するログレコード同士を比較し、非互換動作の発生の有無を判断する。そしてデータ差分検出部161は、非互換動作の発生を検出した場合、非互換動作によって生成された非互換データの値を正しい値に修正する。
【0145】
図23は、データ比較処理の第1の例を示す図である。移行元の実行環境上で取得したデータ変更履歴115cの13番目のログレコードには、WK-ITEM-1について、バイナリ整数であり、エンディアンはビッグエンディアンであるものとして翻訳したことが示されている。データ変更履歴115cの14番目のログレコードには、WK-ITEM-2について、日本語EUC文字列として翻訳したことが示されている。
【0146】
移行先の実行環境上で取得したデータ変更履歴145cの13番目のログレコードには、WK-ITEM-1について、バイナリ整数であり、エンディアンはリトルエンディアンであるものとして翻訳したことが示されている。データ変更履歴145cの14番目のログレコードには、WK-ITEM-2について、UTF-16LE文字列として翻訳したことが示されている。
【0147】
データ差分検出部161は、ログレコード同士を比較する場合、まずデータ名が一致していることを確認する。データ名が不一致の場合、データ差分検出部161は、プログラムの処理ロジックが異なっている(同一プログラムではない)と判断し、比較を中止する。なおプログラムのロジックが同じであっても実行環境に応じてアドレスは異なるため、比較対象のログレコードに示されるアドレスは異なっていてもよい。
図23の例では、13番目のログレコードのデータ名は共に「WK-ITEM-1」である。また14番目のログレコードのデータ名は共に「WK-ITEM-2」である。従って、いずれもデータ名は一致する。
【0148】
データ差分検出部161は、データ名が一致した場合、データ形式が一致するか否かを判断し、データ形式が一致していれば、データ形式の変換をせずにデータの値を比較する。他方、データ形式が不一致の場合、データ差分検出部161は、データ形式を一致させた後にデータの値を比較する。
【0149】
13番目のログレコードの比較の場合、データ差分検出部161は、移行元の実行環境に基づいて取得したデータ変更履歴115c内のログレコードのデータのエンディアンを、ビッグエンディアンからリトルエンディアンに変更している。そしてデータ差分検出部161は、エンディアンを揃えて、データの値を比較している。13番目のログレコードのデータの値で表される意味は、共に10進数で表すと「123456」となる。そこでデータ差分検出部161は、比較結果171に、互換確認を示す比較結果レコード171aを出力する。
【0150】
14番目のログレコードの比較の場合、データ差分検出部161は、移行元の実行環境に基づいて取得したデータ変更履歴115c内のログレコードのデータの文字コードをUTF16-LEに変換している。そしてデータ差分検出部161は、文字コードを揃えて、データの値を比較している。14番目のログレコードのデータの値は文字コードの変換をする前に既に同一である。これは、例えばデータファイル143a,143b,・・・を生成する際のデータ形式の変換漏れによって発生する。同じ値となっている比較対象の文字コードの一方を変換することで、比較の結果は不一致となる。そこでデータ差分検出部161は、比較結果171に、非互換動作の検出を示す比較結果レコード171bを出力する。
【0151】
比較結果171には、ログレコードが比較されるごとに、比較結果レコード171a,171bが格納される。比較結果レコード171a,171bには、結果、通し番号、ソースファイル名、行、イベント種類、およびデータ名が含まれる。結果は、互換性の有無を示す情報であり、互換性が確認できた場合は「OK」、非互換動作を検出した場合は「NG」と設定される。通し番号は、比較されたログレコードの通し番号である。ソースファイル名は、比較対象のデータ変更履歴115c,145cを生成するために実行された実行ファイル112,142に対応するソースファイル111,141のファイル名である。行は、比較されたログレコードを記録する命令に対応するソースファイル111,141内の命令文の行番号である。イベント種類は、比較されたログレコードが、データの変更を伴う命令の実行前のログ(実行前)なのか、あるいはデータの変更を伴う命令の実行後のログ(実行後)なのかを示す情報である。データ名は、比較されたログレコードに示されるデータのデータ名である。
【0152】
また比較結果レコード171a,171bには、移行元のログレコードのデータのデータ形式、サイズ、および値、並びに移行先のログレコードのデータのデータ形式、サイズ、および値が含まれる。
【0153】
例えば比較結果レコード171aは、結果が「OK」である。すなわち、互換性が確認されたことが示されている。また比較結果レコード171bは、結果が「NG」である。すなわち、非互換動作が検出されたことが示されている。
【0154】
非互換動作が検出されると、データ差分検出部161は、データ修正処理を実行する。
図24は、データ修正処理の手順の一例を示すフローチャートである。以下、
図24に示す処理をステップ番号に沿って説明する。
【0155】
[ステップS261]データ差分検出部161は、移行元のデータ変更履歴115から非互換データに対応するデータのログレコード(移行元ログレコード)を取得する。移行元ログレコードは、
図22のステップS244で取得したログレコードである。
【0156】
[ステップS262]データ差分検出部161は、移行元ログレコードから、修正対象データのデータ形式と値を取得する。
[ステップS263]データ差分検出部161は、移行先のデータ変更履歴145から非互換データに対応するデータのログレコード(移行先ログレコード)を取得する。移行先ログレコードは、
図22のステップS241で取得したログレコードである。
【0157】
[ステップS264]データ差分検出部161は、移行先ログレコードから修正対象データのデータ形式を取得する。
[ステップS265]データ差分検出部161は、移行元データのデータ形式を、移行元データ形式から移行先データ形式へ変換する。
【0158】
[ステップS266]データ差分検出部161は、データ形式変換後の移行元データを、非互換データが格納されていた変数領域に設定する。
このようにして非互換データの値が修正される。非互換データの値が修正されることで、非互換動作が発生した後の処理についても、正しく実行することができる。
【0159】
図25は、非互換データの値の修正処理の一例を示す図である。例えば比較結果レコード171bには、移行元と移行先とで文字コードが異なるにも拘わらず値が同じとなる非互換動作が発生したことが示されている。この場合、データ差分検出部161は、日本語EUCの文字コードで記述された移行元データ30の内容「あいう」の値「A4A2A4A4A4A6A1」を、UTF-16LEの文字コードによる内容「あいう」の値に変換する。その結果、移行元データ30の値は「4230 4430 4630 0030」となる。
【0160】
データ差分検出部161は、移行先環境のデータ変更履歴145cにおいて非互換動作の検出元となったログレコードのアドレスとサイズを取得する。データ差分検出部161は、取得したアドレスとサイズにより、非互換データの記録先である、メモリ102a内の変数領域102bを特定する。そしてデータ差分検出部161は、データ形式変換後の移行元データ30の値を、特定した変数領域102bに格納する。これにより、非互換データの値が正しい値に修正される。
【0161】
非互換データの値が修正されることで、非互換動作の発生箇所以降の処理についてもプログラムを正しく実行できる。そのため非互換動作の発生箇所が複数ある場合でも、移行先環境の開発マシン100bにおいて、それらの発生箇所を1回のプログラム実行で検出できる。検出された非互換動作の発生箇所は、差分発生ログ162に記録される。ユーザは、差分発生ログ162を確認することで、ソースファイル141における非互換動作の発生箇所を把握することができる。
【0162】
図26は、差分発生ログの一例を示す図である。
図26の例ではソースファイル141cの100行目の命令の実行により不正な形式のデータが設定され、200行目と201行目の命令の実行により、その値を利用して、別のソースファイル141d,141eが実行される。この場合、2つのソースファイル141d,141eそれぞれの実行過程で非互換動作が検出される。その結果、差分発生ログ162には、2つの非互換動作それぞれに対応する情報が登録される。
【0163】
差分発生ログ162は、検出した非互換動作ごとのレコードが登録されている。各レコードには、通し番号、ソース名、行番号、変数名、アドレス、サイズ、データの内容、不正形式データ設定ソース名、および不正形式データ設定行番号のフィールドが設けられている。
【0164】
通し番号のフィールドには、レコードの識別番号が設定される。ソース名のフィールドには、非互換動作の検出箇所となった命令(機械語)の翻訳元の命令があるソースファイルの名称が設定される。行番号のフィールドには、非互換動作の発生箇所となった命令(機械語)の翻訳元の命令の行番号が設定される。変数名のフィールドには、非互換データの変数名が設定される。アドレスのフィールドには、非互換データが記録された変数領域のメモリ上のアドレスが設定される。サイズのフィールドには、非互換データが記録された変数領域のサイズが設定される。データの内容のフィールドには、非互換データの値が設定される。不正形式データ設定ソース名のフィールドには、非互換データを記録する命令(機械語)の翻訳元の命令があるソースファイルの名称が設定される。不正形式データ設定行番号のフィールドには、非互換データを記録する命令(機械語)の翻訳元の命令の行番号が設定される。
【0165】
このような差分発生ログ162が出力されることにより、ユーザは、複数の非互換動作それぞれの発生箇所を容易に把握することができる。
〔その他の実施の形態〕
第2の実施の形態では運用マシン200a,200bとは別に開発マシン100a,100bを用意したが、運用マシン200a,200bを用いてアプリケーションの互換性の検証を行ってもよい。
【0166】
第2の実施の形態では、コンパイラ120,150によって、データを変更する命令の前後にデータの値を記録する命令を追加しているが、コンパイラ120,150以外の手段でデータの値を記録する命令を追加してもよい。例えば開発マシン100a,100bは、既に生成されている実行ファイル内の機械語のプログラムを解析し、データを変更する命令の前後にデータの値を記録する命令を追加することもできる。
【0167】
また第2の実施の形態では、データを変更する命令の前と後の両方にデータの値を記録する命令を追加しているが、開発マシン100a,100bは、データを変更する命令の前または後の一方でのみデータの値を記録する命令を追加してもよい。
【0168】
以上、実施の形態を例示したが、実施の形態で示した各部の構成は同様の機能を有する他のものに置換することができる。また、他の任意の構成物や工程が付加されてもよい。さらに、前述した実施の形態のうちの任意の2以上の構成(特徴)を組み合わせたものであってもよい。
【符号の説明】
【0169】
1a 第1の検証対象プログラム
1b 第2の検証対象プログラム
2 第1の実行プログラム
3 第2の実行プログラム
4 第1のデータ
5 第2のデータ
6 第1のデータ変更履歴
7 第2のデータ変更履歴
8 非互換情報
10 情報処理装置
11 記憶部
12 処理部
12a 第1のプログラム実行環境
12b 第2のプログラム実行環境