(57)【要約】【課題】ＣＡＬＬ呼び出しの引数と仮引数との間でデータ領域の共有を実現する。【解決手段】プログラム変換システムは、集団項目を実現するための第１のクラスの第１のインスタンスを生成する第１のソースコードを出力する出力部と、レベルが最上位である基本項目の定義について、当該基本項目を実現するための第２のクラスの第２のインスタンスを生成する第２のソースコードを出力する出力部と、レベルが最上位でない基本項目の定義について、当該基本項目を実現するための第３のクラスの第３のインスタンスを第１のクラスのメンバ変数とする第３のソースコードを出力する出力部であって、第１のクラス及び第３のクラスは、対応するデータ項目のデータ領域への参照を持つ第４のインスタンスへの参照をメンバ変数として保持する、出力部と、を備え、第１のインスタンスの生成時に第４のインスタンスが生成される。【選択図】図１１
2020060842.tif 000002
【特許請求の範囲】
【請求項１】
ＣＯＢＯＬソースプログラムのデータ部におけるデータ定義を順次読み込むデータ定義読み取り部と、
前記データ定義が集団項目の定義である場合、Ｊａｖａソースプログラムにおいて当該集団項目を実現するための第１のクラスの第１のインスタンスを生成する第１のソースコードを出力する集団項目定義コード出力部と、
前記データ定義が基本項目の定義であり、かつ、レベルが最上位である場合、前記Ｊａｖａソースプログラムにおいて当該基本項目を実現するための第２のクラスの第２のインスタンスを生成する第２のソースコードを出力する第１の基本項目定義コード出力部と、
前記データ定義が基本項目の定義であり、かつ、レベルが最上位でない場合、前記Ｊａｖａソースプログラムにおいて当該基本項目を実現するための第３のクラスの第３のインスタンスを前記第１のクラスのメンバ変数とする第３のソースコードを出力する第２の基本項目定義コード出力部であって、前記第１のクラス及び前記第３のクラスは、対応するデータ項目のデータ領域への参照を持つ第４のクラスの第４のインスタンスへの参照、オフセット値、及び前記対応するデータ項目のデータ長を示すバイト数をメンバ変数として保持し、前記オフセット値には、前記対応するデータ項目が最上位の場合、０がセットされ、前記対応するデータ項目が最上位でない場合、前記対応するデータ項目が属する最上位の集団項目における先頭のデータ項目の開始位置を０とした場合の、前記対応するデータ項目のデータ領域の開始位置がセットされる、第２の基本項目定義コード出力部と、
を備え、
前記第１のソースコード及び前記第３のソースコードに基づいた前記第１のクラスの前記第１のインスタンスの生成時に、前記第４のクラスの前記第４のインスタンスが生成され、かつ、前記第１のインスタンスのデータ領域内に、前記第１のクラスの前記メンバ変数である前記第３のクラスの前記第３のインスタンスのデータ領域が確保される、
プログラム変換システム。
【請求項２】
請求項１に記載されたプログラム変換システムから出力されたＪａｖａソースプログラムを実行する変換プログラム実行システムであって、
前記第１のインスタンスの生成時に前記第４のインスタンスを生成し、前記第４のクラスは、データ領域への参照、及び、シフト値を保持し、かつ、
前記第１のソースコードを含む呼び出し先プログラムを呼び出すＣＡＬＬ文から変換された命令が実行されると、
前記第１のインスタンスに対して生成された前記第４のインスタンスが参照する前記データ領域を、前記呼び出し先プログラムを呼び出す際に指定される第５のクラスの第５のインスタンスが参照する前記第４のクラスの第６のインスタンスが参照するデータ領域に変更し、及び
前記第４のインスタンスの前記シフト値を、前記第５のインスタンスの前記オフセット値に前記第６のインスタンスの前記シフト値を加えた値に変更する
プロキシインスタンス管理部、
を備える変換プログラム実行システム。
【請求項３】
前記第１のインスタンスの前記メンバ変数である前記第３のインスタンスにアクセスすることは、
前記第３のインスタンスが参照する前記第４のインスタンスが参照するデータ領域を特定することと、
前記第３のインスタンスの前記オフセット値に、前記第４のインスタンスの前記シフト値を加えることで前記第３のインスタンスの開始位置を特定することと、
を含む、請求項２に記載の変換プログラム実行システム。
【請求項４】
ＣＯＢＯＬソースプログラムのデータ部におけるデータ定義を順次読み込むデータ定義読み取り部と、
前記データ定義が集団項目の定義である場合、Ｊａｖａソースプログラムにおいて当該集団項目を実現するための第１のクラスの第１のインスタンスを生成する第１のソースコードを出力する集団項目定義コード出力部と、
前記データ定義が基本項目の定義であり、かつ、レベルが最上位である場合、前記Ｊａｖａソースプログラムにおいて当該基本項目を実現するための第２のクラスの第２のインスタンスを生成する第２のソースコードを出力する第１の基本項目定義コード出力部と、
前記データ定義が基本項目の定義であり、かつ、レベルが最上位でない場合、前記Ｊａｖａソースプログラムにおいて当該基本項目を実現するための第３のクラスの第３のインスタンスを前記第１のクラスのメンバ変数とする第３のソースコードを出力する第２の基本項目定義コード出力部であって、前記第１のクラス及び前記第３のクラスは、対応するデータ項目のデータ領域への参照とシフト値とを持つ第４のクラスの第４のインスタンスへの参照、オフセット値、及び前記対応するデータ項目のデータ長を示すバイト数をメンバ変数として保持し、前記オフセット値には、前記対応するデータ項目が最上位の場合、０がセットされ、前記対応するデータ項目が最上位でない場合、前記対応するデータ項目が属する最上位の集団項目における先頭のデータ項目の開始位置を０とした場合の、前記対応するデータ項目のデータ領域の開始位置がセットされる、第２の基本項目定義コード出力部と、
前記第１のソースコード及び前記第３のソースコードに基づいた前記第１のクラスの前記第１のインスタンスの生成時に、前記第４のクラスの前記第４のインスタンスを生成し、かつ、
前記第１のソースコードを含む呼び出し先プログラムを呼び出すＣＡＬＬ文から変換された命令が実行されると、
前記第１のインスタンスに対して生成された前記第４のインスタンスが参照する前記データ領域を、前記呼び出し先プログラムを呼び出す際に指定される第５のクラスの第５のインスタンスが参照する前記第４のクラスの第６のインスタンスが参照するデータ領域に変更し、及び
前記第４のインスタンスの前記シフト値を、前記第５のインスタンスの前記オフセット値に前記第６のインスタンスの前記シフト値を加えた値に変更する
プロキシインスタンス管理部と、
を備え、
前記第１のインスタンスのデータ領域内に、前記第１のクラスの前記メンバ変数である前記第３のクラスの前記第３のインスタンスのデータ領域が確保される、
情報処理システム。
【請求項５】
コンピュータが、
ＣＯＢＯＬソースプログラムのデータ部におけるデータ定義を順次読み込むことと、
前記データ定義が集団項目の定義である場合、Ｊａｖａソースプログラムにおいて当該集団項目を実現するための第１のクラスの第１のインスタンスを生成する第１のソースコードを出力することと、
前記データ定義が基本項目の定義であり、かつ、レベルが最上位である場合、前記Ｊａｖａソースプログラムにおいて当該基本項目を実現するための第２のクラスの第２のインスタンスを生成する第２のソースコードを出力することと、
前記データ定義が基本項目の定義であり、かつ、レベルが最上位でない場合、前記Ｊａｖａソースプログラムにおいて当該基本項目を実現するための第３のクラスの第３のインスタンスを前記第１のクラスのメンバ変数とする第３のソースコードを出力することであって、前記第１のクラス及び前記第３のクラスは、対応するデータ項目のデータ領域への参照を持つ第４のクラスの第４のインスタンスへの参照、オフセット値、及び前記対応するデータ項目のデータ長を示すバイト数をメンバ変数として保持し、前記オフセット値には、前記対応するデータ項目が最上位の場合、０がセットされ、前記対応するデータ項目が最上位でない場合、前記対応するデータ項目が属する最上位の集団項目における先頭のデータ項目の開始位置を０とした場合の、前記対応するデータ項目のデータ領域の開始位置がセットされる、ことと、
を含み、
前記第１のソースコード及び前記第３のソースコードに基づいた前記第１のクラスの前記第１のインスタンスの生成時に、前記第４のクラスの前記第４のインスタンスが生成され、かつ、前記第１のインスタンスのデータ領域内に、前記第１のクラスの前記メンバ変数である前記第３のクラスの前記第３のインスタンスのデータ領域が確保される、
プログラム変換方法。
【請求項６】
請求項５に記載されたプログラム変換方法により出力されたＪａｖａソースプログラムを実行するコンピュータが、
前記第１のインスタンスの生成時に前記第４のインスタンスを生成することであって、前記第４のクラスは、データ領域への参照、及び、シフト値を保持する、ことと、
前記第１のソースコードを含む呼び出し先プログラムを呼び出すＣＡＬＬ文から変換された命令が実行されると、
前記第１のインスタンスに対して生成された前記第４のインスタンスが参照する前記データ領域を、前記呼び出し先プログラムを呼び出す際に指定される第５のクラスの第５のインスタンスが参照する前記第４のクラスの第６のインスタンスが参照するデータ領域に変更し、及び
前記第４のインスタンスの前記シフト値を、前記第５のインスタンスの前記オフセット値に前記第６のインスタンスの前記シフト値を加えた値に変更することと、
を含む変換プログラム実行方法。
【請求項７】
コンピュータが、
ＣＯＢＯＬソースプログラムのデータ部におけるデータ定義を順次読み込むことと、
前記データ定義が集団項目の定義である場合、Ｊａｖａソースプログラムにおいて当該集団項目を実現するための第１のクラスの第１のインスタンスを生成する第１のソースコードを出力することと、
前記データ定義が基本項目の定義であり、かつ、レベルが最上位である場合、前記Ｊａｖａソースプログラムにおいて当該基本項目を実現するための第２のクラスの第２のインスタンスを生成する第２のソースコードを出力することと、
前記データ定義が基本項目の定義であり、かつ、レベルが最上位でない場合、前記Ｊａｖａソースプログラムにおいて当該基本項目を実現するための第３のクラスの第３のインスタンスを前記第１のクラスのメンバ変数とする第３のソースコードを出力することであって、前記第１のクラス及び前記第３のクラスは、対応するデータ項目のデータ領域への参照とシフト値とを持つ第４のクラスの第４のインスタンスへの参照、オフセット値、及び前記対応するデータ項目のデータ長を示すバイト数をメンバ変数として保持し、前記オフセット値には、前記対応するデータ項目が最上位の場合、０がセットされ、前記対応するデータ項目が最上位でない場合、前記対応するデータ項目が属する最上位の集団項目における先頭のデータ項目の開始位置を０とした場合の、前記対応するデータ項目のデータ領域の開始位置がセットされる、ことと、
前記第１のソースコード及び前記第３のソースコードに基づいた前記第１のクラスの前記第１のインスタンスの生成時に、前記第４のクラスの前記第４のインスタンスを生成することと、
前記第１のソースコードを含む呼び出し先プログラムを呼び出すＣＡＬＬ文から変換された命令が実行されると、
前記第１のインスタンスに対して生成された前記第４のインスタンスが参照する前記データ領域を、前記呼び出し先プログラムを呼び出す際に指定される第５のクラスの第５のインスタンスが参照する前記第４のクラスの第６のインスタンスが参照するデータ領域に変更し、及び
前記第４のインスタンスの前記シフト値を、前記第５のインスタンスの前記オフセット値に前記第６のインスタンスの前記シフト値を加えた値に変更することと、
を含み、
前記第１のインスタンスのデータ領域内に、前記第１のクラスの前記メンバ変数である前記第３のクラスの前記第３のインスタンスのデータ領域が確保される、
情報処理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラム変換システムの技術に関する。
【背景技術】
【０００２】
基幹システムのオープン化に伴い、ＣＯＢＯＬソースプログラムのＪａｖａ（登録商標）ソースプログラムへの変換が注目されている。
【０００３】
ＣＯＢＯＬにおけるＣＡＬＬ呼び出しでは、呼び出し元プログラムの引数に“BY REFERENCE”が明示的又は暗黙的に指定されると、呼び出し元プログラムの引数と呼び出し先プログラムの仮引数間でデータ領域の共有が行われる。具体的には、BY REFERENCEを指定した場合、引数の値が格納されたデータ領域のアドレスが呼び出し先プログラムに渡されるので、呼び出し元プログラムと呼び出し先プログラムとで同じアドレスが指し示すデータ領域を参照することになる。この際、ＣＯＢＯＬでは、引数と仮引数との間でデータ項目名が異なっていても問題は生じない。一方、Ｊａｖａでは、引数と仮引数とで型が一致する場合にのみ、引数のアドレスを呼び出し先プログラムに渡す参照渡しが可能である。
【０００４】
特許文献１では、ＣＯＢＯＬソースプログラムにて引数のデータ項目名を調整することにより、ＣＯＢＯＬソースプログラムから変換した後のＪａｖａソースプログラムで引数及び仮引数の型を一致させる手法が提示されている。これにより、通常の変換では引数と仮引数で型が一致しないケースでも引数の参照渡しが可能となり、ＣＯＢＯＬソースプログラムから変換されたＪａｖａソースプログラムの性能の劣化を抑制することができる。
また、特許文献２では、ＣＯＢＯＬソースプログラムのデータ定義において集団項目が定義される場合におけるデータ領域の管理の手法が提示されている。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２０１８−５５４４８号公報
【特許文献２】特開２０１６−１１５０７０号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
特許文献１では、ＣＡＬＬ呼び出しの呼び出し元プログラムの引数と呼び出し先の仮引数とで共通のＣＯＰＹ句が使用されている必要があり、それ以外の場合については、ＣＯＢＯＬソースプログラムから変換されたＪａｖａソースプログラム上で呼び出し元プログラムの引数と呼び出し先プログラムの仮引数との間で参照渡しを行うことができなかった。特許文献２では、ＣＯＢＯＬソースプログラムから変換されたＪａｖａソースプログラムにおいて、集団項目単位でのデータ転送の処理コストの削減には成功したものの、性能を劣化させずに引数と仮引数との間でデータ領域の共有を実現することができなかった。
【０００７】
本発明はこのような事情に鑑みてなされたものであり、ＣＯＢＯＬソースプログラムから変換されたＪａｖａソースプログラムの性能の劣化を抑制しつつ、ＣＡＬＬ呼び出しの呼び出し元プログラムの引数と呼び出し先プログラムの仮引数との間でデータ領域の共有を実現することを目的とする。
【課題を解決するための手段】
【０００８】
本発明の一態様に係るプログラム変換システムは、ＣＯＢＯＬソースプログラムのデータ部におけるデータ定義を順次読み込むデータ定義読み取り部と、データ定義が集団項目の定義である場合、Ｊａｖａソースプログラムにおいて当該集団項目を実現するための第１のクラスの第１のインスタンスを生成する第１のソースコードを出力する集団項目定義コード出力部と、データ定義が基本項目の定義であり、かつ、レベルが最上位である場合、Ｊａｖａソースプログラムにおいて当該基本項目を実現するための第２のクラスの第２のインスタンスを生成する第２のソースコードを出力する第１の基本項目定義コード出力部と、データ定義が基本項目の定義であり、かつ、レベルが最上位でない場合、Ｊａｖａソースプログラムにおいて当該基本項目を実現するための第３のクラスの第３のインスタンスを第１のクラスのメンバ変数とする第３のソースコードを出力する第２の基本項目定義コード出力部であって、第１のクラス及び第３のクラスは、対応するデータ項目のデータ領域への参照を持つ第４のクラスの第４のインスタンスへの参照、オフセット値、及び対応するデータ項目のデータ長を示すバイト数をメンバ変数として保持し、オフセット値には、対応するデータ項目が最上位の場合、０がセットされ、対応するデータ項目が最上位でない場合、対応するデータ項目が属する最上位の集団項目における先頭のデータ項目の開始位置を０とした場合の、対応するデータ項目のデータ領域の開始位置がセットされる、第２の基本項目定義コード出力部と、を備え、第１のソースコード及び第３のソースコードに基づいた第１のクラスの第１のインスタンスの生成時に、第４のクラスの第４のインスタンスが生成され、かつ、第１のインスタンスのデータ領域内に、第１のクラスのメンバ変数である第３のクラスの第３のインスタンスのデータ領域が確保される。
【０００９】
また、本発明の一態様に係る変換プログラム実行システムは、第１のインスタンスの生成時に第４のインスタンスを生成し、第４のクラスは、データ領域への参照、及び、シフト値を保持し、かつ、第１のソースコードを含む呼び出し先プログラムを呼び出すＣＡＬＬ文から変換された命令が実行されると、第１のインスタンスに対して生成された第４のインスタンスが参照するデータ領域を、呼び出し先プログラムを呼び出す際に指定される第５のクラスの第５のインスタンスが参照する第４のクラスの第６のインスタンスが参照するデータ領域に変更し、及び第４のインスタンスのシフト値を、第５のインスタンスのオフセット値に第６のインスタンスのシフト値を加えた値に変更するプロキシインスタンス管理部、を備える。
【００１０】
本発明の一態様に係る情報処理システムは、ＣＯＢＯＬソースプログラムのデータ部におけるデータ定義を順次読み込むデータ定義読み取り部と、データ定義が集団項目の定義である場合、Ｊａｖａソースプログラムにおいて当該集団項目を実現するための第１のクラスの第１のインスタンスを生成する第１のソースコードを出力する集団項目定義コード出力部と、データ定義が基本項目の定義であり、かつ、レベルが最上位である場合、Ｊａｖａソースプログラムにおいて当該基本項目を実現するための第２のクラスの第２のインスタンスを生成する第２のソースコードを出力する第１の基本項目定義コード出力部と、データ定義が基本項目の定義であり、かつ、レベルが最上位でない場合、Ｊａｖａソースプログラムにおいて当該基本項目を実現するための第３のクラスの第３のインスタンスを第１のクラスのメンバ変数とする第３のソースコードを出力する第２の基本項目定義コード出力部であって、第１のクラス及び第３のクラスは、対応するデータ項目のデータ領域への参照とシフト値とを持つ第４のクラスの第４のインスタンスへの参照、オフセット値、及び対応するデータ項目のデータ長を示すバイト数をメンバ変数として保持し、オフセット値には、対応するデータ項目が最上位の場合、０がセットされ、対応するデータ項目が最上位でない場合、対応するデータ項目が属する最上位の集団項目における先頭のデータ項目の開始位置を０とした場合の、対応するデータ項目のデータ領域の開始位置がセットされる、第２の基本項目定義コード出力部と、第１のソースコード及び第３のソースコードに基づいた第１のクラスの第１のインスタンスの生成時に、第４のクラスの第４のインスタンスを生成し、かつ、第１のソースコードを含む呼び出し先プログラムを呼び出すＣＡＬＬ文から変換された命令が実行されると、第１のインスタンスに対して生成された第４のインスタンスが参照するデータ領域を、呼び出し先プログラムを呼び出す際に指定される第５のクラスの第５のインスタンスが参照する第４のクラスの第６のインスタンスが参照するデータ領域に変更し、及び第４のインスタンスのシフト値を、第５のインスタンスのオフセット値に第６のインスタンスのシフト値を加えた値に変更するプロキシインスタンス管理部と、を備え、第１のインスタンスのデータ領域内に、第１のクラスのメンバ変数である第３のクラスの第３のインスタンスのデータ領域が確保される。
【００１１】
本発明の一態様に係るプログラム変換方法は、コンピュータが、ＣＯＢＯＬソースプログラムのデータ部におけるデータ定義を順次読み込むことと、データ定義が集団項目の定義である場合、Ｊａｖａソースプログラムにおいて当該集団項目を実現するための第１のクラスの第１のインスタンスを生成する第１のソースコードを出力することと、データ定義が基本項目の定義であり、かつ、レベルが最上位である場合、Ｊａｖａソースプログラムにおいて当該基本項目を実現するための第２のクラスの第２のインスタンスを生成する第２のソースコードを出力することと、データ定義が基本項目の定義であり、かつ、レベルが最上位でない場合、Ｊａｖａソースプログラムにおいて当該基本項目を実現するための第３のクラスの第３のインスタンスを第１のクラスのメンバ変数とする第３のソースコードを出力することであって、第１のクラス及び第３のクラスは、対応するデータ項目のデータ領域への参照を持つ第４のクラスの第４のインスタンスへの参照、オフセット値、及び対応するデータ項目のデータ長を示すバイト数をメンバ変数として保持し、オフセット値には、対応するデータ項目が最上位の場合、０がセットされ、対応するデータ項目が最上位でない場合、対応するデータ項目が属する最上位の集団項目における先頭のデータ項目の開始位置を０とした場合の、対応するデータ項目のデータ領域の開始位置がセットされる、ことと、を含み、第１のソースコード及び第３のソースコードに基づいた第１のクラスの第１のインスタンスの生成時に、第４のクラスの第４のインスタンスが生成され、かつ、第１のインスタンスのデータ領域内に、第１のクラスのメンバ変数である第３のクラスの第３のインスタンスのデータ領域が確保される。
【００１２】
本発明の一態様に係る変換プログラム実行方法は、上記プログラム変換方法により出力されたＪａｖａソースプログラムを実行するコンピュータが、第１のインスタンスの生成時に第４のインスタンスを生成することであって、第４のクラスは、データ領域への参照、及び、シフト値を保持する、ことと、第１のソースコードを含む呼び出し先プログラムを呼び出すＣＡＬＬ文から変換された命令が実行されると、第１のインスタンスに対して生成された第４のインスタンスが参照するデータ領域を、呼び出し先プログラムを呼び出す際に指定される第５のクラスの第５のインスタンスが参照する第４のクラスの第６のインスタンスが参照するデータ領域に変更し、及び第４のインスタンスのシフト値を、第５のインスタンスのオフセット値に第６のインスタンスのシフト値を加えた値に変更することと、を含む。
【００１３】
本発明の一態様に係る情報処理方法は、コンピュータが、ＣＯＢＯＬソースプログラムのデータ部におけるデータ定義を順次読み込むことと、データ定義が集団項目の定義である場合、Ｊａｖａソースプログラムにおいて当該集団項目を実現するための第１のクラスの第１のインスタンスを生成する第１のソースコードを出力することと、データ定義が基本項目の定義であり、かつ、レベルが最上位である場合、Ｊａｖａソースプログラムにおいて当該基本項目を実現するための第２のクラスの第２のインスタンスを生成する第２のソースコードを出力することと、データ定義が基本項目の定義であり、かつ、レベルが最上位でない場合、Ｊａｖａソースプログラムにおいて当該基本項目を実現するための第３のクラスの第３のインスタンスを第１のクラスのメンバ変数とする第３のソースコードを出力することであって、第１のクラス及び第３のクラスは、対応するデータ項目のデータ領域への参照とシフト値とを持つ第４のクラスの第４のインスタンスへの参照、オフセット値、及び対応するデータ項目のデータ長を示すバイト数をメンバ変数として保持し、オフセット値には、対応するデータ項目が最上位の場合、０がセットされ、対応するデータ項目が最上位でない場合、対応するデータ項目が属する最上位の集団項目における先頭のデータ項目の開始位置を０とした場合の、対応するデータ項目のデータ領域の開始位置がセットされる、ことと、第１のソースコード及び第３のソースコードに基づいた第１のクラスの第１のインスタンスの生成時に、第４のクラスの第４のインスタンスを生成することと、第１のソースコードを含む呼び出し先プログラムを呼び出すＣＡＬＬ文から変換された命令が実行されると、第１のインスタンスに対して生成された第４のインスタンスが参照するデータ領域を、呼び出し先プログラムを呼び出す際に指定される第５のクラスの第５のインスタンスが参照する第４のクラスの第６のインスタンスが参照するデータ領域に変更し、及び第４のインスタンスのシフト値を、第５のインスタンスのオフセット値に第６のインスタンスのシフト値を加えた値に変更することと、を含み、第１のインスタンスのデータ領域内に、第１のクラスのメンバ変数である第３のクラスの第３のインスタンスのデータ領域が確保される。
【００１４】
なお、本発明において、「部」とは、単に物理的手段を意味するものではなく、その「部」が有する機能をソフトウェアによって実現する場合も含む。また、１つの「部」や装置が有する機能が２つ以上の物理的手段や装置により実現されても、２つ以上の「部」や装置の機能が１つの物理的手段や装置により実現されてもよい。
【発明の効果】
【００１５】
本発明によれば、ＣＯＢＯＬソースプログラムから変換されたＪａｖａソースプログラムの性能の劣化を抑制しつつ、ＣＡＬＬ呼び出しの呼び出し元プログラムの引数と呼び出し先プログラムの仮引数との間でデータ領域の共有を実現することが可能となる。
【図面の簡単な説明】
【００１６】
【図１】プログラム変換が行われるシステム全体の概略を示す図である。
【図２】プログラム変換システム１００が備える機能の一例を示すブロック図である。
【図３】ＣＡＬＬ呼び出しの呼び出し元プログラム及び呼び出し先プログラムの例を示す図である。
【図４】変換プログラム実行システム１２０が備える機能の一例を示すブロック図である。
【図５】プログラム変換システム１００におけるデータ型の変換規則の一例を示す図である。
【図６】ＣＯＢＯＬのデータ定義の変換処理の一例を示すフローチャートである。
【図７】変換処理において出力されるコードの一例を示す図である。
【図８】ＣＯＢＯＬソースプログラムからＪａｖａソースプログラムへの変換の一例を示す図である。
【図９】Ｊａｖａで定義された変数のデータ領域の構造の一例を示す図である。
【図１０】図８に示される集団項目が定義される呼び出し先プログラムのインスタンスが生成された場合の、当該集団項目のデータ領域の一例を示す図である。
【図１１】図１０に示される集団項目のデータ領域が、ＣＡＬＬ呼び出しによって変更された一例を示す図である。
【図１２】従来技術の手法によって、図８に示される集団項目が定義される呼び出し先プログラムのインスタンスが生成された場合の、当該集団項目のデータ領域の一例を示す図である。
【図１３】従来技術の手法によって、図１２に示される集団項目のデータ領域が、ＣＡＬＬ呼び出しによって変更された一例を示す図である。
【発明を実施するための形態】
【００１７】
（システム全体の構成）
以下、図面を参照して本発明の一実施形態について説明する。図１は、プログラム変換が行われるシステム全体の概略を示す図である。本システムでは、プログラム変換システム１００により、ホストコンピュータ１１０で稼働するプログラムが、変換プログラム実行システム１２０で稼働するプログラムに変換される。具体的には、ホストコンピュータ１１０では、ＣＯＢＯＬプログラム１３０が動作している。プログラム変換システム１００は、ＣＯＢＯＬプログラム１３０のソースコードであるＣＯＢＯＬソースプログラム１４０をＪａｖａソースプログラム１５０に変換する。Ｊａｖａソースプログラム１５０は、コンパイルされてＪａｖａバイトコード１６０となる。そして、Ｊａｖａバイトコード１６０は、変換プログラム実行システム１２０で実行される。
【００１８】
（プログラム変換システムの構成）
図２は、プログラム変換システム１００が備える機能の一例を示すブロック図である。プログラム変換システム１００は、変換規則記憶部２００、プログラム変換部２１０、ＣＯＢＯＬソースプログラム記憶部２２０、及びＪａｖａソースプログラム記憶部２３０を備える。また、プログラム変換部２１０は、データ定義読み取り部２１１、集団項目定義コード出力部２１２、第１の基本項目定義コード出力部２１３、及び第２の基本項目定義コード出力部２１４を含む。プログラム変換システム１００は、例えば、１台または複数台のコンピュータを用いて構成される。プログラム変換システム１００を構成する各部は、例えば、メモリやハードディスク等の記憶領域を用いたり、記憶領域に格納されたプログラムをプロセッサが実行したりすることにより実現される。
【００１９】
変換規則記憶部２００は、ＣＯＢＯＬソースプログラムをＪａｖａソースプログラムに変換するための変換規則を記憶する。
【００２０】
プログラム変換部２１０は、変換規則に基づいて、ＣＯＢＯＬソースプログラムをＪａｖａソースプログラムに変換する。
【００２１】
データ定義読み取り部２１１は、ＣＯＢＯＬソースプログラムのデータ部（DATA DIVISION）の変換のために、データ部におけるデータ定義を順次読み込む。
【００２２】
集団項目定義コード出力部２１２は、ＣＯＢＯＬソースプログラムにおけるデータ定義が集団項目の定義である場合、Ｊａｖａソースプログラムにおいて当該集団項目を実現するためのクラス（第１のクラス）のインスタンス（第１のインスタンス）を生成するソースコードを出力する。
【００２３】
第１の基本項目定義コード出力部２１３は、ＣＯＢＯＬソースプログラムにおけるデータ定義が基本項目の定義であり、かつ、レベルが最上位（例えば「０１」）である場合、Ｊａｖａソースプログラムにおいて当該基本項目を実現するためのクラス（第２のクラス）のインスタンス（第２のインスタンス）を生成するソースコードを出力する。
【００２４】
第２の基本項目定義コード出力部２１４は、ＣＯＢＯＬソースプログラムにおけるデータ定義が基本項目の定義であり、かつ、レベルが最上位でない場合、当該基本項目を実現するためのクラス（第３のクラス）のインスタンス（第３のインスタンス）を、集団項目を実現するためのクラス（第１のクラス）のメンバ変数とするソースコードを出力する。
【００２５】
データ定義読み取り部２１１、集団項目定義コード出力部２１２、第１の基本項目定義コード出力部２１３、及び第２の基本項目定義コード出力部２１４の詳細については、具体例を用いて後述する。
【００２６】
ＣＯＢＯＬソースプログラム記憶部２２０は、変換前のＣＯＢＯＬソースプログラムを記憶する。図３には、変換前のＣＯＢＯＬソースプログラム群のうち、ＣＡＬＬ呼び出しの呼び出し元プログラム及び呼び出し先プログラムが示されている。呼び出し元プログラムは、呼び出し先プログラムを呼び出すＣＡＬＬ文を含む。そして、呼び出し元プログラムでは、引数に“BY REFERENCE”が暗黙的に指定されることで、呼び出し元プログラムの引数「BODY」と呼び出し先プログラムの仮引数「GRP1」との間でデータ領域の共有が行われることが示されている。
【００２７】
Ｊａｖａソースプログラム記憶部２３０は、変換後のＪａｖａソースプログラムを記憶する。
【００２８】
（変換プログラム実行システムの構成）
図４は、変換プログラム実行システム１２０が備える機能の一例を示すブロック図である。変換プログラム実行システム１２０は、ＪａｖａＶＭ実行部３００、Ｊａｖａバイトコード記憶部３１０、及びプログラム実行部３２０を含む。また、プログラム実行部３２０は、プロキシインスタンス管理部３２１を含む。変換プログラム実行システム１２０は、例えば、１台または複数台のコンピュータを用いて構成される。変換プログラム実行システム１２０を構成する各部は、例えば、メモリやハードディスク等の記憶領域を用いたり、記憶領域に格納されたプログラムをプロセッサが実行したりすることにより実現される。
【００２９】
ＪａｖａＶＭ実行部３００は、Ｊａｖａバイトコードを実行するためのプラットフォームであるＪａｖａＶＭを実行する。
【００３０】
Ｊａｖａバイトコード記憶部３１０は、変換されたＪａｖａソースプログラムをコンパイルしたＪａｖａバイトコードを記憶する。
【００３１】
プログラム実行部３２０は、Ｊａｖａバイトコードを実行する。プログラム実行部３２０は、Ｊａｖａバイトコードを実行するための各種ライブラリ（クラスライブラリ等）を含む。
【００３２】
プロキシインスタンス管理部３２１は、変換されたＪａｖａソースプログラムで定義される最上位のデータ項目毎にProxyクラス（第４のクラス）のインスタンス（第４のインスタンス、第６のインスタンス）を生成する。Proxyクラスは、（１）任意のデータ領域への参照、及び（２）シフト値をメンバ変数として保持している。生成直後のプロキシインスタンスの「データ領域」及び「シフト値」は、当該最上位のデータ項目に割り当てられるデータ領域、及び０で初期化される。
【００３３】
また、プロキシインスタンス管理部３２１は、呼び出し先プログラムを呼び出すＣＡＬＬ文から変換された命令が実行されると、仮引数であるデータ項目に応じたプロキシインスタンスの各メンバ変数を、引数に指定されたデータ項目に基づいて変更する。具体的には、プロキシインスタンス管理部３２１は、ＣＡＬＬ呼び出し時に、仮引数であるデータ項目に応じたプロキシインスタンスの「データ領域」を引数に指定されたデータ項目が参照するプロキシインスタンスの「データ領域」に、そして、仮引数であるデータ項目に応じたプロキシインスタンスの「シフト値」を、引数に指定されたデータ項目の「オフセット値」に、当該仮引数であるデータ項目が参照するプロキシインスタンスの「シフト値」を加えた値に変更する。オフセット値については後述する。
【００３４】
（プログラム変換システムでの変換処理）
図５は、プログラム変換システム１００におけるデータ型の変換規則の一例を示す図である。図５において、左側の欄には、ＣＯＢＯＬのデータ型が示されており、右側の欄には、ＣＯＢＯＬのデータ型と同等の機能を実現するためのＪａｖａのラッパークラスが示されている。例えば、１〜９桁の符号無し整数（9(1)〜PIC 9(9)）は、CIntというラッパークラスに変換される。
【００３５】
また、ＣＯＢＯＬの集団項目は、CGrpクラスを継承したＪａｖａクラスに変換される。さらに、ＣＯＢＯＬの配列型データは、対応するＪａｖａのラッパークラスを型とするオブジェクトの配列として変換される。ここで、ＣＯＢＯＬにおける配列の添え字は１から開始し、一方でＪａｖａにおける配列の添え字は０から開始する。そのため、本実施形態では、Ｊａｖａ変換後に、変換前のＣＯＢＯＬと同様の添え字を用いて配列のオブジェクトにアクセスすることができるように、Ｊａｖａ変換時に確保する配列の要素数をプラス１するものとする。
【００３６】
ＣＯＢＯＬのデータ項目に応じたＪａｖａのラッパークラス及びCGrpクラスを継承したＪａｖａクラスは、自身のデータ領域を特定するために、（１）Ｐｒｏｘｙ、（２）オフセット値、及び（３）自身のデータ長を示すバイト数をメンバ変数として保持している。
【００３７】
ここで、Ｐｒｏｘｙには、自身のデータ領域への参照を持つプロキシインスタンスへの参照がセットされ、データ項目が最上位の集団項目に属する場合、自身が属する最上位の集団項目に対して生成されたプロキシインスタンスへの参照がセットされる。また、オフセット値には、データ項目が最上位の場合、０がセットされ、データ項目が最上位でない場合、自身が属する最上位の集団項目における先頭のデータ項目の開始位置を０とした場合の、自身のデータ領域の開始位置がセットされる。
【００３８】
図６は、ＣＯＢＯＬのデータ定義の変換処理の一例を示すフローチャートである。図７は、変換処理において出力されるコードの一例を示す図である。図８は、ＣＯＢＯＬソースプログラムからＪａｖａソースプログラムへの変換の一例を示す図である。なお、図８に示されるＣＯＢＯＬソースプログラムは、図３に示される呼び出し先プログラムである。図９は、Ｊａｖａで定義された変数のデータ領域の構造の一例を示す図である。図７〜図９を参照しつつ、図６の処理について説明する。
【００３９】
まず、データ定義読み取り部２１１は、ＣＯＢＯＬソースプログラムのデータ部におけるデータ定義を１行読み込む（Ｓ６０１）。データ定義が終了であれば（Ｓ６０２：Ｙ）、処理は終了する。
【００４０】
データ定義が終了でない場合（Ｓ６０２：Ｎ）、集団項目定義コード出力部２１２は、データ定義が集団項目の定義であるかどうか確認する（Ｓ６０３）。集団項目の定義である場合（Ｓ６０３：Ｙ）、集団項目定義コード出力部２１２は、集団項目用のラッパークラスCGrpを継承したクラスとして、当該集団項目を定義するソースコードを出力する（Ｓ６０４）。例えば、図７（ａ）には、集団項目GRP1を定義するソースコードの一例が示されている。具体的には、クラスCGrpを継承したクラスとしてCGRP1が定義され、当該CGRP1のオブジェクトとして、GRP1が定義されている。
【００４１】
集団項目の定義ではない（即ち、基本項目である）場合（Ｓ６０３：Ｎ）、第１の基本項目定義コード出力部２１３は、データ定義が最上位であるかどうか確認する（Ｓ６０５）。最上位である場合（Ｓ６０５：Ｙ）、基本項目用のラッパークラスのオブジェクトとして当該基本項目を定義するソースコードを出力する（Ｓ６０６）。例えば、図７（ｂ）には、基本項目IDX1を定義するソースコードの一例が示されている。具体的には、クラスCIntのオブジェクトとして、IDX1が定義されている。
【００４２】
基本項目であり（Ｓ６０３：Ｎ）、かつ、最上位でない場合（Ｓ６０５：Ｎ）、第２の基本項目定義コード出力部２１４は、当該基本項目を実現するためのクラスのオブジェクトを、当該基本項目が属する集団項目のクラスのメンバ変数として定義するソースコードを出力する（Ｓ６０７）。例えば、図７（ｃ）には、集団項目GRP1に属する基本項目GRP1_IDX1を定義するソースコードの一例が示されている。ここで、図７（ｃ）に示すソースコードは、図７（ａ）に示すソースコードに、クラスCGRP1のメンバ変数として追加される。
【００４３】
図８には、図６に示される処理による変換の一例が示されている。集団項目GRP1は、変換後のＪａｖａクラスにおいて、クラスCGrpを継承したクラスCGRP1のオブジェクトとして定義されている。そして、集団項目GRP1に属する基本項目NUMは、変換後のＪａｖａクラスにおいて、クラスCGRP1のメンバ変数として定義されている。また、集団項目GRP1に属する配列型データARRAYは、変換後のＪａｖａクラスにおいて、クラスCGrpを継承したクラスCARRAYを型とするオブジェクトの配列として定義されている。前述したように、本実施形態では、Ｊａｖａ変換後に、変換前のＣＯＢＯＬと同様の添え字を用いて配列のオブジェクトにアクセスすることができるように、変換後のＪａｖａクラスにおいて、ARRAYの要素数はプラス１されている。なお、配列型データARRAYの各要素である基本項目X，Yは、変換後のＪａｖａクラスにおいて、クラスCARRAYのメンバ変数として定義されている。
【００４４】
図９には、集団項目GRP1のデータ領域の構造の一例が示されている。図９に示されるように、集団項目GRP1用にデータ領域が確保され、当該データ領域内に、集団項目GPR1の各基本項目のデータ領域が連続して確保される。具体的には、NUM，ARRAY(1).X，ARRAY(1).Y，ARRAY(2).X，ARRAY(2).Y，…，ARRAY(999).X，ARRAY(999).Y用のデータ領域として、順に、４バイト、６バイト、６バイト、…、６バイト、６バイトが確保される。
【００４５】
（変換プログラム実行システム１２０でのデータ領域共有処理）
次に、図１０及び１１を参照して、変換プログラム実行システム１２０において、ＣＡＬＬ呼び出しの呼び出し元プログラムの引数と呼び出し先プログラムの仮引数との間でデータ領域の共有を実現する手法について説明する。
【００４６】
図１０は、図８に示される呼び出し先プログラムのインスタンスが生成された場合の、当該呼び出し先プログラムに定義された集団項目のデータ領域の一例を示す図である。プロキシインスタンス管理部３２１によって、最上位のデータ項目GRP1に対してProxyクラスのインスタンスGRP1.proxyが生成されている。プロキシインスタンスGRP1.proxyの「データ領域」及び「シフト値」は、GRP1に割り当てられるデータ領域GRP1.data、及び０で初期化されている。
【００４７】
また、前述したように、各基本項目のデータ領域は、集団項目のデータ領域内に連続して設けられている。そして、各基本項目のインスタンスは、自身のデータ領域を特定するために、（１）Ｐｒｏｘｙ、（２）オフセット値、及び（３）自身のデータ長を示すバイト数をメンバ変数として保持している。
【００４８】
前述したように、データ項目が最上位の集団項目に属する場合、Ｐｒｏｘｙには、自身が属する最上位の集団項目に対して生成されたプロキシインスタンスへの参照がセットされるので、集団項目GRP1に属する各データ項目のＰｒｏｘｙには、いずれも共通してGRP1.proxyがセットされている。また、データ項目が最上位でない場合、オフセット値には、自身が属する最上位の集団項目における先頭のデータ項目の開始位置を０とした場合の、自身のデータ領域の開始位置がセットされるので、集団項目GRP1の先頭のデータ項目であるGRP1.NUMのオフセット値には０が、続くデータ項目であるGRP1.ARRAY(1).Xのオフセット値には、先行するデータ項目GRP1.NUMのバイト数分ずれた４が、さらに続くデータ項目であるGRP1.ARRAY(1).Yのオフセット値には、先行するデータ項目GRP1.ARRAY(1).Xのバイト数分さらにずれた１０がセットされ、以下、GRP1.ARRAY(999)まで同様にセットされている。
【００４９】
ここで、データ項目へのアクセスは、まず、自身の「Ｐｒｏｘｙ」にセットされたプロキシインスタンスの「データ領域」により、参照すべきデータ領域を特定し、さらに、自身の「オフセット値」に、自身の「Ｐｒｏｘｙ」にセットされたプロキシインスタンスの「シフト値」を加えることで自身のデータ領域の開始位置を特定する。例えば、GRP1.ARRAY(1).Xへのアクセスは、プロキシインスタンスGRP1.proxyの「データ領域」により、参照すべきデータ領域GRP1.dataを特定し、さらに、自身の「オフセット値（4）」に、プロキシインスタンスGRP1.proxyの「シフト値（0）」を加えることで、自身のデータ領域の開始位置（4）を特定する。
【００５０】
続いて、図１１を参照して、ＣＡＬＬ呼び出し時におけるデータ共有処理について説明する。図１１は、図１０に示される集団項目のデータ領域が、ＣＡＬＬ呼び出しによって変更された一例を示す図である。
【００５１】
前述したように、プロキシインスタンス管理部３２１は、呼び出し先プログラムを呼び出すＣＡＬＬ文から変換された命令が実行されると、仮引数であるデータ項目に応じたプロキシインスタンスの各メンバ変数を、引数に指定されたデータ項目に基づいて変更する。具体的には、プロキシインスタンス管理部３２１は、ＣＡＬＬ呼び出し時に、仮引数であるデータ項目GRP1に応じたプロキシインスタンスGRP1.proxyの「データ領域」を引数に指定されたデータ項目BODYが参照するプロキシインスタンスの「データ領域（TBL.data）」に、そして、仮引数であるデータ項目に応じたプロキシインスタンスの「シフト値」を、引数に指定されたデータ項目の「オフセット値（9=D）」に、当該引数に指定されたデータ項目が参照するプロキシインスタンスの「シフト値（0）」を加えた値（D）に変更する。
【００５２】
ＣＡＬＬ呼び出し後の仮引数のデータ項目へのアクセスも、ＣＡＬＬ呼び出し前と同様に、まず、自身の「Ｐｒｏｘｙ」にセットされたプロキシインスタンスの「データ領域」により、参照すべきデータ領域を特定し、さらに、自身の「オフセット値」に、自身の「Ｐｒｏｘｙ」にセットされたプロキシインスタンスの「シフト値」を加えることで自身のデータ領域の開始位置を特定する。例えば、GRP1.ARRAY(1).Xへのアクセスは、プロキシインスタンスGRP1.proxyの「データ領域」により、参照すべきデータ領域TBL.dataを特定し、さらに、自身の「オフセット値（4）」に、プロキシインスタンスGRP1.proxyの「シフト値（D）」を加えることで、自身のデータ領域の開始位置（4+D）を特定する。
【００５３】
（従来技術でのデータ領域共有処理）
本実施形態の特徴の理解を深めるために、図１２及び１３を参照して、従来技術の手法によってＣＡＬＬ呼び出し時のデータ共有処理を実施した場合について説明する。
【００５４】
図１２は、従来技術の手法によって、図８に示される呼び出し先プログラムのインスタンスが生成された場合の、当該呼び出し先プログラムに定義された集団項目のデータ領域の一例を示す図である。従来技術の手法では、各データ項目のインスタンスは、自身のデータ領域を特定するために、（１）最上位のデータ項目に割り当てられるデータ領域、（２）最上位のデータ項目に割り当てられるデータ領域における、自身のデータ領域の開始位置、及び（３）自身のデータ長を示すバイト数をメンバ変数として保持している。
【００５５】
図１０に示される本実施形態の一例と比較すると、従来技術の手法ではプロキシインスタンスを用いないので、各データ項目のインスタンスが、プロキシインスタンスの「データ領域」の情報を保持している。また、本実施形態に係る各データ項目インスタンスの「オフセット値」に代えて、従来技術の手法では、各データ項目のインスタンスが、最上位のデータ項目に割り当てられるデータ領域における、自身のデータ領域の開始位置を保持している。
【００５６】
具体的には、呼び出し先プログラムのインスタンスが生成された時点では、集団項目GRP1に属する各データ項目のインスタンスのデータ領域には、いずれも共通して仮引数GRP1のデータ領域「GRP1.data」がセットされている。また、最上位のデータ項目GRP1に属する先頭のデータ項目がGRP1.NUMであるため、当該GRP1.NUMの開始位置には０が、続くデータ項目であるGRP1.ARRAY(1).Xの開始位置には、先行するデータ項目GRP1.NUMのバイト数分ずれた４が、さらに続くデータ項目であるGRP1.ARRAY(1).Yの開始位置には、先行するデータ項目GRP1.ARRAY(1).Xのバイト数分さらにずれた１０がセットされ、以下、GRP1.ARRAY(999)まで同様にセットされている。
【００５７】
続いて、図１３を参照して、従来技術の手法による、ＣＡＬＬ呼び出し時におけるデータ共有処理について説明する。図１３は、図１２に示される集団項目のデータ領域が、ＣＡＬＬ呼び出しによって変更された一例を示す図である。
【００５８】
呼び出し先プログラムを呼び出すＣＡＬＬ文から変換された命令が実行されると、仮引数であるデータ項目に属するすべてのデータ項目のメンバ変数が、引数に指定されたデータ項目に基づいて変更される。具体的には、ＣＡＬＬ呼び出し時に、仮引数であるデータ項目GRP1に属するすべてのデータ項目のインスタンスの「データ領域」が、引数に指定されたデータ項目BODYの「データ領域（TBL.data）」に変更される。そして、仮引数であるデータ項目GRP1に属するすべてのデータ項目のインスタンスの「開始位置」が、引数に指定されたデータ項目BODYに属する、対応するデータ項目のインスタンスの「開始位置」に、自身の「データ領域（TBL.data）」における、データ項目BODYのデータ領域の開始位置（D=9）を加えた値に変更される。
【００５９】
ＣＡＬＬ呼び出し時の引数と仮引数間のデータ領域共有処理にかかる処理コストについて検討すると、従来技術の手法では、図１３の太枠で示されるようにデータ項目の数に応じた処理コストが発生し、一方、本実施形態では、データ項目の数に関わらず、図１１の太枠で示されるようにプロキシインスタンスに対する処理コストのみが発生する。すなわち仮引数として定義される集団項目に属するデータ項目の数が多いほど、本実施形態は従来手法より有利である。次に、呼び出し先プログラムにおける仮引数に属するデータ項目へのアクセス時の処理コストについて検討すると、従来技術の手法では、各データ項目が保持する「データ領域」及び「開始位置」を用いてそのままアクセスを行うことができるが、一方、本実施形態では、データ項目が保持するプロキシインスタンス経由で「データ領域」を特定し、データ項目が保持する「オフセット値」とプロキシインスタンスの「シフト値」とを用いて「開始位置」を計算してアクセスを行うことになる。すなわち実際にアクセスするデータ項目の数が多いほど、本実施形態は従来手法より処理コストがかかる。
【００６０】
ＣＯＢＯＬでは、集団項目に属する要素として配列型データを定義することも可能であるので、仮引数である集団項目に属するデータ項目の数が膨大になる場合もある。その中で、仮引数として膨大な数のデータ項目が属する集団項目が定義されているにも関わらず、呼び出し先プログラムにおいて、当該集団項目に属するデータ項目のごく一部のみ使用するケースも少なくなく、基幹システムで実際に稼働中のＣＯＢＯＬプログラムでは多数見られる。このように、呼び出し先プログラムで使用されるデータ項目の数が集団項目に属するすべてのデータ項目の数に比べて少ない場合に特に、本実施形態は、ＣＡＬＬ呼び出しから呼び出し先プログラムが実行され復帰するまでのトータルの処理コストを従来技術の手法に比べて少なくすることができる。
【００６１】
以上、本発明の一実施形態であるプログラム変換システム１００及び変換プログラム実行システム１２０について説明した。プログラム変換システム１００では、ＣＯＢＯＬソースプログラムのデータ定義において、集団項目に属する基本項目については、当該集団項目を実現するクラスのメンバ変数として定義される。これにより、集団項目に属する各基本項目のデータ領域は、集団項目のデータ領域内に確保される。変換プログラム実行システム１２０では、集団項目のデータ領域内に当該集団項目に属する各基本項目のデータ領域が確保される構成を利用して、ＣＡＬＬ呼び出し時の各基本項目への変更を吸収するプロキシインスタンスを用いて、ＣＡＬＬ呼び出しの呼び出し元プログラムの引数と呼び出し先プログラムの仮引数との間でデータ領域の共有を実現する。これにより、ＣＡＬＬ呼び出し時の処理コストはデータ項目の数に関わらず、プロキシインスタンスに対する処理コストのみとなり、Ｊａｖａの参照渡しと同等の性能を見込むことができる。
【００６２】
なお、本実施形態は、本発明の理解を容易にするためのものであり、本発明を限定して解釈するためのものではない。本発明は、その趣旨を逸脱することなく、変更／改良され得るととともに、本発明にはその等価物も含まれる。
【符号の説明】
【００６３】
１００…プログラム変換システム、１１０…ホストコンピュータ、１２０…変換プログラム実行システム、１３０…ＣＯＢＯＬプログラム、１４０…ＣＯＢＯＬソースプログラム、１５０…Ｊａｖａソースプログラム、１６０…Ｊａｖａバイトコード、２００…変換規則記憶部、２１０…プログラム変換部、２１１…データ定義読み取り部、２１２…集団項目定義コード出力部、２１３…第１の基本項目定義コード出力部、２１４…第２の基本項目定義コード出力部、２２０…ＣＯＢＯＬソースプログラム記憶部、２３０…Ｊａｖａソースプログラム記憶部、３００…ＪａｖａＶＭ実行部、３１０…Ｊａｖａバイトコード記憶部、３２０…プログラム実行部、３２１…プロキシインスタンス管理部
【図１】
2020060842.tif 000003
【図２】
2020060842.tif 000004
【図３】
2020060842.tif 000005
【図４】
2020060842.tif 000006
【図５】
2020060842.tif 000007
【図６】
2020060842.tif 000008
【図７】
2020060842.tif 000009
【図８】
2020060842.tif 000010
【図９】
2020060842.tif 000011
【図１０】
2020060842.tif 000012
【図１１】
2020060842.tif 000013
【図１２】
2020060842.tif 000014
【図１３】
2020060842.tif 000015
【手続補正書】
【提出日】平成30年12月20日(2018.12.20)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
ＣＯＢＯＬソースプログラムのデータ部におけるデータ定義を順次読み込むデータ定義読み取り部と、
前記データ定義が集団項目の定義である場合、Ｊａｖａソースプログラムにおいて当該集団項目を実現するための第１のクラスの第１のインスタンスを生成する第１のソースコードを出力する集団項目定義コード出力部であって、前記第１のクラスは、対応するデータ項目のデータ領域への参照を持つ第４のクラスの第４のインスタンスへの参照、オフセット値、及び前記対応するデータ項目のデータ長を示すバイト数をメンバ変数として保持し、前記オフセット値には、０がセットされる、集団項目定義コード出力部と、
前記データ定義が基本項目の定義であり、かつ、レベルが最上位である場合、前記Ｊａｖａソースプログラムにおいて当該基本項目を実現するための第２のクラスの第２のインスタンスを生成する第２のソースコードを出力する第１の基本項目定義コード出力部と、
前記データ定義が基本項目の定義であり、かつ、レベルが最上位でない場合、前記Ｊａｖａソースプログラムにおいて当該基本項目を実現するための第３のクラスの第３のインスタンスを前記第１のクラスのメンバ変数とする第３のソースコードを出力する第２の基本項目定義コード出力部であって、前記第３のクラスは、前記第４のクラスの前記第４のインスタンスへの参照、オフセット値、及び前記対応するデータ項目のデータ長を示すバイト数をメンバ変数として保持し、前記オフセット値には、前記対応するデータ項目が属する最上位の集団項目における先頭のデータ項目の開始位置を０とした場合の、前記対応するデータ項目のデータ領域の開始位置がセットされる、第２の基本項目定義コード出力部と、
を備え、
前記第１のソースコード及び前記第３のソースコードに基づいた前記第１のクラスの前記第１のインスタンスの生成時に、前記第４のクラスの前記第４のインスタンスが生成され、かつ、前記第１のインスタンスのデータ領域内に、前記第１のクラスの前記メンバ変数である前記第３のクラスの前記第３のインスタンスのデータ領域が確保される、
プログラム変換システム。
【請求項２】
請求項１に記載されたプログラム変換システムから出力されたＪａｖａソースプログラムを実行する変換プログラム実行システムであって、
前記第１のインスタンスの生成時に前記第４のインスタンスを生成し、前記第４のクラスは、データ領域への参照、及び、シフト値を保持し、かつ、
前記第１のソースコードを含む呼び出し先プログラムを呼び出すＣＡＬＬ文から変換された命令が実行されると、
前記第１のインスタンスに対して生成された前記第４のインスタンスが参照する前記データ領域を、前記呼び出し先プログラムを呼び出す際に指定される第５のクラスの第５のインスタンスが参照する前記第４のクラスの第６のインスタンスが参照するデータ領域に変更し、及び
前記第４のインスタンスの前記シフト値を、前記第５のインスタンスの前記オフセット値に前記第６のインスタンスの前記シフト値を加えた値に変更する
プロキシインスタンス管理部、
を備える変換プログラム実行システム。
【請求項３】
前記第１のインスタンスの前記メンバ変数である前記第３のインスタンスにアクセスすることは、
前記第３のインスタンスが参照する前記第４のインスタンスが参照するデータ領域を特定することと、
前記第３のインスタンスの前記オフセット値に、前記第４のインスタンスの前記シフト値を加えることで前記第３のインスタンスの開始位置を特定することと、
を含む、請求項２に記載の変換プログラム実行システム。
【請求項４】
ＣＯＢＯＬソースプログラムのデータ部におけるデータ定義を順次読み込むデータ定義読み取り部と、
前記データ定義が集団項目の定義である場合、Ｊａｖａソースプログラムにおいて当該集団項目を実現するための第１のクラスの第１のインスタンスを生成する第１のソースコードを出力する集団項目定義コード出力部であって、前記第１のクラスは、対応するデータ項目のデータ領域への参照とシフト値とを持つ第４のクラスの第４のインスタンスへの参照、オフセット値、及び前記対応するデータ項目のデータ長を示すバイト数をメンバ変数として保持し、前記オフセット値には、０がセットされる、集団項目定義コード出力部と、
前記データ定義が基本項目の定義であり、かつ、レベルが最上位である場合、前記Ｊａｖａソースプログラムにおいて当該基本項目を実現するための第２のクラスの第２のインスタンスを生成する第２のソースコードを出力する第１の基本項目定義コード出力部と、
前記データ定義が基本項目の定義であり、かつ、レベルが最上位でない場合、前記Ｊａｖａソースプログラムにおいて当該基本項目を実現するための第３のクラスの第３のインスタンスを前記第１のクラスのメンバ変数とする第３のソースコードを出力する第２の基本項目定義コード出力部であって、前記第３のクラスは、前記第４のクラスの前記第４のインスタンスへの参照、オフセット値、及び前記対応するデータ項目のデータ長を示すバイト数をメンバ変数として保持し、前記オフセット値には、前記対応するデータ項目が属する最上位の集団項目における先頭のデータ項目の開始位置を０とした場合の、前記対応するデータ項目のデータ領域の開始位置がセットされる、第２の基本項目定義コード出力部と、
前記第１のソースコード及び前記第３のソースコードに基づいた前記第１のクラスの前記第１のインスタンスの生成時に、前記第４のクラスの前記第４のインスタンスを生成し、かつ、
前記第１のソースコードを含む呼び出し先プログラムを呼び出すＣＡＬＬ文から変換された命令が実行されると、
前記第１のインスタンスに対して生成された前記第４のインスタンスが参照する前記データ領域を、前記呼び出し先プログラムを呼び出す際に指定される第５のクラスの第５のインスタンスが参照する前記第４のクラスの第６のインスタンスが参照するデータ領域に変更し、及び
前記第４のインスタンスの前記シフト値を、前記第５のインスタンスの前記オフセット値に前記第６のインスタンスの前記シフト値を加えた値に変更する
プロキシインスタンス管理部と、
を備え、
前記第１のインスタンスのデータ領域内に、前記第１のクラスの前記メンバ変数である前記第３のクラスの前記第３のインスタンスのデータ領域が確保される、
情報処理システム。
【請求項５】
コンピュータが、
ＣＯＢＯＬソースプログラムのデータ部におけるデータ定義を順次読み込むことと、
前記データ定義が集団項目の定義である場合、Ｊａｖａソースプログラムにおいて当該集団項目を実現するための第１のクラスの第１のインスタンスを生成する第１のソースコードを出力することと、
前記データ定義が基本項目の定義であり、かつ、レベルが最上位である場合、前記Ｊａｖａソースプログラムにおいて当該基本項目を実現するための第２のクラスの第２のインスタンスを生成する第２のソースコードを出力することと、
前記データ定義が基本項目の定義であり、かつ、レベルが最上位でない場合、前記Ｊａｖａソースプログラムにおいて当該基本項目を実現するための第３のクラスの第３のインスタンスを前記第１のクラスのメンバ変数とする第３のソースコードを出力することであって、前記第１のクラス及び前記第３のクラスは、対応するデータ項目のデータ領域への参照を持つ第４のクラスの第４のインスタンスへの参照、オフセット値、及び前記対応するデータ項目のデータ長を示すバイト数をメンバ変数として保持し、前記オフセット値には、前記対応するデータ項目が最上位の場合、０がセットされ、前記対応するデータ項目が最上位でない場合、前記対応するデータ項目が属する最上位の集団項目における先頭のデータ項目の開始位置を０とした場合の、前記対応するデータ項目のデータ領域の開始位置がセットされる、ことと、
を含み、
前記第１のソースコード及び前記第３のソースコードに基づいた前記第１のクラスの前記第１のインスタンスの生成時に、前記第４のクラスの前記第４のインスタンスが生成され、かつ、前記第１のインスタンスのデータ領域内に、前記第１のクラスの前記メンバ変数である前記第３のクラスの前記第３のインスタンスのデータ領域が確保される、
プログラム変換方法。
【請求項６】
請求項５に記載されたプログラム変換方法により出力されたＪａｖａソースプログラムを実行するコンピュータが、
前記第１のインスタンスの生成時に前記第４のインスタンスを生成することであって、前記第４のクラスは、データ領域への参照、及び、シフト値を保持する、ことと、
前記第１のソースコードを含む呼び出し先プログラムを呼び出すＣＡＬＬ文から変換された命令が実行されると、
前記第１のインスタンスに対して生成された前記第４のインスタンスが参照する前記データ領域を、前記呼び出し先プログラムを呼び出す際に指定される第５のクラスの第５のインスタンスが参照する前記第４のクラスの第６のインスタンスが参照するデータ領域に変更し、及び
前記第４のインスタンスの前記シフト値を、前記第５のインスタンスの前記オフセット値に前記第６のインスタンスの前記シフト値を加えた値に変更することと、
を含む変換プログラム実行方法。
【請求項７】
コンピュータが、
ＣＯＢＯＬソースプログラムのデータ部におけるデータ定義を順次読み込むことと、
前記データ定義が集団項目の定義である場合、Ｊａｖａソースプログラムにおいて当該集団項目を実現するための第１のクラスの第１のインスタンスを生成する第１のソースコードを出力することと、
前記データ定義が基本項目の定義であり、かつ、レベルが最上位である場合、前記Ｊａｖａソースプログラムにおいて当該基本項目を実現するための第２のクラスの第２のインスタンスを生成する第２のソースコードを出力することと、
前記データ定義が基本項目の定義であり、かつ、レベルが最上位でない場合、前記Ｊａｖａソースプログラムにおいて当該基本項目を実現するための第３のクラスの第３のインスタンスを前記第１のクラスのメンバ変数とする第３のソースコードを出力することであって、前記第１のクラス及び前記第３のクラスは、対応するデータ項目のデータ領域への参照とシフト値とを持つ第４のクラスの第４のインスタンスへの参照、オフセット値、及び前記対応するデータ項目のデータ長を示すバイト数をメンバ変数として保持し、前記オフセット値には、前記対応するデータ項目が最上位の場合、０がセットされ、前記対応するデータ項目が最上位でない場合、前記対応するデータ項目が属する最上位の集団項目における先頭のデータ項目の開始位置を０とした場合の、前記対応するデータ項目のデータ領域の開始位置がセットされる、ことと、
前記第１のソースコード及び前記第３のソースコードに基づいた前記第１のクラスの前記第１のインスタンスの生成時に、前記第４のクラスの前記第４のインスタンスを生成することと、
前記第１のソースコードを含む呼び出し先プログラムを呼び出すＣＡＬＬ文から変換された命令が実行されると、
前記第１のインスタンスに対して生成された前記第４のインスタンスが参照する前記データ領域を、前記呼び出し先プログラムを呼び出す際に指定される第５のクラスの第５のインスタンスが参照する前記第４のクラスの第６のインスタンスが参照するデータ領域に変更し、及び
前記第４のインスタンスの前記シフト値を、前記第５のインスタンスの前記オフセット値に前記第６のインスタンスの前記シフト値を加えた値に変更することと、
を含み、
前記第１のインスタンスのデータ領域内に、前記第１のクラスの前記メンバ変数である前記第３のクラスの前記第３のインスタンスのデータ領域が確保される、
情報処理方法。