(57)【要約】【課題】データ項目の実データ型に基づく処理の実行を可能にするコンパイルを行うコンパイラ、コンパイル装置及びコンパイル方法を提供する。【解決手段】第１ソースコードに含まれる第１変数を格納する変数格納領域に対応付けて、第１変数のデータ型を格納する第１情報格納領域を確保し、第１情報格納領域に格納されたデータ型は、第１ソースコードから生成された第１オブジェクトの実行の際の第１変数の更新に応じて更新され、かつ、変数格納領域に格納された第１変数とともに外部プログラムにより取得可能である。【選択図】図１４
2017016503.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータに、
第１ソースコードに含まれる第１変数を格納する変数格納領域に対応付けて、前記第１変数のデータ型を格納する第１情報格納領域を確保する、
処理を実行させ、
前記第１情報格納領域に格納された前記データ型は、前記第１ソースコードから生成された第１オブジェクトの実行の際の前記第１変数の更新に応じて更新され、かつ、前記変数格納領域に格納された前記第１変数とともに外部プログラムにより取得可能である、
ことを特徴とするコンパイラ。
【請求項２】
請求項１において、
前記第１情報格納領域は、前記変数格納領域のアドレスを特定する情報を格納する、
ことを特徴とするコンパイラ。
【請求項３】
請求項１において、
前記確保では、前記第１変数のデータ型が固定長の文字列型である場合、前記変数格納領域に対応付けて、前記第１変数の有効データ長を格納する第２情報格納領域を確保し、
前記第２情報格納領域に格納された前記有効データ長は、前記第１オブジェクトの実行の際の前記第１変数の更新に応じて更新され、かつ、前記変数格納領域に格納された前記第１変数とともに外部プログラムにより取得される、
ことを特徴とするコンパイラ。
【請求項４】
請求項３において、
前記第１オブジェクトは、前記第１変数を引数として、前記第１ソースコードが記述された言語とは異なる言語で記述された第２ソースコードから生成された第２オブジェクトを実行させる際に、前記第１変数の変換を行うランタイムライブラリに前記第１変数を引き渡し、
前記ランタイムライブラリは、前記第１変数の前記データ型を参照して、前記第１オブジェクトから引き渡された前記第１変数を、前記第２オブジェクトが認識できる形式に変換し、変換した前記第１変数を前記第２オブジェクトに引き渡す、
ことを特徴とするコンパイラ。
【請求項５】
請求項４において、
前記ランタイムライブラリは、前記第１変数の前記有効データ長を参照し、前記第１変数のうちの前記有効データ長に対応するデータのみを、前記第２オブジェクトが認識できる形式に変換する、
ことを特徴とするコンパイラ。
【請求項６】
第１ソースコードに含まれる第１変数を格納する変数格納領域に対応付けて、前記第１変数のデータ型を格納する第１情報格納領域を確保する領域確保部を有し、
前記第１情報格納領域に格納された前記データ型は、前記第１ソースコードから生成された第１オブジェクトの実行の際の前記第１変数の更新に応じて更新され、かつ、前記変数格納領域に格納された前記第１変数とともに外部プログラムにより取得可能である、
ことを特徴とするコンパイル装置。
【請求項７】
第１ソースコードに含まれる第１変数を格納する変数格納領域に対応付けて、前記第１変数のデータ型を格納する第１情報格納領域を確保し、
前記第１情報格納領域に格納された前記データ型は、前記第１ソースコードから生成された第１オブジェクトの実行の際の前記第１変数の更新に応じて更新され、かつ、前記変数格納領域に格納された前記第１変数とともに外部プログラムにより取得可能である、
ことを特徴とするコンパイル方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンパイラ、コンパイル装置及びコンパイル方法に関する。
【背景技術】
【０００２】
ＣＯＢＯＬ（ＣＯｍｍｏｎ  Ｂｕｓｉｎｅｓｓ  Ｏｒｉｅｎｔｅｄ  Ｌａｎｇｕａｇｅ）には、ＪＡＶＡ（登録商標）等の他の言語と同様に、複数のデータ型が用意されている。データ型とは、プログラミング言語が取り扱うデータをいくつかの種類に分類するものであり、例えば、メモリ上に展開した場合のデータサイズや符号化形式等が規定されたものである。具体的に、データ型には、例えば、整数型、浮動小数点型または文字列型等が存在する。
【０００３】
そして、ＣＯＢＯＬのデータ型は、ＪＡＶＡ等のデータ型と異なり、各データ型に格納できる値の制約が厳密に定められていない。そのため、例えば、ＣＯＢＯＬにおいて英数字項目（英数字からなる値）を格納するデータ型である英数字項目型（以下、Ｘ項目とも呼ぶ）は、英数字項目のみならず、バイナリデータ等を格納することが可能である（例えば、特許文献１及び２参照）。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２０１０−８６２１８号公報
【特許文献２】特開２００２−３４２０７８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
ＣＯＢＯＬによるオブジェクトコード（以下、ＣＯＢＯＬコードとも呼ぶ）が実行される場合、ＣＯＢＯＬコードは、他の言語（例えば、ＪＡＶＡ等）によるオブジェクトコード（以下、ＪＡＶＡによるオブジェクトコードをＪＡＶＡコードとも呼ぶ）に含まれる関数を呼び出す場合がある。これにより、ＣＯＢＯＬコードを実行するコンピュータは、ＪＡＶＡコード等の他言語のコードにより提供されている機能を利用することが可能になる。
【０００６】
ここで、ＣＯＢＯＬコードは、ＪＡＶＡコードに含まれる関数等を呼び出す場合、各データ項目（以下、変数とも呼ぶ）の値が、各データ項目の宣言時のデータ型に対応する値であるものとして、データ項目の値をＪＡＶＡコードに引き渡す。
【０００７】
しかしながら、ＣＯＢＯＬのデータ型は、上記のように、各データ型に格納できる値の制約が厳密に定められていない。そのため、ＣＯＢＯＬコードに含まれる各データ項目には、各データ項目の宣言時におけるデータ型と異なるデータ型に対応する値が格納されている場合がある。したがって、ＪＡＶＡコードは、この場合、各データ項目に格納されている値の現在のデータ型（以下、実データ型とも呼ぶ）に基づく処理を行うことができない。
【０００８】
そこで、一つの側面では、データ項目の実データ型に基づく処理の実行を可能にするコンパイルを行うことを目的とする。
【課題を解決するための手段】
【０００９】
実施の形態の一つの態様によれば、コンピュータに、第１ソースコードに含まれる第１変数を格納する変数格納領域に対応付けて、前記第１変数のデータ型を格納する第１情報格納領域を確保する、処理を実行させ、前記第１情報格納領域に格納された前記データ型は、前記第１ソースコードから生成された第１オブジェクトの実行の際の前記第１変数の更新に応じて更新され、かつ、前記変数格納領域に格納された前記第１変数とともに外部プログラムにより取得可能である。
【発明の効果】
【００１０】
一つの側面によれば、データ項目の実データ型に基づく処理の実行を可能にするコンパイルを行う。
【図面の簡単な説明】
【００１１】
【図１】情報処理システム１０の全体構成を示す図である。
【図２】ＣＯＢＯＬによるソースコードの具体例である。
【図３】図２に示すソースコードがコンパイルされた場合を説明する図である。
【図４】図２に示すソースコードにおける「ＭＯＶＥ  “ＡＢＣＤ”  ＴＯ  Ｐ１．」に対応する処理が実行された後の状態を説明する図である。
【図５】図２に示すソースコードにおける「ＣＡＬＬ  “ＦＵＮＣ”  ＵＳＩＮＧ  Ｐ１  ＲＥＴＵＲＮＩＮＧ  Ｒ１．」に対応する処理が実行された場合を説明する図である。
【図６】図２に示すソースコードにおける「ＣＡＬＬ  “ＦＵＮＣ”  ＵＳＩＮＧ  Ｐ１  ＲＥＴＵＲＮＩＮＧ  Ｒ１．」に対応する処理が実行された場合を説明する図である。
【図７】図２に示すソースコードにおける「ＣＡＬＬ  “ＦＵＮＣ”  ＵＳＩＮＧ  Ｐ１  ＲＥＴＵＲＮＩＮＧ  Ｒ１．」に対応する処理が実行された場合を説明する図である。
【図８】図２に示すソースコードにおける「ＣＡＬＬ  “ＦＵＮＣ”  ＵＳＩＮＧ  Ｐ１  ＲＥＴＵＲＮＩＮＧ  Ｒ１．」に対応する処理が実行された場合を説明する図である。
【図９】ＣＯＢＯＬによるソースコードの具体例である。
【図１０】図９に示すソースコードにおける「ＣＡＬＬ  “ＦＵＮＣ”  ＵＳＩＮＧ  Ｐ１．」のそれぞれに対応する処理が実行された場合を説明する図である。
【図１１】図９に示すソースコードにおける「ＣＡＬＬ  “ＦＵＮＣ”  ＵＳＩＮＧ  Ｐ１．」のそれぞれに対応する処理が実行された場合を説明する図である。
【図１２】情報処理装置１のハードウエア構成を説明する図である。
【図１３】図１２の情報処理装置１の機能ブロック図である。
【図１４】第１の実施の形態におけるコンパイル処理の概略を説明するフローチャート図である。
【図１５】第１の実施の形態におけるコンパイル処理の詳細を説明するフローチャート図である。
【図１６】第１の実施の形態におけるオブジェクト実行処理を説明するフローチャート図である。
【図１７】第１の実施の形態におけるオブジェクト実行処理を説明するフローチャート図である。
【図１８】第１の実施の形態におけるオブジェクト実行処理を説明するフローチャート図である。
【図１９】ＣＯＢＯＬによるソースコードの具体例である。
【図２０】図１９に示すソースコードがコンパイルされた場合を説明する図である。
【図２１】図１９に示すソースコードがコンパイルされた場合を説明する図である。
【図２２】図１９に示すソースコードにおける「ＭＯＶＥ  “ＡＢＣＤ”  ＴＯ  Ｐ１．」に対応する処理が実行された場合を説明する図である。
【図２３】図１９に示すソースコードにおける「ＭＯＶＥ  “ＥＦＧ”  ＴＯ  Ｐ１．」に対応する処理が実行された場合を説明する図である。
【図２４】図１９に示すソースコードにおける「ＣＡＬＬ  “ＦＵＮＣ”  ＵＳＩＮＧ  Ｐ１  ＲＥＴＵＲＮＩＮＧ  Ｒ１．」に対応する処理が実行された場合を説明する図である。
【図２５】図１９に示すソースコードにおける「ＣＡＬＬ  “ＦＵＮＣ”  ＵＳＩＮＧ  Ｐ１  ＲＥＴＵＲＮＩＮＧ  Ｒ１．」に対応する処理が実行された場合を説明する図である。
【図２６】図１９に示すソースコードにおける「ＣＡＬＬ  “ＦＵＮＣ”  ＵＳＩＮＧ  Ｐ１  ＲＥＴＵＲＮＩＮＧ  Ｒ１．」に対応する処理が実行された場合を説明する図である。
【図２７】図１９に示すソースコードにおける「ＣＡＬＬ  “ＦＵＮＣ”  ＵＳＩＮＧ  Ｐ１  ＲＥＴＵＲＮＩＮＧ  Ｒ１．」に対応する処理が実行された場合を説明する図である。
【発明を実施するための形態】
【００１２】
［情報処理システムの構成］
図１は、情報処理システム１０の全体構成を示す図である。図１に示す情報処理システム１０は、情報処理装置１（以下、コンパイル装置１またはコンピュータ１とも呼ぶ）と、記憶装置２と、管理者端末１１とを有する。
【００１３】
情報処理装置１は、システム管理者（以下、単に管理者とも呼ぶ）がソースコード２ａのコンパイルの指示を入力した場合に、記憶装置２に記憶されたソースコード２ａをコンパイルしてオブジェクトコード２ｂを生成する。そして、情報処理装置１は、例えば、生成したオブジェクトコード２ｂを記憶装置２に記憶する。その後、情報処理装置１は、例えば、管理者がオブジェクトコード２ｂを実行するための指示を入力した場合に、記憶装置２に記憶されたオブジェクトコード２ｂの実行を行う。
【００１４】
なお、管理者は、例えば、管理者端末１１により情報処理装置１に対する指示を行うものであってよい。また、情報処理装置１は、例えば、予め設定されたタイミングになった際に、ソースコード２ａのコンパイルやオブジェクトコード２ｂの実行を自発的に行うものであってもよい。
【００１５】
［ＣＯＢＯＬによるソースコード］
次に、ＣＯＢＯＬによって記述されたソースコードについて説明を行う。図２は、ＣＯＢＯＬによるソースコードの具体例である。
【００１６】
図２に示すソースコードにおいて、「０１  Ｐ１  ＰＩＣ  Ｘ（４）．」は、ＣＯＢＯＬコードの実行時に、データ型が英数字項目型であって、データ長（以下、領域データ長とも呼ぶ）が４（バイト）（英数字４文字）であるデータ項目「Ｐ１」を定義することを示す記述である。また、図２に示すソースコードにおいて、「０１  Ｒ１  ＰＩＣ  Ｓ９（９）  ＣＯＭＰ−５．」は、ＣＯＢＯＬコードの実行時に、データ型が符号ありの数値項目型（数値からなる値が格納されるデータ型）であって、「−９９９９９９９９９」から「９９９９９９９９９」までの４（バイト）の符号あり整数（９桁）であるデータ項目「Ｒ１」を定義することを示す記述である。なお、「ＣＯＭＰ−５」は、データ項目「Ｒ１」に格納された値を２進数のデータとして処理を行うことを示す記述である。
【００１７】
さらに、図２に示すソースコードにおいて、「ＭＯＶＥ  “ＡＢＣＤ”  ＴＯ  Ｐ１．」は、ＣＯＢＯＬコードの実行時に、データ項目「Ｐ１」に「ＡＢＣＤ」を格納する関数を示す記述である。また、図２に示すソースコードにおいて、「ＣＡＬＬ  “ＦＵＮＣ”  ＵＳＩＮＧ  Ｐ１  ＲＥＴＵＲＮＩＮＧ  Ｒ１．」は、データ項目「Ｐ１」の値（「ＡＢＣＤ」）を引数として関数「ＦＵＮＣ」を呼出し、その戻り値をデータ項目「Ｒ１」に格納する関数を示す記述である。なお、以下、関数「ＦＵＮＣ」は、ＣＯＢＯＬ以外の言語（以下、非ＣＯＢＯＬとも呼ぶ）によるオブジェクトコード（以下、非ＣＯＢＯＬコードとも呼ぶ）に含まれる関数であるものとして説明を行う。
【００１８】
［ＣＯＢＯＬによるソースコードのコンパイル］
次に、図２に示すソースコードのコンパイルについて説明を行う。図３は、図２に示すソースコードがコンパイルされた場合を説明する図である。具体的に、図３（Ａ）は、図２に示すソースコードから生成されるＣＯＢＯＬコードに含まれる情報を説明する図である。また、図３（Ｂ）は、図２に示すソースコードがコンパイルされた場合における情報処理装置１のメモリの状態を説明する図である。
【００１９】
図２に示すソースコードのコンパイルを行う場合、情報処理装置１（コンパイル装置１）は、「０１  Ｐ１  ＰＩＣ  Ｘ（４）．」を参照し、データ項目「Ｐ１」の値を格納可能な領域（以下、データ項目「Ｐ１」の領域とも呼ぶ）として、４（バイト）の領域を確保する。具体的に、情報処理装置１は、例えば、図３（Ｂ）に示すように、情報処理装置１のメモリのうちのアドレスが「２０００」である領域から「２００３」である領域までを、データ項目「Ｐ１」の領域として確保する。そして、情報処理装置１は、例えば、図３（Ｂ）に示すように、情報処理装置１のメモリのうちのアドレスが「１０００」である領域に、データ項目「Ｐ１」の領域の先頭アドレスである「２０００」を示す情報を格納する。さらに、情報処理装置１は、例えば、図３（Ａ）に示すように、データ項目「Ｐ１」の領域の先頭アドレスが格納された領域のアドレスが「１０００」である旨の情報が含まれるように、図２に示すソースコードをコンパイルしてＣＯＢＯＬコードを作成する。
【００２０】
これにより、図２に示すソースコードから生成されたＣＯＢＯＬコードは、その実行中において、データ項目「Ｐ１」の領域の先頭アドレスが格納された領域のアドレスに基づき、データ項目「Ｐ１」に格納されている値を取得することが可能になる。なお、情報処理装置１が「０１  Ｒ１  ＰＩＣ  Ｓ９（９）  ＣＯＭＰ−５．」を参照して行う処理については、図３で説明した場合と同様であるため説明を省略する。
【００２１】
［ＣＯＢＯＬコードの実行］
続いて、図２に示すソースコードから生成されたＣＯＢＯＬコードが実行された場合における情報処理装置１のメモリの状態について説明を行う。図４は、図２に示すソースコードにおける「ＭＯＶＥ  “ＡＢＣＤ”  ＴＯ  Ｐ１．」に対応する処理が実行された場合を説明する図である。また、図５から図８は、図２に示すソースコードにおける「ＣＡＬＬ  “ＦＵＮＣ”  ＵＳＩＮＧ  Ｐ１  ＲＥＴＵＲＮＩＮＧ  Ｒ１．」に対応する処理が実行された場合を説明する図である。
【００２２】
図２に示すソースコードにおける「ＭＯＶＥ  “ＡＢＣＤ”  ＴＯ  Ｐ１．」に対応する処理を実行する場合、ＣＯＢＯＬコード（ＣＯＢＯＬコードと協働して動作する情報処理装置１のＣＰＵ）は、図４に示すように、データ項目「Ｐ１」の領域に「ＡＢＣＤ」を示す値を格納する。これにより、ＣＯＢＯＬコードは、データ項目「Ｐ１」の値を情報処理装置１のメモリにおいて保持することが可能になる。
【００２３】
なお、図４に示す例において、データ項目「Ｐ１」の領域に格納された値（「ＡＢＣＤ」）の文字コードは、ＡＳＣＩＩ（Ａｍｅｒｉｃａｎ  Ｓｔａｎｄａｒｄ  Ｃｏｄｅ  ｆｏｒ  Ｉｎｆｏｒｍａｔｉｏｎ  Ｉｎｔｅｓｃｈａｎｇｅ）である。また、図４に示す例において、アドレスが「２００４」である領域には、アドレスが「２０００」から「２００３」である領域に格納された値（「ＡＢＣＤ」）の終端を示す「￥０（ＮＵＬＬ）」が格納されている。
【００２４】
次に、図２に示すソースコードにおける「ＣＡＬＬ  “ＦＵＮＣ”  ＵＳＩＮＧ  Ｐ１  ＲＥＴＵＲＮＩＮＧ  Ｒ１．」に対応する処理を実行する場合、ＣＯＢＯＬコードは、関数「ＦＵＮＣ」の実行を非ＣＯＢＯＬオブジェクトに要求（指示）する。
【００２５】
この場合、ＣＯＢＯＬコードは、例えば、データ項目「Ｐ１」の値を、非ＣＯＢＯＬコードが認識できる形式に変換する。そして、ＣＯＢＯＬコードは、変換した値を引数として、関数「ＦＵＮＣ」の実行を非ＣＯＢＯＬコードに要求する。以下、ＣＯＢＯＬコードが関数「ＦＵＮＣ」の実行を非ＣＯＢＯＬコードに要求する場合について説明を行う。
【００２６】
図５は、ＣＯＢＯＬコードが関数「ＦＵＮＣ」の実行を非ＣＯＢＯＬコードに要求する場合を説明する図である。ＣＯＢＯＬコードは、図５に示すように、記憶装置２等に記憶されたプログラムであるランタイムライブラリを実行することにより、データ項目「Ｐ１」に格納されている値を、非ＣＯＢＯＬコードが認識できる形式に変換する。なお、以下、非ＣＯＢＯＬコードがＪＡＶＡコードであるものとして説明を行う。
【００２７】
ランタイムライブラリは、ＣＯＢＯＬコードと非ＣＯＢＯＬコードとの間で情報（引数や戻り値）の変換を行うためのプログラムである。図５に示す例において、ランタイムライブラリは、ＣＯＢＯＬコードに含まれる関数毎に存在する。そのため、図５に示す例において、ＣＯＢＯＬコードは、非ＣＯＢＯＬコードに含まれる関数「ＦＵＮＣ」を呼び出す場合、関数「ＦＵＮＣ」に対応するランタイムライブラリに対してデータ項目「Ｐ１」の値を引き渡す。
【００２８】
そして、ランタイムライブラリ（ランタイムライブラリと協働して動作する情報処理装置１のＣＰＵ）は、データ項目「Ｐ１」の値を受け取った場合、例えば、図５に示すように、受け取ったデータ項目「Ｐ１」の値を、ＪＡＶＡのデータ型であるＳｔｒｉｎｇ型に変換する（図５の（１））。すなわち、ランタイムライブラリは、データ項目「Ｐ１」の値をＳｔｒｉｎｇ型に変換することにより、データ項目「Ｐ１」の値を非ＣＯＢＯＬコード（ＪＡＶＡコード）が認識可能な形式にする。続いて、ランタイムライブラリは、Ｓｔｒｉｎｇ型に変換した値を引数として、関数「ＦＵＮＣ」の呼出しを行う（図５の（２））。
【００２９】
その後、ランタイムライブラリは、非ＣＯＢＯＬコードから関数「ＦＵＮＣ」の実行結果（例えば、関数「ＦＵＮＣ」によって変更された引数の値と戻り値）を受け取るまで待機する。なお、関数「ＦＵＮＣ」の戻り値は、例えば、関数「ＦＵＮＣ」の実行が正常に完了したか否かを示す値として用いられる。また、図５に示す例において、関数「ＦＵＮＣ」がランタイムライブラリに引き渡す戻り値のデータ型は、ＪＡＶＡの数値型であるｉｎｔ型である。
【００３０】
そして、関数「ＦＵＮＣ」の実行結果を受け取った場合、ランタイムライブラリは、例えば、図５に示すように、関数「ＦＵＮＣ」によって変更された引数の値を英数字項目型に変換し、データ項目「Ｐ１」の領域に格納する（図５の（３））。また、ランタイムライブラリは、この場合、戻り値を数値項目型に変換し、データ項目「Ｒ１」の領域に格納する（図５の（４））。
【００３１】
［ＣＯＢＯＬコードの実行時におけるメモリの状態］
次に、図５で説明した処理を実行する場合におけるメモリの状態の推移について説明を行う。図６から図８は、図５で説明した処理を実行する場合におけるメモリの状態の推移を説明する図である。
【００３２】
図６に示すように、データ項目「Ｐ１」の値を非ＣＯＢＯＬコードが認識できる形式に変換した場合（図５の（１））、ランタイムライブラリは、変換した値を情報処理装置１のメモリに格納する。
【００３３】
具体的に、ランタイムライブラリは、図６に示す例において、データ項目「Ｐ１」の値である「ＡＢＣＤ」の文字コードをＡＳＣＩＩからＵｎｉｃｏｄｅに変換する。そして、ランタイムライブラリは、図６に示すように、Ｕｎｉｃｏｄｅに変換した値を、情報処理装置１のメモリのうちの先頭アドレスが「２５００」である領域に格納を行う。なお、ランタイムライブラリが変換した値を格納する領域（先頭アドレスが「２５００」である領域）は、図３において説明した場合と同様に、ＣＯＢＯＬソースコードをコンパイルする際に確保されるものであってよい。
【００３４】
次に、非ＣＯＢＯＬコード（非ＣＯＢＯＬコードと協働して動作する情報処理装置１のＣＰＵ）は、図６に示す例において、先頭アドレスが「２５００」である領域を参照し、関数「ＦＵＮＣ」の処理を実行するための引数を取得する（図５の（２））。そして、非ＣＯＢＯＬコードは、例えば、図５に示すように、取得した引数の値を変数「Ａ１」に格納し、格納した変数「Ａ１」の値に基づいて関数「ＦＵＮＣ」を実行する。
【００３５】
その後、非ＣＯＢＯＬコードは、図７に示すように、関数「ＦＵＮＣ」によって変更された引数（「ＥＦＧＨ」）を、情報処理装置１のメモリのうちの先頭アドレスが「２５００」である領域に格納する。
【００３６】
そして、ランタイムライブラリは、この場合、図８に示すように、非ＣＯＢＯＬコードが格納した引数の値を、ＣＯＢＯＬコードが認識できるデータ型である英数字項目型に変換する。さらに、ランタイムライブラリは、変換した引数の値を、先頭アドレスが「２０００」である領域（データ項目「Ｐ１」の領域）に格納する。
【００３７】
具体的に、ランタイムライブラリは、関数「ＦＵＮＣ」によって変更された引数の値である「ＥＦＧＨ」の文字コードを、ＵｎｉｃｏｄｅからＡＳＣＩＩに変換する。そして、ランタイムライブラリは、図８に示すように、ＡＳＣＩＩに変換した値を、情報処理装置１のメモリのうちの先頭アドレスが「２０００」である領域に格納を行う。
【００３８】
なお、関数「ＦＵＮＣ」の戻り値を情報処理装置１のメモリに格納する場合の具体例については、関数「ＦＵＮＣ」によって変更された引数の値を情報処理装置１のメモリに格納する場合の具体例と同様であるため説明を省略する。
【００３９】
ここで、ランタイムライブラリは、ＣＯＢＯＬコードが関数「ＦＵＮＣ」の呼出しを行う場合に、データ項目「Ｐ１」の宣言時におけるデータ型に基づいてデータ項目「Ｐ１」の値の変換を行う。一方、ＣＯＢＯＬコードの各データ項目には、各データ項目における宣言時のデータ型と異なるデータ型の値が格納されている場合がある。以下、データ項目に宣言時のデータ型と異なるデータ型の値が格納されている場合について説明を行う。
【００４０】
図９は、ＣＯＢＯＬによるソースコードの具体例である。また、図１０及び図１１は、図９に示すソースコードにおける「ＣＡＬＬ  “ＦＵＮＣ”  ＵＳＩＮＧ  Ｐ１．」のそれぞれに対応する処理が実行された場合を説明する図である。
【００４１】
図９に示すソースコードにおいて、「０１  Ｐ１  ＰＩＣ  Ｘ（４）  ＶＡＬＵＥ  “ＡＢＣＤ”．」は、ＣＯＢＯＬコードの実行時に、データ型が英数字項目型であって、領域データ長が４（バイト）（英数字４文字）であるデータ項目「Ｐ１」を定義することを示す記述である。そして、この記述は、初期値としてデータ項目「Ｐ１」に「ＡＢＣＤ」が格納されることを示している。また、図９に示すソースコードにおいて、「０１  Ｐ１  ＰＩＣ  Ｓ９（９）  ＶＡＬＵＥ  １０．」は、ＣＯＢＯＬコードの実行時に、データ型が符号ありの数値項目型であって、「−９９９９９９９９９」から「９９９９９９９９９」までの４（バイト）の符号ありの整数（９桁）であるデータ項目「Ｐ２」を定義することを示す記述である。そして、この記述は、初期値としてデータ項目「Ｐ２」に「１０」が格納されることを示している。
【００４２】
さらに、図９に示すソースコードにおいて、１つ目の「ＣＡＬＬ  “ＦＵＮＣ”  ＵＳＩＮＧ  Ｐ１．」は、データ項目「Ｐ１」の値（「ＡＢＣＤ」）を引数として、関数「ＦＵＮＣ」の呼出しを行う関数を示す記述である。そして、図９に示すソースコードにおいて、「ＭＯＶＥ  Ｐ２  ＴＯ  Ｐ１．」は、ＣＯＢＯＬコードの実行時に、データ項目「Ｐ１」にデータ項目「Ｐ２」の値（「１０」）を格納する関数を示す記述である。また、図９に示すソースコードにおいて、２つ目の「ＣＡＬＬ  “ＦＵＮＣ”  ＵＳＩＮＧ  Ｐ１．」は、データ項目「Ｐ１」の値（「１０」）を引数として、関数「ＦＵＮＣ」の呼出しを行う関数を示す記述である。
【００４３】
次に、図１０及び図１１を参照し、図９に示すソースコードにおける「ＣＡＬＬ  “ＦＵＮＣ”  ＵＳＩＮＧ  Ｐ１．」のそれぞれに対応する処理が実行された場合について説明を行う。
【００４４】
図１０に示すように、ランタイムライブラリは、データ項目「Ｐ１」の宣言時のデータ型（英数字項目型）に基づき、データ項目「Ｐ１」に設定された値の変換を行う。すなわち、ランタイムライブラリは、この場合、データ項目「Ｐ１」に現在格納されている値の実データ型を参照することなく、データ項目「Ｐ１」の値の変換を行う。そのため、ランタイムライブラリは、「ＣＡＬＬ  “ＦＵＮＣ”  ＵＳＩＮＧ  Ｐ１．」に対応する処理を実行する際に、データ項目「Ｐ１」の宣言時のデータ型（英数字項目型）に対応する関数「ＦＵＮＣ（Ｓｔｒｉｎｇ  Ａ１）」を常に呼び出すことになる。したがって、図１０に示すように、例えば、非ＣＯＢＯＬコードが関数「ＦＵＮＣ（ｉｎｔ  Ａ１）」を含んでいる場合であっても、ランタイムライブラリは、関数「ＦＵＮＣ（Ｓｔｒｉｎｇ  Ａ１）」以外の関数の呼出しを行わない。すなわち、情報処理装置１は、この場合、各データ項目に格納できる値の制約が厳密でないというＣＯＢＯＬの特性を利用することができない。
【００４５】
これに対し、ＣＯＢＯＬによるソースコードの開発者（以下、単に開発者とも呼ぶ）は、図１１に示すように、同一の関数であっても、実行時におけるデータ項目「Ｐ１」の値のデータ型毎に、それぞれ異なる変換関数を用意する場合がある。
【００４６】
この場合、開発者は、図１１に示すように、図９に示すソースコードに含まれる記述のうち、１つ目の「ＣＡＬＬ  “ＦＵＮＣ”  ＵＳＩＮＧ  Ｐ１．」を「ＣＡＬＬ  “ＦＵＮＣ１”  ＵＳＩＮＧ  Ｐ１．」に変更する。また、開発者は、図１１に示すように、図９に示すソースコードに含まれる記述のうち、２つ目の「ＣＡＬＬ  “ＦＵＮＣ”  ＵＳＩＮＧ  Ｐ１．」を「ＣＡＬＬ  “ＦＵＮＣ２”  ＵＳＩＮＧ  Ｐ１．」に変更する。
【００４７】
さらに、開発者は、「ＣＡＬＬ  “ＦＵＮＣ１”  ＵＳＩＮＧ  Ｐ１．」に対応するランタイムライブラリとして、関数「ＦＵＮＣ（Ｓｔｒｉｎｇ  Ａ１）」を呼び出すランタイム関数（Ａ）（文字型データ変換関数）を用意する。また、開発者は、「ＣＡＬＬ  “ＦＵＮＣ２”  ＵＳＩＮＧ  Ｐ１．」に対応するランタイムライブラリとして、「ＦＵＮＣ（ｉｎｔ  Ａ１）」を呼び出すランタイム関数（Ｂ）（数値項目データ変換関数）を用意する。
【００４８】
そして、開発者は、「ＣＡＬＬ  “ＦＵＮＣ１”  ＵＳＩＮＧ  Ｐ１．」から引き渡されたデータ項目「Ｐ１」の値をランタイムライブラリ（Ａ）が変換するように設定を行う。また、開発者は、「ＣＡＬＬ  “ＦＵＮＣ２”  ＵＳＩＮＧ  Ｐ１．」から引き渡されたデータ項目「Ｐ１」値をランタイムライブラリ（Ｂ）に変換させるように設定を行う。これにより、ＣＯＢＯＬコードは、ＣＯＢＯＬコードに含まれる各関数が実行される際に、データ項目「Ｐ１」の値の実データ型に基づいて非ＣＯＢＯＬに含まれる関数を呼び出すことが可能になる。
【００４９】
しかしながら、図１１に示す例の場合、非ＣＯＢＯＬコード（非ＣＯＢＯＬによるソースコード）の変更が行わる毎に、変更部分に対応するランタイムライブラリ及びＣＯＢＯＬコード（ＣＯＢＯＬによるソースコード）の変更を行う必要がある。そのため、この場合、非ＣＯＢＯＬコードの変更に伴う開発者の負担が増大する。
【００５０】
そこで、本実施の形態における情報処理装置１は、ＣＯＢＯＬによるソースコード（以下、第１ソースコードとも呼ぶ）のコンパイル時において、第１ソースコードに含まれるデータ項目（以下、第１変数とも呼ぶ）のデータ型の情報を格納する領域を確保する。そして、情報処理装置１は、第１ソースコードから生成されるＣＯＢＯＬコード（以下、第１オブジェクトとも呼ぶ）の実行時において、第１変数の値の更新が行われた場合、更新された第１変数の値とともに、更新された第１変数のデータ型（実データ型）の情報を格納する。すなわち、情報処理装置１は、第１ソースコードのコンパイルを行う際に、第１変数の値だけでなく、第１変数のデータ型の情報が格納するための領域の確保を行う。
【００５１】
これにより、情報処理装置１は、第１オブジェクトが、非ＣＯＢＯＬによるソースコード（以下、第２ソースコードとも呼ぶ）から生成された非ＣＯＢＯＬコード（以下、第２オブジェクトとも呼ぶ）に含まれる関数を呼び出す際に、第１変数の実データ型の情報を取得することが可能になる。そのため、情報処理装置１は、取得した第１変数の実データ型の情報に基づき、第２オブジェクトに含まれる関数を実行する際の引数である第１変数を、第２オブジェクトが認識可能な形式に変換することが可能になる。すなわち、開発者は、第１オブジェクトから引き渡される第１変数の値を第２オブジェクトが認識できる形式に変換するために、第１変数の値のデータ型にそれぞれ対応する複数のランタイムライブラリを用意する必要がなくなる。
【００５２】
また、情報処理装置１は、第１変数の値と第１変数のデータ型の情報とを格納するための領域を、例えば、情報処理装置１のメモリに確保する。これにより、外部プログラム（ランタイムプログラムや第２オブジェクト）は、情報処理装置１のメモリを参照することにより、第１変数の値及び第１変数のデータ型の情報を取得することが可能になる。
【００５３】
［情報処理装置のハードウエア構成］
次に、情報処理装置１のハードウエア構成を説明する。図１２は、情報処理装置１のハードウエア構成を説明する図である。
【００５４】
情報処理装置１は、プロセッサであるＣＰＵ１０１と、メモリ１０２と、外部インターフェース（Ｉ／Ｏユニット）１０３と、記憶媒体（ストレージ）１０４とを有する。各部は、バス１０５を介して互いに接続される。
【００５５】
記憶媒体１０４は、記憶媒体１０４内のプログラム格納領域１３０（以下、記憶部１３０またはＰＧ格納領域１３０とも呼ぶ）に、例えば、ＣＯＢＯＬによるソースコードのコンパイルを行う処理（以下、コンパイル処理とも呼ぶ）を行うためのプログラム１１０（以下、コンパイラ１１０とも呼ぶ）を記憶する。
【００５６】
また、プログラム格納領域１３０には、例えば、上記の第１ソースコード、第２ソースコード、第１オブジェクト及び第２オブジェクトが記憶される。なお、図１等で説明した記憶装置２は、例えば、プログラム格納領域１３０に対応するものであってよい。
【００５７】
ＣＰＵ１０１は、図１２に示すように、プログラム１１０の実行時に、プログラム１１０を記憶媒体１０４からメモリ１０２にロードし、プログラム１１０と協働してコンパイル処理を行う。
【００５８】
また、外部インターフェース１０３は、ネットワークＮＷを介して、管理者端末１１と通信を行う。
【００５９】
[情報処理装置のソフトウエア構成]
次に、情報処理装置１のソフトウエア構成を説明する。図１３は、図１２の情報処理装置１の機能ブロック図である。ＣＰＵ１０１は、プログラム１１０と協働することにより、コンパイル実行部１１１（以下、領域確保部１１１とも呼ぶ）と、オブジェクト実行部１１２として動作する。また、ＣＰＵ１０１は、プログラム１１０と協働することにより、パラメタ変換部１１３（以下、ランタイムライブラリ１１３とも呼ぶ）として動作する。
【００６０】
コンパイル実行部１１１は、例えば、プログラム格納領域１３０に記憶された第１ソースコード及び第２ソースコードに対してコンパイル処理を行い、それぞれ第１オブジェクト及び第２オブジェクトを生成する。具体的に、コンパイル実行部１１１は、管理者が管理者端末１１を介してコンパイル処理を実行する旨の入力を行った際に、第１ソースコードまたは第２ソースコードに対するコンパイル処理を実行するものであってよい。そして、コンパイル実行部１１１は、例えば、生成した第１オブジェクト及び第２オブジェクトをプログラム格納領域１３０に記憶する。
【００６１】
また、コンパイル実行部１１１は、コンパイル処理を実行する際に、第１ソースコードに含まれる第１変数を格納する変数格納領域１０２ａをメモリ１０２内に確保する。また、コンパイル実行部１１１は、コンパイル処理を実行する際に、変数格納領域１０２ａと対応付けて、第１変数の実データ型を格納する情報格納領域１０２ｂ（以下、第１情報格納領域１０２ｂとも呼ぶ）を情報処理装置１のメモリ１０２内に確保する。さらに、コンパイル実行部１１１は、コンパイル処理を実行する際に、変数格納領域１０２ａと対応付けて、第２変数のデータ型を格納する情報格納領域１０２ｃ（以下、第２情報格納領域１０２ｃとも呼ぶ）を情報処理装置１のメモリ１０２内に確保する。なお、変数格納領域１０２ａ、第１情報格納領域１０２ｂ及び第２情報格納領域１０２ｃの具体例については後述する。
【００６２】
第１変数のデータ型とは、第１変数の値に対応するデータ型（例えば、英数字項目型）である。なお、第１変数に値が格納されていない場合、第１変数のデータは、第１変数の宣言時におけるデータ型である。また、第１変数の有効データ長とは、第１変数の領域データ長のうち、空白以外の情報が格納されているデータ長である。第１変数のデータ型及び第１変数の有効データ長は、第１オブジェクトの実行の際の第１変数の更新に応じて更新される。また、第１変数のデータ型及び第１変数の有効データ長は、第１変数の値とともに、外部プログラム（例えば、第２オブジェクトや後述するパラメタ変換部１１３）によって取得される。変数格納領域１０２ａ、第１情報格納領域１０２ｂ及び第２情報格納領域１０２ｃの具体例については後述する。
【００６３】
オブジェクト実行部１１２は、プログラム格納領域１３０に記憶された第１オブジェクト及び第２オブジェクトを実行する。具体的に、オブジェクト実行部１１２は、例えば、管理者が管理者端末１１を介して第１オブジェクトまたは第２オブジェクトを実行する旨の入力を行った際に、第１オブジェクトまたは第２オブジェクトを実行するものであってよい。なお、以下、オブジェクト実行部１１２が第１オブジェクト及び第２オブジェクトを実行する処理を、オブジェクト実行処理とも呼ぶ。
【００６４】
パラメタ変換部１１３は、第１オブジェクトが第２オブジェクト（第２オブジェクトに含まれる関数）の実行を要求した場合に、第１変数のデータ型の情報を参照し、第１変数を第２オブジェクトが認識できる形式に変換する。具体的に、パラメタ変換部１１３は、例えば、第１変数の値をＡＳＣＩＩからＵｎｉｃｏｄｅに変換することにより、第１変数を第２オブジェクトが認識できる形式に変換する。
【００６５】
また、パラメタ変換部１１３は、第１オブジェクトが第２オブジェクトに対して実行を要求した処理の実行結果（変更された引数や戻り値）を、第１オブジェクトが認識できる形式に変換する。
【００６６】
[第１の実施の形態］
次に、第１の実施の形態の概略を説明する。図１４は、第１の実施の形態におけるコンパイル処理の概略を説明するフローチャート図である。
【００６７】
情報処理装置１のコンパイル実行部１１１は、コンパイル処理が開始された場合、第１ソースコードに含まれる第１変数を格納する変数格納領域１０２ａを確保する（Ｓ２）。そして、コンパイル実行部１１１は、Ｓ２で確保した変数格納領域１０２ａに対応付けて、第１変数のデータ型を格納する第１情報格納領域１０２ｂを確保する（Ｓ３）。具体的に、コンパイル実行部１１１は、外部プログラムから参照可能な領域（例えば、情報処理装置１のメモリ１０２内）において変数格納領域１０２ａ及び第１情報格納領域１０２ｂの確保を行う。その後、コンパイル実行部１１１は、第１ソースコードから第１オブジェクトを生成する（Ｓ４）。
【００６８】
これにより、情報処理装置１のオブジェクト実行部１１２は、後述するように、第１変数の値を更新する際に、更新後の第１変数の値とともに、更新後の第１変数の値のデータ型の情報を、情報処理装置１のメモリ１０２内等において保持することが可能になる。そのため、第１オブジェクトが第１変数を引数にして第２オブジェクトに含まれる関数を呼び出す場合、情報処理装置１のパラメタ変換部１１３は、第１変数の値のデータ型の情報を参照することで、第１変数の値を変換することが可能になる。
【００６９】
したがって、開発者は、第１オブジェクトから引き渡される第１変数の値を第２オブジェクトが認識できる形式に変換するために、第１変数の値のデータ型にそれぞれ対応する複数のランタイムライブラリを用意する必要がなくなる。
【００７０】
また、開発者は、第２オブジェクトに含まれる関数の種類や数に対応したパラメタ変換部１１３を用意する必要がなくなる。そのため、開発者は、第２オブジェクトに含まれる関数の変更の変更があった場合に、パラメタ変換部１１３や第１ソースコードの変更を行う必要がなくなる。
【００７１】
なお、開発者は、第１オブジェクトから引き渡される可能性がある第１変数の値の各データ型を、第２オブジェクトが認識できる形式のデータ型にそれぞれ変換することが可能なランタイムライブラリ（以下、汎用ランタイムライブラリとも呼ぶ）を用意するものであってもよい。すなわち、汎用ランタイムライブラリは、第１オブジェクトから第１変数の値を引き渡された場合に、その第１変数の値のデータ型の情報を取得する。そして、汎用ランタイムライブラリは、取得したデータ型の情報に基づき、第１オブジェクトから引き渡された第１変数の値を第２オブジェクトが認識できる形式のデータ型に変換する。これにより、開発者は、第１オブジェクトに含まれる関数毎にランタイムライブラリを用意することなく、第１オブジェクトから引き渡された第１変数の値の変換を行うことが可能になる。
【００７２】
[第１の実施の詳細の形態］
次に、第１の実施の形態の詳細を説明する。図１５は、第１の実施の形態におけるコンパイル処理の詳細を説明するフローチャート図である。図１６から図１８は、第１の実施の形態におけるオブジェクト実行処理を説明するフローチャート図である。図１９から図２７は、第１の実施の形態におけるコンパイル処理の詳細及びオブジェクト実行処理を説明する図である。図１９から図２７を参照しながら、図１５から図１８のコンパイル処理及びオブジェクト実行処理について説明を行う。
【００７３】
[コンパイル処理の詳細］
初めに、第１の実施の形態におけるコンパイル処理の詳細について説明を行う。
【００７４】
コンパイル実行部１１１は、図１５に示すように、第１ソースコードに含まれる第１変数を格納する変数格納領域１０２ａを確保する（Ｓ１１）。そして、コンパイル実行部１１１は、Ｓ１１で確保した変数格納領域１０２ａに対応付けて、第１変数のデータ型を格納する第１情報格納領域１０２ｂを確保する（Ｓ１２）。
【００７５】
次に、コンパイル実行部１１１は、Ｓ１１で確保した変数格納領域１０２ａに対応付けて、第１変数の有効データ長を格納する第２情報格納領域１０２ｃを確保する（Ｓ１３）。
【００７６】
すなわち、第１変数の宣言時のデータ型が固定長の文字列型（英数字項目型）である場合において、第１変数の値が領域データ長に満たない場合、ＣＯＢＯＬコード（第１オブジェクト）は、その実行の際に、第１変数の値の末尾に対応する領域に空白を示す情報を格納する処理を行う。そして、パラメタ変換部１１３は、第１オブジェクトから第１変数の値を引き渡された場合、第１変数の値の末尾に対応する領域の空白を示す情報を排除する処理を行ってから、第１オブジェクトから引き渡された第１変数の値を変換する。
【００７７】
ここで、パラメタ変換部１１３は、第１オブジェクトから引き渡された第１変数の値を変換する際に、空白を示す情報が格納された領域（排除すべき情報が格納された領域）を特定する必要がある。しかしながら、第１変数の領域データ長が大きい場合、パラメタ変換部１１３は、空白を示す情報が格納された領域を特定するために処理負担が増大する。
【００７８】
そこで、実施の形態におけるコンパイル実行部１１１は、第１オブジェクトのコンパイルを実行する際に、第１変数の有効データ長の情報を格納する第２情報格納領域１０２ｃを確保する（Ｓ１２）。そして、オブジェクト実行部１１２は、後述するように、第１変数の値とともに、第１変数の有効データ長の情報を保持する。
【００７９】
これにより、パラメタ変換部１１３は、第１オブジェクトから引き渡された第１変数の値を変換する際に、第１変数の有効データ長の情報を取得することが可能になる。そのため、パラメタ変換部１１３は、取得した有効データ長に基づいて、空白を示す情報が格納された領域の特定を行うことが可能になる。したがって、パラメタ変換部１１３は、第１オブジェクトから引き渡された第１変数の値を変換する際の処理負担の増大を防止することが可能になる。
【００８０】
その後、コンパイル実行部１１１は、第１ソースコードから第１オブジェクトを生成する（Ｓ１４）。以下、Ｓ１１及びＳ１２の具体例について説明を行う。
【００８１】
[Ｓ１１及びＳ１２の具体例］
初めに、図１９に示すソースコードについて説明を行う。図１９は、ＣＯＢＯＬによるソースコードの具体例である。
【００８２】
図１９に示すソースコードにおいて、「０１  Ｐ１  ＰＩＣ  Ｘ（４）．」は、図１９に示すソースコードから生成されたＣＯＢＯＬコードの実行時に、データ型が英数字項目型であって、領域データ長が４（バイト）（英数字４文字）であるデータ項目「Ｐ１」を定義することを示す記述である。また、図１９に示すソースコードにおいて、「０１  Ｒ１  ＰＩＣ  Ｓ９（９）  ＣＯＭＰ−５．」は、ＣＯＢＯＬコードの実行時に、データ型が符号ありの数値項目型であって、「−９９９９９９９９９」から「９９９９９９９９９」までの４（バイト）の符号ありの整数（９桁）であるデータ項目「Ｒ１」を定義することを示す記述である。
【００８３】
さらに、図１９に示すソースコードにおいて、「ＭＯＶＥ  “ＡＢＣＤ”  ＴＯ  Ｐ１．」は、ＣＯＢＯＬコードの実行時に、データ項目「Ｐ１」に「ＡＢＣＤ」を格納する関数を示す記述である。また、図１９に示すソースコードにおいて、「ＭＯＶＥ  “ＥＦＧ”  ＴＯ  Ｐ１．」は、ＣＯＢＯＬコードの実行時に、データ項目「Ｐ１」に「ＥＦＧ」を格納する関数を示す記述である。
【００８４】
そして、図１９に示すソースコードにおける「ＣＡＬＬ  “ＦＵＮＣ”  ＵＳＩＮＧ  Ｐ１  ＲＥＴＵＲＮＩＮＧ  Ｒ１．」は、ＣＯＢＯＬコードの実行時に、データ項目「Ｐ１」の値（「ＥＦＧ」）を引数として関数「ＦＵＮＣ」を呼出し、その戻り値をデータ項目「Ｒ１」に格納する関数を示す記述である。
【００８５】
次に、図１９に示すソースコードがコンパイルされる際のメモリの状態の推移を説明する。図２０及び図２１は、図１９に示すソースコードがコンパイルされた場合を説明する図である。
【００８６】
図１９に示すソースコードのコンパイルをする場合、コンパイル実行部１１１は、「０１  Ｐ１  ＰＩＣ  Ｘ（４）．」の記述を参照し、データ項目「Ｐ１」の領域として、４（バイト）の領域を確保する。
【００８７】
具体的に、コンパイル実行部１１１は、例えば、図２０に示すように、情報処理装置１のメモリのうちのアドレスが「２１００」である領域から「２１０３」である領域までを、データ項目「Ｐ１」の領域（変数格納領域１０２ａ）として確保する。
【００８８】
そして、コンパイル実行部１１１は、例えば、図２１に示すように、情報処理装置１のメモリのうちのアドレスが「２０００」である領域を、データ項目「Ｐ１」の値のデータ型の情報を格納するための領域（第１情報格納領域１０２ｂ）として確保する。また、コンパイル実行部１１１は、図２１に示すように、情報処理装置１のメモリのうちのアドレスが「２００１」である領域を、データ項目「Ｐ１」の値の有効データ長の情報を格納するための領域（第２情報格納領域１０２ｃ）として確保する。さらに、コンパイル実行部１１１は、例えば、図２１に示すように、情報処理装置１のメモリ１０２のうちのアドレスが「２００２」である領域を、データ項目「Ｐ１」の値が格納された領域の先頭アドレスを格納するための領域として確保する。
【００８９】
これにより、オブジェクト実行部１１２は、後述するように、第１オブジェクトを実行する際に、第１変数の値とともに、第１変数の実データ型及び第１変数の値の有効データ長を保持することが可能になる。
【００９０】
[オブジェクト実行処理］
次に、第１の実施の形態におけるオブジェクト実行処理について説明を行う。
【００９１】
オブジェクト実行部１１２は、図１６に示すように、第１オブジェクトに含まれる命令を取得する（Ｓ２１）。そして、オブジェクト実行部１１２は、Ｓ２１で取得した命令が第１変数に新たな値を格納する命令であるか否かを判定する（Ｓ２２）。
【００９２】
その結果、Ｓ２１で取得した命令が第１変数に新たな値を格納する命令である場合（Ｓ２２のＹＥＳ）、オブジェクト実行部１１２は、図１７に示すように、新たな値を変数格納領域１０２ａに格納する（Ｓ３１）。さらに、オブジェクト実行部１１２は、更新された第１変数の値に対応するデータ型の情報及び有効データ長の情報をそれぞれ第１情報格納領域１０２ｂ及び第２情報格納領域１０２ｃに格納する（Ｓ３２）。以下、Ｓ３１及びＳ３２の具体例について説明を行う。
【００９３】
[Ｓ３１及びＳ３２の具体例］
図２２は、図１９に示すソースコードにおける「ＭＯＶＥ  “ＡＢＣＤ”  ＴＯ  Ｐ１．」に対応する処理が実行された場合を説明する図である。また、図２３は、図１９に示すソースコードにおける「ＭＯＶＥ  “ＥＦＧ”  ＴＯ  Ｐ１．」に対応する処理が実行された場合を説明する図である。さらに、図２４から図２７は、図１９に示すソースコードにおける「ＣＡＬＬ  “ＦＵＮＣ”  ＵＳＩＮＧ  Ｐ１  ＲＥＴＵＲＮＩＮＧ  Ｒ１．」に対応する処理が実行された場合を説明する図である。
【００９４】
図１９に示すソースコードにおける「ＭＯＶＥ  “ＡＢＣＤ”  ＴＯ  Ｐ１．」に対応する処理が実行する場合、オブジェクト実行部１１２は、図２２に示すように、情報処理装置１のメモリ１０２のうちのアドレスが「２１００」から「２１０３」である領域に、「ＡＢＣＤ」を示す情報を格納する（Ｓ３１）。
【００９５】
また、オブジェクト実行部１１２は、図２２に示すように、情報処理装置１のメモリ１０２内のアドレスが「２０００」である領域に、「ＡＢＣＤ」のデータ型である英数字項目型を示す情報（図２２の例においては「１」）を格納する（Ｓ３２）。さらに、オブジェクト実行部１１２は、図２２に示すように、情報処理装置１のメモリ１０２内のアドレスが「２００１」である領域に、「ＡＢＣＤ」の有効データ長を示す「４」を格納する（Ｓ３２）。なお、オブジェクト実行部１１２は、例えば、各データ型の名称と各データ型を示す情報とを対応させた情報（英英数字項目型が「１」と対応する旨の情報や数値項目型が「２」と対応する旨の情報等を含む情報）を参照することにより、メモリ１０２内のアドレスが「２０００」である領域に格納すべき情報を決定するものであってよい。
【００９６】
これにより、オブジェクト実行部１１２は、データ項目「Ｐ１」の値と対応付ける形で、データ項目「Ｐ１」の値のデータ型及び有効データ長の情報を保持することが可能になる。
【００９７】
次に、図２３を参照して、図１９に示すソースコードにおける「ＭＯＶＥ  “ＥＦＧ”  ＴＯ  Ｐ１．」に対応する処理が実行された後の状態について説明を行う。図１９に示すソースコードにおける「ＭＯＶＥ  “ＥＦＧ”  ＴＯ  Ｐ１．」に対応する処理が実行する場合、オブジェクト実行部１１２は、図２３に示すように、情報処理装置１のメモリ１０２のうちのアドレスが「２１００」から「２１０２」である領域に、「ＥＦＧ」を示す情報を格納する（Ｓ３１）。また、この場合、データ項目「Ｐ１」の値の有効データ長が「３」であり、データ項目「Ｐ１」の値の領域データ長である「４」より短い。そのため、オブジェクト実行部１１２は、図２３に示すように、アドレスが「２０１３」である領域に、空白を示す情報を格納する。
【００９８】
そして、オブジェクト実行部１１２は、図２３に示すように、情報処理装置１のメモリ１０２内のアドレスが「２０００」である領域に、「ＡＢＣＤ」のデータ型である英数字項目型を示す「１」を格納する（Ｓ３２）。さらに、オブジェクト実行部１１２は、図２３に示すように、情報処理装置１のメモリ１０２内のアドレスが「２００１」である領域に、「ＥＦＧ」の有効データ長を示す「３」を格納する（Ｓ３２）。
【００９９】
これにより、オブジェクト実行部１１２は、データ項目「Ｐ１」の値が更新された場合であっても、更新されたデータ項目「Ｐ１」の値のデータ型及び有効データ長の情報を保持することが可能になる。
【０１００】
図１６に戻り、オブジェクト実行部１１２は、図１７のＳ３１及びＳ３２の処理を実行した後、第１オブジェクトに含まれる全ての命令を実行したか否かを判定する（Ｓ２５）。そして、第１オブジェクトに含まれる全ての命令の実行が完了した場合（Ｓ２５のＹＥＳ）、オブジェクト実行部１１２は、オブジェクト実行処理を終了する。一方、第１オブジェクトに含まれる全ての命令の実行が完了していない場合（Ｓ２５のＮＯ）、オブジェクト実行部１１２は、Ｓ２１以降の処理を繰り返し実行する。
【０１０１】
また、Ｓ２１で取得した命令が第１変数に新たな値を格納する命令でない場合（Ｓ２２のＮＯ）、オブジェクト実行部１１２は、Ｓ２１で取得した命令が第１変数の値を引数として第２オブジェクトを実行する命令であるか否かの判定を行う（Ｓ２３）。
【０１０２】
その結果、Ｓ２１で取得した命令が第１変数を引数として第２オブジェクトを実行する命令である場合（Ｓ２３のＹＥＳ）、パラメタ変換部１１３は、図１８に示すように、第１変数の有効データ長の情報を参照する（Ｓ４１）。そして、パラメタ変換部１１３は、第１変数の値のうちの有効データ長に対応する値のみを取得する（Ｓ４１）。
【０１０３】
すなわち、パラメタ変換部１１３は、第１オブジェクトから引数として第１変数の値を引き渡された場合、図２４に示すように、情報処理装置１のメモリ１０２を参照することにより、第１変数の値の有効データ長を取得することが可能になる（図２４の（１））。そのため、パラメタ変換部１１３は、第１オブジェクトから引き渡された第１変数の値のうち、有効データ長に対応する値を特定する処理を迅速に行うことが可能になる。
【０１０４】
また、パラメタ変換部１１３は、第１変数のデータ型の情報を参照して、Ｓ４１で取得した値を第２オブジェクトが認識できる形式に変換する（Ｓ４２）。
【０１０５】
すなわち、パラメタ変換部１１３は、第１オブジェクトから引数として第１変数の値を引き渡された場合、図２４に示すように、情報処理装置１のメモリ１０２を参照することにより、第１変数の値のデータ型を取得することが可能になる（図２４の（１））。そのため、開発者は、図５で説明したように、第１オブジェクトから引き渡される可能性がある値のそれぞれに対応するために、複数のパラメタ変換部１１３を用意しておく必要がなくなる。以下、Ｓ４２の処理が実行された場合における情報処理装置１のメモリ１０２の状態について説明を行う。
【０１０６】
[Ｓ４２の処理が実行された場合のメモリ１０２の状態］
図２５は、図１９に示すソースコードにおける「ＣＡＬＬ  “ＦＵＮＣ”  ＵＳＩＮＧ  Ｐ１  ＲＥＴＵＲＮＩＮＧ  Ｒ１．」に対応する処理が実行された場合を説明する図である。図２４及び図２５に示すように、データ項目「Ｐ１」の値を第２オブジェクトが認識できる形式に変換した場合、パラメタ変換部１１３は、変換した値を情報処理装置１のメモリ１０２内に格納する（図２４の（２））。
【０１０７】
具体的に、パラメタ変換部１１３は、この場合、図２５に示すように、データ項目「Ｐ１」の値である「ＥＦＧ」の文字コードをＡＳＣＩＩからＵｎｉｃｏｄｅに変換する。そして、パラメタ変換部１１３は、図２５に示すように、Ｕｎｉｃｏｄｅに変換した値を、情報処理装置１のメモリ１０２のうちの先頭アドレスが「２５００」である領域に格納を行う。これにより、パラメタ変換部１１３は、データ項目「Ｐ１」の値を第２オブジェクトが認識できる形式に変換することが可能になる。
【０１０８】
図１８に戻り、パラメタ変換部１１３は、Ｓ４２で変換した値を引数として第２オブジェクトに引き渡し、第２オブジェクトに含まれる関数の呼出しを行う（Ｓ４３、図２４の（３））。なお、図２５に示す例において、第２オブジェクトが、情報処理装置１のメモリ１０２内における先頭アドレスが「２５００」である領域を参照し、第１オブジェクトが呼び出した関数を実行するための引数（「ＥＦＧ」）を取得するものであってよい。
【０１０９】
その後、パラメタ変換部１１３は、第２オブジェクトから、第１オブジェクトが呼び出した関数の実行結果（変更された引数及び戻り値）が引き渡されるまで待機する（Ｓ４４のＮＯ）。そして、第２オブジェクトから変更された引数及び戻り値が引き渡された場合（Ｓ４４のＹＥＳ）、パラメタ変換部１１３は、Ｓ４４で取得した引数の値を第１オブジェクトが認識できる形式に変換し、変数格納領域１０２ａに格納する（Ｓ４５、図２４の（４））。
【０１１０】
また、パラメタ変換部１１３は、この場合、Ｓ４４で取得した引数の値の有効データ長を、Ｓ４５で変換後の引数の値を格納した変数格納領域１０２ａに対応する第２変更格納領域に格納する（Ｓ４６、図２４の（５））。これにより、パラメタ変換部１１３は、第１オブジェクトが第２オブジェクトに含まれる関数に実行を要求することにより、引数の値が変更された場合であっても、変更後の引数の値に対応する有効データ長を第２情報格納領域１０２ｃに格納することが可能になる。
【０１１１】
さらに、パラメタ変換部１１３は、Ｓ４４で取得した戻り値を第１オブジェクトが認識できる形式に変換し、変数格納領域１０２ａに格納する（Ｓ４７、図２４の（６））。また、パラメタ変換部１１３は、この場合、Ｓ４４で取得した戻り値の有効データ長を、Ｓ４７で変換後の戻り値を格納した変数格納領域１０２ａに対応する第２変更格納領域に格納する（Ｓ４８、図２４の（７））。これにより、パラメタ変換部１１３は、第１オブジェクトが第２オブジェクトに含まれる関数に実行を要求した場合に、第２オブジェクトに含まれる関数の戻り値に対応する有効データ長を第２情報格納領域１０２ｃに格納することが可能になる。以下、Ｓ４５及びＳ４６の処理が実行された場合における情報処理装置１のメモリ１０２の状態について説明を行う。
【０１１２】
[Ｓ４５及びＳ４６の処理が実行された場合のメモリ１０２の状態］
図２６は、図１９に示すソースコードにおける「ＣＡＬＬ  “ＦＵＮＣ”  ＵＳＩＮＧ  Ｐ１  ＲＥＴＵＲＮＩＮＧ  Ｒ１．」に対応する処理が実行された後、第２オブジェクトに含まれる関数から変更された引数及び戻り値が引き渡された後の情報処理装置１のメモリ１０２の状態を説明する図である。なお、以下、第２オブジェクトから引き渡された変更された引数についての説明を行い、第２オブジェクトから引き渡された戻り値についての説明は省略する。
【０１１３】
具体的に、第２オブジェクトは、例えば、図２６に示すように、第１オブジェクトが呼び出した関数によって変更された引数である「ＨＩ」を、情報処理装置１のメモリ１０２のうちの先頭アドレスが「２５００」である領域に格納を行う。なお、この場合、アドレスが「２５００」から「２５０３」である領域に「ＨＩ」を示す情報が格納され、アドレスが「２５０４」及び「２５０５」である領域には、「ＮＵＬＬ（￥０）」を示す情報が格納される。そのため、図２６に示す例において、アドレスが「２５０６」及び「２５０７」である領域には、新たな情報が格納されない。したがって、図２６に示すアドレスが「２５０６」及び「２５０７」である領域には、図２５で格納された情報である「ＮＵＬＬ（￥０）」がそのまま格納されている。
【０１１４】
次に、図１９に示すソースコードにおける「ＣＡＬＬ  “ＦＵＮＣ”  ＵＳＩＮＧ  Ｐ１  ＲＥＴＵＲＮＩＮＧ  Ｒ１．」に対応する処理が実行された後、パラメタ変換部１１３が第２オブジェクトから引き渡された引数を第１オブジェクトが認識できる形式に変換した場合を説明する。図２７は、図１９に示すソースコードにおける「ＣＡＬＬ  “ＦＵＮＣ”  ＵＳＩＮＧ  Ｐ１  ＲＥＴＵＲＮＩＮＧ  Ｒ１．」に対応する処理が実行された後、パラメタ変換部１１３が第２オブジェクトからの引数を第１オブジェクトが認識できる形式に変換した場合を説明する図である。
【０１１５】
具体的に、パラメタ変換部１１３は、この場合、図２７に示すように、先頭アドレスが「２５００」である領域に格納された「ＨＩ」の文字コードをＵｎｉｃｏｄｅからＡＳＣＩＩに変換する。そして、パラメタ変換部１１３は、図２７に示すように、ＡＳＣＩＩに変換した値を、情報処理装置１のメモリ１０２のうちの先頭アドレスが「２１００」である領域に格納を行う。これにより、パラメタ変換部１１３は、第２オブジェクトから引き渡された引数及び戻り値を第１オブジェクトが認識できる形式に変換することが可能になる。
【０１１６】
なお、データ項目「Ｐ１」の領域（先頭アドレスが「２１００」である領域）に格納された値（「ＨＩ」）の有効データ長は、「２」である。そのため、パラメタ変換部１１３は、例えば、第１オブジェクトコードからデータ項目「Ｐ１」の領域データ長が「４」である旨の情報を取得し、先頭アドレスが「２１００」である領域に格納された値の末尾の領域に、空白を示す情報を付加する。具体的に、パラメタ変換部１１３は、図２７に示すように、アドレスが「２１０２」及び「２１０３」である領域に空白を示す情報を付加する。
【０１１７】
さらに、パラメタ変換部１１３は、この場合、図２７に示すように、アドレスが「２００１」である領域に、データ項目「Ｐ１」に格納された値（「ＨＩ」）の有効データ長である「２」を示す情報を格納する。これにより、パラメタ変換部１１３は、第１オブジェクトが第２オブジェクトに含まれる関数に実行を要求することによって引数の値が変更された場合であっても、変更された引数及び戻り値に対応する有効データ長を保持することが可能になる。
【０１１８】
図１６に戻り、Ｓ２３の処理において、Ｓ２１で取得した命令が第１変数を引数として第２オブジェクトを実行する命令でない場合（Ｓ２３のＮＯ）、オブジェクト実行部１１２は、Ｓ２１で取得した命令を実行する（Ｓ２４）。
【０１１９】
このように、情報処理装置１は、第１ソースコードに含まれる第１変数を格納する変数格納領域１０２ａに対応付けて、第１変数のデータ型の情報を格納する第１情報格納領域１０２ｂを確保する。そして、第１情報格納領域１０２ｂに格納された第１変数のデータ型の情報は、第１ソースコードから生成された第１オブジェクトの実行の際の第１変数の更新に応じて更新され、かつ、変数格納領域１０２ａの第１変数とともに外部プログラムにより取得される。
【０１２０】
これにより、開発者は、第１オブジェクトから引き渡される第１変数の値を第２オブジェクトが認識できる形式に変換するために、第１変数の値のデータ型にそれぞれ対応する複数のランタイムライブラリを用意する必要がなくなる。また、開発者は、第２オブジェクトに含まれる関数の変更の変更があった場合に、パラメタ変換部１１３や第１ソースコードの変更を行う必要がなくなる。
【０１２１】
なお、上記の例において、コンパイル実行部１１１は、第１ソースコードのコンパイルを行う際に、第１変数の値を格納する変数格納領域１０２ａとともに、第１変数の実データ型の情報及び有効データ長の情報を格納する情報格納領域の確保を行う場合について説明した。これに加え、コンパイル実行部１１１は、例えば、第１変数の領域データ長を格納するための情報格納領域の確保を行うものであってもよい。これにより、パラメタ変換部１１３は、例えば、第２オブジェクトから引き渡された引数の値及び戻り値を、第１オブジェクトが認識できる形式に変換する際に（図１８のＳ４５及びＳ４７）、領域データ長の情報を迅速に取得することが可能になる。
【０１２２】
また、コンパイル実行部１１１は、例えば、第１変数の宣言時のデータ型を格納するための情報格納領域の確保を行うものであってもよい。
【０１２３】
以上の実施の形態をまとめると、以下の付記のとおりである。
【０１２４】
（付記１）
コンピュータに、
第１ソースコードに含まれる第１変数を格納する変数格納領域に対応付けて、前記第１変数のデータ型を格納する第１情報格納領域を確保する、
処理を実行させ、
前記第１情報格納領域に格納された前記データ型は、前記第１ソースコードから生成された第１オブジェクトの実行の際の前記第１変数の更新に応じて更新され、かつ、前記変数格納領域に格納された前記第１変数とともに外部プログラムにより取得可能である、
ことを特徴とするコンパイラ。
【０１２５】
（付記２）
付記１において、
前記第１情報格納領域は、前記変数格納領域のアドレスを特定する情報を格納する、
ことを特徴とするコンパイラ。
【０１２６】
（付記３）
付記１において、
前記確保では、前記第１変数のデータ型が固定長の文字列型である場合、前記変数格納領域に対応付けて、前記第１変数の有効データ長を格納する第２情報格納領域を確保し、
前記第２情報格納領域に格納された前記有効データ長は、前記第１オブジェクトの実行の際の前記第１変数の更新に応じて更新され、かつ、前記変数格納領域に格納された前記第１変数とともに外部プログラムにより取得される、
ことを特徴とするコンパイラ。
【０１２７】
（付記４）
付記３において、
前記第１オブジェクトは、前記第１変数を引数として、前記第１ソースコードが記述された言語とは異なる言語で記述された第２ソースコードから生成された第２オブジェクトを実行させる際に、前記第１変数の変換を行うランタイムライブラリに前記第１変数を引き渡し、
前記ランタイムライブラリは、前記第１変数の前記データ型を参照して、前記第１オブジェクトから引き渡された前記第１変数を、前記第２オブジェクトが認識できる形式に変換し、変換した前記第１変数を前記第２オブジェクトに引き渡す、
ことを特徴とするコンパイラ。
【０１２８】
（付記５）
付記４において、
前記ランタイムライブラリは、前記第１変数の前記有効データ長を参照し、前記第１変数のうちの前記有効データ長に対応するデータのみを、前記第２オブジェクトが認識できる形式に変換する、
ことを特徴とするコンパイラ。
【０１２９】
（付記６）
付記１において、
前記第１ソースコードは、ＣＯＢＯＬによって記述されたソースコードである、
ことを特徴とするコンパイラ。
【０１３０】
（付記７）
付記１において、
前記第１変数の更新は、前記第１変数と異なる第２変数または定数が前記第１変数に転記されることによって行われる、
ことを特徴とするコンパイラ。
【０１３１】
（付記８）
第１ソースコードに含まれる第１変数を格納する変数格納領域に対応付けて、前記第１変数のデータ型を格納する第１情報格納領域を確保する領域確保部を有し、
前記第１情報格納領域に格納された前記データ型は、前記第１ソースコードから生成された第１オブジェクトの実行の際の前記第１変数の更新に応じて更新され、かつ、前記変数格納領域に格納された前記第１変数とともに外部プログラムにより取得可能である、
ことを特徴とするコンパイル装置。
【０１３２】
（付記９）
付記８において、
前記領域確保部は、前記第１変数のデータ型が固定長の文字列型である場合、前記変数格納領域に対応付けて、前記第１変数の有効データ長を格納する第２情報格納領域を確保し、
前記第２情報格納領域に格納された前記有効データ長は、前記第１オブジェクトの実行の際の前記第１変数の更新に応じて更新され、かつ、前記変数格納領域に格納された前記第１変数とともに外部プログラムにより取得される、
ことを特徴とするコンパイル装置。
【０１３３】
（付記１０）
第１ソースコードに含まれる第１変数を格納する変数格納領域に対応付けて、前記第１変数のデータ型を格納する第１情報格納領域を確保し、
前記第１情報格納領域に格納された前記データ型は、前記第１ソースコードから生成された第１オブジェクトの実行の際の前記第１変数の更新に応じて更新され、かつ、前記変数格納領域に格納された前記第１変数とともに外部プログラムにより取得可能である、
ことを特徴とするコンパイル方法。
【０１３４】
（付記１１）
付記１０において、
前記確保では、前記第１変数のデータ型が固定長の文字列型である場合、前記変数格納領域に対応付けて、前記第１変数の有効データ長を格納する第２情報格納領域を確保し、
前記第２情報格納領域に格納された前記有効データ長は、前記第１オブジェクトの実行の際の前記第１変数の更新に応じて更新され、かつ、前記変数格納領域に格納された前記第１変数とともに外部プログラムにより取得される、
ことを特徴とするコンパイル方法。
【符号の説明】
【０１３５】
１：情報処理装置                ２：記憶装置
２ａ：ソースコード              ２ｂ：オブジェクトコード
１１：管理者端末
【図１】
2017016503.tif 000003
【図２】
2017016503.tif 000004
【図３】
2017016503.tif 000005
【図４】
2017016503.tif 000006
【図５】
2017016503.tif 000007
【図６】
2017016503.tif 000008
【図７】
2017016503.tif 000009
【図８】
2017016503.tif 000010
【図９】
2017016503.tif 000011
【図１０】
2017016503.tif 000012
【図１１】
2017016503.tif 000013
【図１２】
2017016503.tif 000014
【図１３】
2017016503.tif 000015
【図１４】
2017016503.tif 000016
【図１５】
2017016503.tif 000017
【図１６】
2017016503.tif 000018
【図１７】
2017016503.tif 000019
【図１８】
2017016503.tif 000020
【図１９】
2017016503.tif 000021
【図２０】
2017016503.tif 000022
【図２１】
2017016503.tif 000023
【図２２】
2017016503.tif 000024
【図２３】
2017016503.tif 000025
【図２４】
2017016503.tif 000026
【図２５】
2017016503.tif 000027
【図２６】
2017016503.tif 000028
【図２７】
2017016503.tif 000029