JP2017016503A - コンパイラ、コンパイル装置及びコンパイル方法 - Google Patents
コンパイラ、コンパイル装置及びコンパイル方法 Download PDFInfo
- Publication number
- JP2017016503A JP2017016503A JP2015134301A JP2015134301A JP2017016503A JP 2017016503 A JP2017016503 A JP 2017016503A JP 2015134301 A JP2015134301 A JP 2015134301A JP 2015134301 A JP2015134301 A JP 2015134301A JP 2017016503 A JP2017016503 A JP 2017016503A
- Authority
- JP
- Japan
- Prior art keywords
- variable
- storage area
- source code
- value
- stored
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/76—Adapting program code to run in a different environment; Porting
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/43—Checking; Contextual analysis
- G06F8/436—Semantic checking
- G06F8/437—Type checking
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computational Linguistics (AREA)
- Human Computer Interaction (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
【課題】データ項目の実データ型に基づく処理の実行を可能にするコンパイルを行うコンパイラ、コンパイル装置及びコンパイル方法を提供する。【解決手段】第1ソースコードに含まれる第1変数を格納する変数格納領域に対応付けて、第1変数のデータ型を格納する第1情報格納領域を確保し、第1情報格納領域に格納されたデータ型は、第1ソースコードから生成された第1オブジェクトの実行の際の第1変数の更新に応じて更新され、かつ、変数格納領域に格納された第1変数とともに外部プログラムにより取得可能である。【選択図】図14
Description
本発明は、コンパイラ、コンパイル装置及びコンパイル方法に関する。
COBOL(COmmon Business Oriented Language)には、JAVA(登録商標)等の他の言語と同様に、複数のデータ型が用意されている。データ型とは、プログラミング言語が取り扱うデータをいくつかの種類に分類するものであり、例えば、メモリ上に展開した場合のデータサイズや符号化形式等が規定されたものである。具体的に、データ型には、例えば、整数型、浮動小数点型または文字列型等が存在する。
そして、COBOLのデータ型は、JAVA等のデータ型と異なり、各データ型に格納できる値の制約が厳密に定められていない。そのため、例えば、COBOLにおいて英数字項目(英数字からなる値)を格納するデータ型である英数字項目型(以下、X項目とも呼ぶ)は、英数字項目のみならず、バイナリデータ等を格納することが可能である(例えば、特許文献1及び2参照)。
COBOLによるオブジェクトコード(以下、COBOLコードとも呼ぶ)が実行される場合、COBOLコードは、他の言語(例えば、JAVA等)によるオブジェクトコード(以下、JAVAによるオブジェクトコードをJAVAコードとも呼ぶ)に含まれる関数を呼び出す場合がある。これにより、COBOLコードを実行するコンピュータは、JAVAコード等の他言語のコードにより提供されている機能を利用することが可能になる。
ここで、COBOLコードは、JAVAコードに含まれる関数等を呼び出す場合、各データ項目(以下、変数とも呼ぶ)の値が、各データ項目の宣言時のデータ型に対応する値であるものとして、データ項目の値をJAVAコードに引き渡す。
しかしながら、COBOLのデータ型は、上記のように、各データ型に格納できる値の制約が厳密に定められていない。そのため、COBOLコードに含まれる各データ項目には、各データ項目の宣言時におけるデータ型と異なるデータ型に対応する値が格納されている場合がある。したがって、JAVAコードは、この場合、各データ項目に格納されている値の現在のデータ型(以下、実データ型とも呼ぶ)に基づく処理を行うことができない。
そこで、一つの側面では、データ項目の実データ型に基づく処理の実行を可能にするコンパイルを行うことを目的とする。
実施の形態の一つの態様によれば、コンピュータに、第1ソースコードに含まれる第1変数を格納する変数格納領域に対応付けて、前記第1変数のデータ型を格納する第1情報格納領域を確保する、処理を実行させ、前記第1情報格納領域に格納された前記データ型は、前記第1ソースコードから生成された第1オブジェクトの実行の際の前記第1変数の更新に応じて更新され、かつ、前記変数格納領域に格納された前記第1変数とともに外部プログラムにより取得可能である。
一つの側面によれば、データ項目の実データ型に基づく処理の実行を可能にするコンパイルを行う。
[情報処理システムの構成]
図1は、情報処理システム10の全体構成を示す図である。図1に示す情報処理システム10は、情報処理装置1(以下、コンパイル装置1またはコンピュータ1とも呼ぶ)と、記憶装置2と、管理者端末11とを有する。
図1は、情報処理システム10の全体構成を示す図である。図1に示す情報処理システム10は、情報処理装置1(以下、コンパイル装置1またはコンピュータ1とも呼ぶ)と、記憶装置2と、管理者端末11とを有する。
情報処理装置1は、システム管理者(以下、単に管理者とも呼ぶ)がソースコード2aのコンパイルの指示を入力した場合に、記憶装置2に記憶されたソースコード2aをコンパイルしてオブジェクトコード2bを生成する。そして、情報処理装置1は、例えば、生成したオブジェクトコード2bを記憶装置2に記憶する。その後、情報処理装置1は、例えば、管理者がオブジェクトコード2bを実行するための指示を入力した場合に、記憶装置2に記憶されたオブジェクトコード2bの実行を行う。
なお、管理者は、例えば、管理者端末11により情報処理装置1に対する指示を行うものであってよい。また、情報処理装置1は、例えば、予め設定されたタイミングになった際に、ソースコード2aのコンパイルやオブジェクトコード2bの実行を自発的に行うものであってもよい。
[COBOLによるソースコード]
次に、COBOLによって記述されたソースコードについて説明を行う。図2は、COBOLによるソースコードの具体例である。
次に、COBOLによって記述されたソースコードについて説明を行う。図2は、COBOLによるソースコードの具体例である。
図2に示すソースコードにおいて、「01 P1 PIC X(4).」は、COBOLコードの実行時に、データ型が英数字項目型であって、データ長(以下、領域データ長とも呼ぶ)が4(バイト)(英数字4文字)であるデータ項目「P1」を定義することを示す記述である。また、図2に示すソースコードにおいて、「01 R1 PIC S9(9) COMP−5.」は、COBOLコードの実行時に、データ型が符号ありの数値項目型(数値からなる値が格納されるデータ型)であって、「−999999999」から「999999999」までの4(バイト)の符号あり整数(9桁)であるデータ項目「R1」を定義することを示す記述である。なお、「COMP−5」は、データ項目「R1」に格納された値を2進数のデータとして処理を行うことを示す記述である。
さらに、図2に示すソースコードにおいて、「MOVE “ABCD” TO P1.」は、COBOLコードの実行時に、データ項目「P1」に「ABCD」を格納する関数を示す記述である。また、図2に示すソースコードにおいて、「CALL “FUNC” USING P1 RETURNING R1.」は、データ項目「P1」の値(「ABCD」)を引数として関数「FUNC」を呼出し、その戻り値をデータ項目「R1」に格納する関数を示す記述である。なお、以下、関数「FUNC」は、COBOL以外の言語(以下、非COBOLとも呼ぶ)によるオブジェクトコード(以下、非COBOLコードとも呼ぶ)に含まれる関数であるものとして説明を行う。
[COBOLによるソースコードのコンパイル]
次に、図2に示すソースコードのコンパイルについて説明を行う。図3は、図2に示すソースコードがコンパイルされた場合を説明する図である。具体的に、図3(A)は、図2に示すソースコードから生成されるCOBOLコードに含まれる情報を説明する図である。また、図3(B)は、図2に示すソースコードがコンパイルされた場合における情報処理装置1のメモリの状態を説明する図である。
次に、図2に示すソースコードのコンパイルについて説明を行う。図3は、図2に示すソースコードがコンパイルされた場合を説明する図である。具体的に、図3(A)は、図2に示すソースコードから生成されるCOBOLコードに含まれる情報を説明する図である。また、図3(B)は、図2に示すソースコードがコンパイルされた場合における情報処理装置1のメモリの状態を説明する図である。
図2に示すソースコードのコンパイルを行う場合、情報処理装置1(コンパイル装置1)は、「01 P1 PIC X(4).」を参照し、データ項目「P1」の値を格納可能な領域(以下、データ項目「P1」の領域とも呼ぶ)として、4(バイト)の領域を確保する。具体的に、情報処理装置1は、例えば、図3(B)に示すように、情報処理装置1のメモリのうちのアドレスが「2000」である領域から「2003」である領域までを、データ項目「P1」の領域として確保する。そして、情報処理装置1は、例えば、図3(B)に示すように、情報処理装置1のメモリのうちのアドレスが「1000」である領域に、データ項目「P1」の領域の先頭アドレスである「2000」を示す情報を格納する。さらに、情報処理装置1は、例えば、図3(A)に示すように、データ項目「P1」の領域の先頭アドレスが格納された領域のアドレスが「1000」である旨の情報が含まれるように、図2に示すソースコードをコンパイルしてCOBOLコードを作成する。
これにより、図2に示すソースコードから生成されたCOBOLコードは、その実行中において、データ項目「P1」の領域の先頭アドレスが格納された領域のアドレスに基づき、データ項目「P1」に格納されている値を取得することが可能になる。なお、情報処理装置1が「01 R1 PIC S9(9) COMP−5.」を参照して行う処理については、図3で説明した場合と同様であるため説明を省略する。
[COBOLコードの実行]
続いて、図2に示すソースコードから生成されたCOBOLコードが実行された場合における情報処理装置1のメモリの状態について説明を行う。図4は、図2に示すソースコードにおける「MOVE “ABCD” TO P1.」に対応する処理が実行された場合を説明する図である。また、図5から図8は、図2に示すソースコードにおける「CALL “FUNC” USING P1 RETURNING R1.」に対応する処理が実行された場合を説明する図である。
続いて、図2に示すソースコードから生成されたCOBOLコードが実行された場合における情報処理装置1のメモリの状態について説明を行う。図4は、図2に示すソースコードにおける「MOVE “ABCD” TO P1.」に対応する処理が実行された場合を説明する図である。また、図5から図8は、図2に示すソースコードにおける「CALL “FUNC” USING P1 RETURNING R1.」に対応する処理が実行された場合を説明する図である。
図2に示すソースコードにおける「MOVE “ABCD” TO P1.」に対応する処理を実行する場合、COBOLコード(COBOLコードと協働して動作する情報処理装置1のCPU)は、図4に示すように、データ項目「P1」の領域に「ABCD」を示す値を格納する。これにより、COBOLコードは、データ項目「P1」の値を情報処理装置1のメモリにおいて保持することが可能になる。
なお、図4に示す例において、データ項目「P1」の領域に格納された値(「ABCD」)の文字コードは、ASCII(American Standard Code for Information Inteschange)である。また、図4に示す例において、アドレスが「2004」である領域には、アドレスが「2000」から「2003」である領域に格納された値(「ABCD」)の終端を示す「¥0(NULL)」が格納されている。
次に、図2に示すソースコードにおける「CALL “FUNC” USING P1 RETURNING R1.」に対応する処理を実行する場合、COBOLコードは、関数「FUNC」の実行を非COBOLオブジェクトに要求(指示)する。
この場合、COBOLコードは、例えば、データ項目「P1」の値を、非COBOLコードが認識できる形式に変換する。そして、COBOLコードは、変換した値を引数として、関数「FUNC」の実行を非COBOLコードに要求する。以下、COBOLコードが関数「FUNC」の実行を非COBOLコードに要求する場合について説明を行う。
図5は、COBOLコードが関数「FUNC」の実行を非COBOLコードに要求する場合を説明する図である。COBOLコードは、図5に示すように、記憶装置2等に記憶されたプログラムであるランタイムライブラリを実行することにより、データ項目「P1」に格納されている値を、非COBOLコードが認識できる形式に変換する。なお、以下、非COBOLコードがJAVAコードであるものとして説明を行う。
ランタイムライブラリは、COBOLコードと非COBOLコードとの間で情報(引数や戻り値)の変換を行うためのプログラムである。図5に示す例において、ランタイムライブラリは、COBOLコードに含まれる関数毎に存在する。そのため、図5に示す例において、COBOLコードは、非COBOLコードに含まれる関数「FUNC」を呼び出す場合、関数「FUNC」に対応するランタイムライブラリに対してデータ項目「P1」の値を引き渡す。
そして、ランタイムライブラリ(ランタイムライブラリと協働して動作する情報処理装置1のCPU)は、データ項目「P1」の値を受け取った場合、例えば、図5に示すように、受け取ったデータ項目「P1」の値を、JAVAのデータ型であるString型に変換する(図5の(1))。すなわち、ランタイムライブラリは、データ項目「P1」の値をString型に変換することにより、データ項目「P1」の値を非COBOLコード(JAVAコード)が認識可能な形式にする。続いて、ランタイムライブラリは、String型に変換した値を引数として、関数「FUNC」の呼出しを行う(図5の(2))。
その後、ランタイムライブラリは、非COBOLコードから関数「FUNC」の実行結果(例えば、関数「FUNC」によって変更された引数の値と戻り値)を受け取るまで待機する。なお、関数「FUNC」の戻り値は、例えば、関数「FUNC」の実行が正常に完了したか否かを示す値として用いられる。また、図5に示す例において、関数「FUNC」がランタイムライブラリに引き渡す戻り値のデータ型は、JAVAの数値型であるint型である。
そして、関数「FUNC」の実行結果を受け取った場合、ランタイムライブラリは、例えば、図5に示すように、関数「FUNC」によって変更された引数の値を英数字項目型に変換し、データ項目「P1」の領域に格納する(図5の(3))。また、ランタイムライブラリは、この場合、戻り値を数値項目型に変換し、データ項目「R1」の領域に格納する(図5の(4))。
[COBOLコードの実行時におけるメモリの状態]
次に、図5で説明した処理を実行する場合におけるメモリの状態の推移について説明を行う。図6から図8は、図5で説明した処理を実行する場合におけるメモリの状態の推移を説明する図である。
次に、図5で説明した処理を実行する場合におけるメモリの状態の推移について説明を行う。図6から図8は、図5で説明した処理を実行する場合におけるメモリの状態の推移を説明する図である。
図6に示すように、データ項目「P1」の値を非COBOLコードが認識できる形式に変換した場合(図5の(1))、ランタイムライブラリは、変換した値を情報処理装置1のメモリに格納する。
具体的に、ランタイムライブラリは、図6に示す例において、データ項目「P1」の値である「ABCD」の文字コードをASCIIからUnicodeに変換する。そして、ランタイムライブラリは、図6に示すように、Unicodeに変換した値を、情報処理装置1のメモリのうちの先頭アドレスが「2500」である領域に格納を行う。なお、ランタイムライブラリが変換した値を格納する領域(先頭アドレスが「2500」である領域)は、図3において説明した場合と同様に、COBOLソースコードをコンパイルする際に確保されるものであってよい。
次に、非COBOLコード(非COBOLコードと協働して動作する情報処理装置1のCPU)は、図6に示す例において、先頭アドレスが「2500」である領域を参照し、関数「FUNC」の処理を実行するための引数を取得する(図5の(2))。そして、非COBOLコードは、例えば、図5に示すように、取得した引数の値を変数「A1」に格納し、格納した変数「A1」の値に基づいて関数「FUNC」を実行する。
その後、非COBOLコードは、図7に示すように、関数「FUNC」によって変更された引数(「EFGH」)を、情報処理装置1のメモリのうちの先頭アドレスが「2500」である領域に格納する。
そして、ランタイムライブラリは、この場合、図8に示すように、非COBOLコードが格納した引数の値を、COBOLコードが認識できるデータ型である英数字項目型に変換する。さらに、ランタイムライブラリは、変換した引数の値を、先頭アドレスが「2000」である領域(データ項目「P1」の領域)に格納する。
具体的に、ランタイムライブラリは、関数「FUNC」によって変更された引数の値である「EFGH」の文字コードを、UnicodeからASCIIに変換する。そして、ランタイムライブラリは、図8に示すように、ASCIIに変換した値を、情報処理装置1のメモリのうちの先頭アドレスが「2000」である領域に格納を行う。
なお、関数「FUNC」の戻り値を情報処理装置1のメモリに格納する場合の具体例については、関数「FUNC」によって変更された引数の値を情報処理装置1のメモリに格納する場合の具体例と同様であるため説明を省略する。
ここで、ランタイムライブラリは、COBOLコードが関数「FUNC」の呼出しを行う場合に、データ項目「P1」の宣言時におけるデータ型に基づいてデータ項目「P1」の値の変換を行う。一方、COBOLコードの各データ項目には、各データ項目における宣言時のデータ型と異なるデータ型の値が格納されている場合がある。以下、データ項目に宣言時のデータ型と異なるデータ型の値が格納されている場合について説明を行う。
図9は、COBOLによるソースコードの具体例である。また、図10及び図11は、図9に示すソースコードにおける「CALL “FUNC” USING P1.」のそれぞれに対応する処理が実行された場合を説明する図である。
図9に示すソースコードにおいて、「01 P1 PIC X(4) VALUE “ABCD”.」は、COBOLコードの実行時に、データ型が英数字項目型であって、領域データ長が4(バイト)(英数字4文字)であるデータ項目「P1」を定義することを示す記述である。そして、この記述は、初期値としてデータ項目「P1」に「ABCD」が格納されることを示している。また、図9に示すソースコードにおいて、「01 P1 PIC S9(9) VALUE 10.」は、COBOLコードの実行時に、データ型が符号ありの数値項目型であって、「−999999999」から「999999999」までの4(バイト)の符号ありの整数(9桁)であるデータ項目「P2」を定義することを示す記述である。そして、この記述は、初期値としてデータ項目「P2」に「10」が格納されることを示している。
さらに、図9に示すソースコードにおいて、1つ目の「CALL “FUNC” USING P1.」は、データ項目「P1」の値(「ABCD」)を引数として、関数「FUNC」の呼出しを行う関数を示す記述である。そして、図9に示すソースコードにおいて、「MOVE P2 TO P1.」は、COBOLコードの実行時に、データ項目「P1」にデータ項目「P2」の値(「10」)を格納する関数を示す記述である。また、図9に示すソースコードにおいて、2つ目の「CALL “FUNC” USING P1.」は、データ項目「P1」の値(「10」)を引数として、関数「FUNC」の呼出しを行う関数を示す記述である。
次に、図10及び図11を参照し、図9に示すソースコードにおける「CALL “FUNC” USING P1.」のそれぞれに対応する処理が実行された場合について説明を行う。
図10に示すように、ランタイムライブラリは、データ項目「P1」の宣言時のデータ型(英数字項目型)に基づき、データ項目「P1」に設定された値の変換を行う。すなわち、ランタイムライブラリは、この場合、データ項目「P1」に現在格納されている値の実データ型を参照することなく、データ項目「P1」の値の変換を行う。そのため、ランタイムライブラリは、「CALL “FUNC” USING P1.」に対応する処理を実行する際に、データ項目「P1」の宣言時のデータ型(英数字項目型)に対応する関数「FUNC(String A1)」を常に呼び出すことになる。したがって、図10に示すように、例えば、非COBOLコードが関数「FUNC(int A1)」を含んでいる場合であっても、ランタイムライブラリは、関数「FUNC(String A1)」以外の関数の呼出しを行わない。すなわち、情報処理装置1は、この場合、各データ項目に格納できる値の制約が厳密でないというCOBOLの特性を利用することができない。
これに対し、COBOLによるソースコードの開発者(以下、単に開発者とも呼ぶ)は、図11に示すように、同一の関数であっても、実行時におけるデータ項目「P1」の値のデータ型毎に、それぞれ異なる変換関数を用意する場合がある。
この場合、開発者は、図11に示すように、図9に示すソースコードに含まれる記述のうち、1つ目の「CALL “FUNC” USING P1.」を「CALL “FUNC1” USING P1.」に変更する。また、開発者は、図11に示すように、図9に示すソースコードに含まれる記述のうち、2つ目の「CALL “FUNC” USING P1.」を「CALL “FUNC2” USING P1.」に変更する。
さらに、開発者は、「CALL “FUNC1” USING P1.」に対応するランタイムライブラリとして、関数「FUNC(String A1)」を呼び出すランタイム関数(A)(文字型データ変換関数)を用意する。また、開発者は、「CALL “FUNC2” USING P1.」に対応するランタイムライブラリとして、「FUNC(int A1)」を呼び出すランタイム関数(B)(数値項目データ変換関数)を用意する。
そして、開発者は、「CALL “FUNC1” USING P1.」から引き渡されたデータ項目「P1」の値をランタイムライブラリ(A)が変換するように設定を行う。また、開発者は、「CALL “FUNC2” USING P1.」から引き渡されたデータ項目「P1」値をランタイムライブラリ(B)に変換させるように設定を行う。これにより、COBOLコードは、COBOLコードに含まれる各関数が実行される際に、データ項目「P1」の値の実データ型に基づいて非COBOLに含まれる関数を呼び出すことが可能になる。
しかしながら、図11に示す例の場合、非COBOLコード(非COBOLによるソースコード)の変更が行わる毎に、変更部分に対応するランタイムライブラリ及びCOBOLコード(COBOLによるソースコード)の変更を行う必要がある。そのため、この場合、非COBOLコードの変更に伴う開発者の負担が増大する。
そこで、本実施の形態における情報処理装置1は、COBOLによるソースコード(以下、第1ソースコードとも呼ぶ)のコンパイル時において、第1ソースコードに含まれるデータ項目(以下、第1変数とも呼ぶ)のデータ型の情報を格納する領域を確保する。そして、情報処理装置1は、第1ソースコードから生成されるCOBOLコード(以下、第1オブジェクトとも呼ぶ)の実行時において、第1変数の値の更新が行われた場合、更新された第1変数の値とともに、更新された第1変数のデータ型(実データ型)の情報を格納する。すなわち、情報処理装置1は、第1ソースコードのコンパイルを行う際に、第1変数の値だけでなく、第1変数のデータ型の情報が格納するための領域の確保を行う。
これにより、情報処理装置1は、第1オブジェクトが、非COBOLによるソースコード(以下、第2ソースコードとも呼ぶ)から生成された非COBOLコード(以下、第2オブジェクトとも呼ぶ)に含まれる関数を呼び出す際に、第1変数の実データ型の情報を取得することが可能になる。そのため、情報処理装置1は、取得した第1変数の実データ型の情報に基づき、第2オブジェクトに含まれる関数を実行する際の引数である第1変数を、第2オブジェクトが認識可能な形式に変換することが可能になる。すなわち、開発者は、第1オブジェクトから引き渡される第1変数の値を第2オブジェクトが認識できる形式に変換するために、第1変数の値のデータ型にそれぞれ対応する複数のランタイムライブラリを用意する必要がなくなる。
また、情報処理装置1は、第1変数の値と第1変数のデータ型の情報とを格納するための領域を、例えば、情報処理装置1のメモリに確保する。これにより、外部プログラム(ランタイムプログラムや第2オブジェクト)は、情報処理装置1のメモリを参照することにより、第1変数の値及び第1変数のデータ型の情報を取得することが可能になる。
[情報処理装置のハードウエア構成]
次に、情報処理装置1のハードウエア構成を説明する。図12は、情報処理装置1のハードウエア構成を説明する図である。
次に、情報処理装置1のハードウエア構成を説明する。図12は、情報処理装置1のハードウエア構成を説明する図である。
情報処理装置1は、プロセッサであるCPU101と、メモリ102と、外部インターフェース(I/Oユニット)103と、記憶媒体(ストレージ)104とを有する。各部は、バス105を介して互いに接続される。
記憶媒体104は、記憶媒体104内のプログラム格納領域130(以下、記憶部130またはPG格納領域130とも呼ぶ)に、例えば、COBOLによるソースコードのコンパイルを行う処理(以下、コンパイル処理とも呼ぶ)を行うためのプログラム110(以下、コンパイラ110とも呼ぶ)を記憶する。
また、プログラム格納領域130には、例えば、上記の第1ソースコード、第2ソースコード、第1オブジェクト及び第2オブジェクトが記憶される。なお、図1等で説明した記憶装置2は、例えば、プログラム格納領域130に対応するものであってよい。
CPU101は、図12に示すように、プログラム110の実行時に、プログラム110を記憶媒体104からメモリ102にロードし、プログラム110と協働してコンパイル処理を行う。
また、外部インターフェース103は、ネットワークNWを介して、管理者端末11と通信を行う。
[情報処理装置のソフトウエア構成]
次に、情報処理装置1のソフトウエア構成を説明する。図13は、図12の情報処理装置1の機能ブロック図である。CPU101は、プログラム110と協働することにより、コンパイル実行部111(以下、領域確保部111とも呼ぶ)と、オブジェクト実行部112として動作する。また、CPU101は、プログラム110と協働することにより、パラメタ変換部113(以下、ランタイムライブラリ113とも呼ぶ)として動作する。
次に、情報処理装置1のソフトウエア構成を説明する。図13は、図12の情報処理装置1の機能ブロック図である。CPU101は、プログラム110と協働することにより、コンパイル実行部111(以下、領域確保部111とも呼ぶ)と、オブジェクト実行部112として動作する。また、CPU101は、プログラム110と協働することにより、パラメタ変換部113(以下、ランタイムライブラリ113とも呼ぶ)として動作する。
コンパイル実行部111は、例えば、プログラム格納領域130に記憶された第1ソースコード及び第2ソースコードに対してコンパイル処理を行い、それぞれ第1オブジェクト及び第2オブジェクトを生成する。具体的に、コンパイル実行部111は、管理者が管理者端末11を介してコンパイル処理を実行する旨の入力を行った際に、第1ソースコードまたは第2ソースコードに対するコンパイル処理を実行するものであってよい。そして、コンパイル実行部111は、例えば、生成した第1オブジェクト及び第2オブジェクトをプログラム格納領域130に記憶する。
また、コンパイル実行部111は、コンパイル処理を実行する際に、第1ソースコードに含まれる第1変数を格納する変数格納領域102aをメモリ102内に確保する。また、コンパイル実行部111は、コンパイル処理を実行する際に、変数格納領域102aと対応付けて、第1変数の実データ型を格納する情報格納領域102b(以下、第1情報格納領域102bとも呼ぶ)を情報処理装置1のメモリ102内に確保する。さらに、コンパイル実行部111は、コンパイル処理を実行する際に、変数格納領域102aと対応付けて、第2変数のデータ型を格納する情報格納領域102c(以下、第2情報格納領域102cとも呼ぶ)を情報処理装置1のメモリ102内に確保する。なお、変数格納領域102a、第1情報格納領域102b及び第2情報格納領域102cの具体例については後述する。
第1変数のデータ型とは、第1変数の値に対応するデータ型(例えば、英数字項目型)である。なお、第1変数に値が格納されていない場合、第1変数のデータは、第1変数の宣言時におけるデータ型である。また、第1変数の有効データ長とは、第1変数の領域データ長のうち、空白以外の情報が格納されているデータ長である。第1変数のデータ型及び第1変数の有効データ長は、第1オブジェクトの実行の際の第1変数の更新に応じて更新される。また、第1変数のデータ型及び第1変数の有効データ長は、第1変数の値とともに、外部プログラム(例えば、第2オブジェクトや後述するパラメタ変換部113)によって取得される。変数格納領域102a、第1情報格納領域102b及び第2情報格納領域102cの具体例については後述する。
オブジェクト実行部112は、プログラム格納領域130に記憶された第1オブジェクト及び第2オブジェクトを実行する。具体的に、オブジェクト実行部112は、例えば、管理者が管理者端末11を介して第1オブジェクトまたは第2オブジェクトを実行する旨の入力を行った際に、第1オブジェクトまたは第2オブジェクトを実行するものであってよい。なお、以下、オブジェクト実行部112が第1オブジェクト及び第2オブジェクトを実行する処理を、オブジェクト実行処理とも呼ぶ。
パラメタ変換部113は、第1オブジェクトが第2オブジェクト(第2オブジェクトに含まれる関数)の実行を要求した場合に、第1変数のデータ型の情報を参照し、第1変数を第2オブジェクトが認識できる形式に変換する。具体的に、パラメタ変換部113は、例えば、第1変数の値をASCIIからUnicodeに変換することにより、第1変数を第2オブジェクトが認識できる形式に変換する。
また、パラメタ変換部113は、第1オブジェクトが第2オブジェクトに対して実行を要求した処理の実行結果(変更された引数や戻り値)を、第1オブジェクトが認識できる形式に変換する。
[第1の実施の形態]
次に、第1の実施の形態の概略を説明する。図14は、第1の実施の形態におけるコンパイル処理の概略を説明するフローチャート図である。
次に、第1の実施の形態の概略を説明する。図14は、第1の実施の形態におけるコンパイル処理の概略を説明するフローチャート図である。
情報処理装置1のコンパイル実行部111は、コンパイル処理が開始された場合、第1ソースコードに含まれる第1変数を格納する変数格納領域102aを確保する(S2)。そして、コンパイル実行部111は、S2で確保した変数格納領域102aに対応付けて、第1変数のデータ型を格納する第1情報格納領域102bを確保する(S3)。具体的に、コンパイル実行部111は、外部プログラムから参照可能な領域(例えば、情報処理装置1のメモリ102内)において変数格納領域102a及び第1情報格納領域102bの確保を行う。その後、コンパイル実行部111は、第1ソースコードから第1オブジェクトを生成する(S4)。
これにより、情報処理装置1のオブジェクト実行部112は、後述するように、第1変数の値を更新する際に、更新後の第1変数の値とともに、更新後の第1変数の値のデータ型の情報を、情報処理装置1のメモリ102内等において保持することが可能になる。そのため、第1オブジェクトが第1変数を引数にして第2オブジェクトに含まれる関数を呼び出す場合、情報処理装置1のパラメタ変換部113は、第1変数の値のデータ型の情報を参照することで、第1変数の値を変換することが可能になる。
したがって、開発者は、第1オブジェクトから引き渡される第1変数の値を第2オブジェクトが認識できる形式に変換するために、第1変数の値のデータ型にそれぞれ対応する複数のランタイムライブラリを用意する必要がなくなる。
また、開発者は、第2オブジェクトに含まれる関数の種類や数に対応したパラメタ変換部113を用意する必要がなくなる。そのため、開発者は、第2オブジェクトに含まれる関数の変更の変更があった場合に、パラメタ変換部113や第1ソースコードの変更を行う必要がなくなる。
なお、開発者は、第1オブジェクトから引き渡される可能性がある第1変数の値の各データ型を、第2オブジェクトが認識できる形式のデータ型にそれぞれ変換することが可能なランタイムライブラリ(以下、汎用ランタイムライブラリとも呼ぶ)を用意するものであってもよい。すなわち、汎用ランタイムライブラリは、第1オブジェクトから第1変数の値を引き渡された場合に、その第1変数の値のデータ型の情報を取得する。そして、汎用ランタイムライブラリは、取得したデータ型の情報に基づき、第1オブジェクトから引き渡された第1変数の値を第2オブジェクトが認識できる形式のデータ型に変換する。これにより、開発者は、第1オブジェクトに含まれる関数毎にランタイムライブラリを用意することなく、第1オブジェクトから引き渡された第1変数の値の変換を行うことが可能になる。
[第1の実施の詳細の形態]
次に、第1の実施の形態の詳細を説明する。図15は、第1の実施の形態におけるコンパイル処理の詳細を説明するフローチャート図である。図16から図18は、第1の実施の形態におけるオブジェクト実行処理を説明するフローチャート図である。図19から図27は、第1の実施の形態におけるコンパイル処理の詳細及びオブジェクト実行処理を説明する図である。図19から図27を参照しながら、図15から図18のコンパイル処理及びオブジェクト実行処理について説明を行う。
次に、第1の実施の形態の詳細を説明する。図15は、第1の実施の形態におけるコンパイル処理の詳細を説明するフローチャート図である。図16から図18は、第1の実施の形態におけるオブジェクト実行処理を説明するフローチャート図である。図19から図27は、第1の実施の形態におけるコンパイル処理の詳細及びオブジェクト実行処理を説明する図である。図19から図27を参照しながら、図15から図18のコンパイル処理及びオブジェクト実行処理について説明を行う。
[コンパイル処理の詳細]
初めに、第1の実施の形態におけるコンパイル処理の詳細について説明を行う。
初めに、第1の実施の形態におけるコンパイル処理の詳細について説明を行う。
コンパイル実行部111は、図15に示すように、第1ソースコードに含まれる第1変数を格納する変数格納領域102aを確保する(S11)。そして、コンパイル実行部111は、S11で確保した変数格納領域102aに対応付けて、第1変数のデータ型を格納する第1情報格納領域102bを確保する(S12)。
次に、コンパイル実行部111は、S11で確保した変数格納領域102aに対応付けて、第1変数の有効データ長を格納する第2情報格納領域102cを確保する(S13)。
すなわち、第1変数の宣言時のデータ型が固定長の文字列型(英数字項目型)である場合において、第1変数の値が領域データ長に満たない場合、COBOLコード(第1オブジェクト)は、その実行の際に、第1変数の値の末尾に対応する領域に空白を示す情報を格納する処理を行う。そして、パラメタ変換部113は、第1オブジェクトから第1変数の値を引き渡された場合、第1変数の値の末尾に対応する領域の空白を示す情報を排除する処理を行ってから、第1オブジェクトから引き渡された第1変数の値を変換する。
ここで、パラメタ変換部113は、第1オブジェクトから引き渡された第1変数の値を変換する際に、空白を示す情報が格納された領域(排除すべき情報が格納された領域)を特定する必要がある。しかしながら、第1変数の領域データ長が大きい場合、パラメタ変換部113は、空白を示す情報が格納された領域を特定するために処理負担が増大する。
そこで、実施の形態におけるコンパイル実行部111は、第1オブジェクトのコンパイルを実行する際に、第1変数の有効データ長の情報を格納する第2情報格納領域102cを確保する(S12)。そして、オブジェクト実行部112は、後述するように、第1変数の値とともに、第1変数の有効データ長の情報を保持する。
これにより、パラメタ変換部113は、第1オブジェクトから引き渡された第1変数の値を変換する際に、第1変数の有効データ長の情報を取得することが可能になる。そのため、パラメタ変換部113は、取得した有効データ長に基づいて、空白を示す情報が格納された領域の特定を行うことが可能になる。したがって、パラメタ変換部113は、第1オブジェクトから引き渡された第1変数の値を変換する際の処理負担の増大を防止することが可能になる。
その後、コンパイル実行部111は、第1ソースコードから第1オブジェクトを生成する(S14)。以下、S11及びS12の具体例について説明を行う。
[S11及びS12の具体例]
初めに、図19に示すソースコードについて説明を行う。図19は、COBOLによるソースコードの具体例である。
初めに、図19に示すソースコードについて説明を行う。図19は、COBOLによるソースコードの具体例である。
図19に示すソースコードにおいて、「01 P1 PIC X(4).」は、図19に示すソースコードから生成されたCOBOLコードの実行時に、データ型が英数字項目型であって、領域データ長が4(バイト)(英数字4文字)であるデータ項目「P1」を定義することを示す記述である。また、図19に示すソースコードにおいて、「01 R1 PIC S9(9) COMP−5.」は、COBOLコードの実行時に、データ型が符号ありの数値項目型であって、「−999999999」から「999999999」までの4(バイト)の符号ありの整数(9桁)であるデータ項目「R1」を定義することを示す記述である。
さらに、図19に示すソースコードにおいて、「MOVE “ABCD” TO P1.」は、COBOLコードの実行時に、データ項目「P1」に「ABCD」を格納する関数を示す記述である。また、図19に示すソースコードにおいて、「MOVE “EFG” TO P1.」は、COBOLコードの実行時に、データ項目「P1」に「EFG」を格納する関数を示す記述である。
そして、図19に示すソースコードにおける「CALL “FUNC” USING P1 RETURNING R1.」は、COBOLコードの実行時に、データ項目「P1」の値(「EFG」)を引数として関数「FUNC」を呼出し、その戻り値をデータ項目「R1」に格納する関数を示す記述である。
次に、図19に示すソースコードがコンパイルされる際のメモリの状態の推移を説明する。図20及び図21は、図19に示すソースコードがコンパイルされた場合を説明する図である。
図19に示すソースコードのコンパイルをする場合、コンパイル実行部111は、「01 P1 PIC X(4).」の記述を参照し、データ項目「P1」の領域として、4(バイト)の領域を確保する。
具体的に、コンパイル実行部111は、例えば、図20に示すように、情報処理装置1のメモリのうちのアドレスが「2100」である領域から「2103」である領域までを、データ項目「P1」の領域(変数格納領域102a)として確保する。
そして、コンパイル実行部111は、例えば、図21に示すように、情報処理装置1のメモリのうちのアドレスが「2000」である領域を、データ項目「P1」の値のデータ型の情報を格納するための領域(第1情報格納領域102b)として確保する。また、コンパイル実行部111は、図21に示すように、情報処理装置1のメモリのうちのアドレスが「2001」である領域を、データ項目「P1」の値の有効データ長の情報を格納するための領域(第2情報格納領域102c)として確保する。さらに、コンパイル実行部111は、例えば、図21に示すように、情報処理装置1のメモリ102のうちのアドレスが「2002」である領域を、データ項目「P1」の値が格納された領域の先頭アドレスを格納するための領域として確保する。
これにより、オブジェクト実行部112は、後述するように、第1オブジェクトを実行する際に、第1変数の値とともに、第1変数の実データ型及び第1変数の値の有効データ長を保持することが可能になる。
[オブジェクト実行処理]
次に、第1の実施の形態におけるオブジェクト実行処理について説明を行う。
次に、第1の実施の形態におけるオブジェクト実行処理について説明を行う。
オブジェクト実行部112は、図16に示すように、第1オブジェクトに含まれる命令を取得する(S21)。そして、オブジェクト実行部112は、S21で取得した命令が第1変数に新たな値を格納する命令であるか否かを判定する(S22)。
その結果、S21で取得した命令が第1変数に新たな値を格納する命令である場合(S22のYES)、オブジェクト実行部112は、図17に示すように、新たな値を変数格納領域102aに格納する(S31)。さらに、オブジェクト実行部112は、更新された第1変数の値に対応するデータ型の情報及び有効データ長の情報をそれぞれ第1情報格納領域102b及び第2情報格納領域102cに格納する(S32)。以下、S31及びS32の具体例について説明を行う。
[S31及びS32の具体例]
図22は、図19に示すソースコードにおける「MOVE “ABCD” TO P1.」に対応する処理が実行された場合を説明する図である。また、図23は、図19に示すソースコードにおける「MOVE “EFG” TO P1.」に対応する処理が実行された場合を説明する図である。さらに、図24から図27は、図19に示すソースコードにおける「CALL “FUNC” USING P1 RETURNING R1.」に対応する処理が実行された場合を説明する図である。
図22は、図19に示すソースコードにおける「MOVE “ABCD” TO P1.」に対応する処理が実行された場合を説明する図である。また、図23は、図19に示すソースコードにおける「MOVE “EFG” TO P1.」に対応する処理が実行された場合を説明する図である。さらに、図24から図27は、図19に示すソースコードにおける「CALL “FUNC” USING P1 RETURNING R1.」に対応する処理が実行された場合を説明する図である。
図19に示すソースコードにおける「MOVE “ABCD” TO P1.」に対応する処理が実行する場合、オブジェクト実行部112は、図22に示すように、情報処理装置1のメモリ102のうちのアドレスが「2100」から「2103」である領域に、「ABCD」を示す情報を格納する(S31)。
また、オブジェクト実行部112は、図22に示すように、情報処理装置1のメモリ102内のアドレスが「2000」である領域に、「ABCD」のデータ型である英数字項目型を示す情報(図22の例においては「1」)を格納する(S32)。さらに、オブジェクト実行部112は、図22に示すように、情報処理装置1のメモリ102内のアドレスが「2001」である領域に、「ABCD」の有効データ長を示す「4」を格納する(S32)。なお、オブジェクト実行部112は、例えば、各データ型の名称と各データ型を示す情報とを対応させた情報(英英数字項目型が「1」と対応する旨の情報や数値項目型が「2」と対応する旨の情報等を含む情報)を参照することにより、メモリ102内のアドレスが「2000」である領域に格納すべき情報を決定するものであってよい。
これにより、オブジェクト実行部112は、データ項目「P1」の値と対応付ける形で、データ項目「P1」の値のデータ型及び有効データ長の情報を保持することが可能になる。
次に、図23を参照して、図19に示すソースコードにおける「MOVE “EFG” TO P1.」に対応する処理が実行された後の状態について説明を行う。図19に示すソースコードにおける「MOVE “EFG” TO P1.」に対応する処理が実行する場合、オブジェクト実行部112は、図23に示すように、情報処理装置1のメモリ102のうちのアドレスが「2100」から「2102」である領域に、「EFG」を示す情報を格納する(S31)。また、この場合、データ項目「P1」の値の有効データ長が「3」であり、データ項目「P1」の値の領域データ長である「4」より短い。そのため、オブジェクト実行部112は、図23に示すように、アドレスが「2013」である領域に、空白を示す情報を格納する。
そして、オブジェクト実行部112は、図23に示すように、情報処理装置1のメモリ102内のアドレスが「2000」である領域に、「ABCD」のデータ型である英数字項目型を示す「1」を格納する(S32)。さらに、オブジェクト実行部112は、図23に示すように、情報処理装置1のメモリ102内のアドレスが「2001」である領域に、「EFG」の有効データ長を示す「3」を格納する(S32)。
これにより、オブジェクト実行部112は、データ項目「P1」の値が更新された場合であっても、更新されたデータ項目「P1」の値のデータ型及び有効データ長の情報を保持することが可能になる。
図16に戻り、オブジェクト実行部112は、図17のS31及びS32の処理を実行した後、第1オブジェクトに含まれる全ての命令を実行したか否かを判定する(S25)。そして、第1オブジェクトに含まれる全ての命令の実行が完了した場合(S25のYES)、オブジェクト実行部112は、オブジェクト実行処理を終了する。一方、第1オブジェクトに含まれる全ての命令の実行が完了していない場合(S25のNO)、オブジェクト実行部112は、S21以降の処理を繰り返し実行する。
また、S21で取得した命令が第1変数に新たな値を格納する命令でない場合(S22のNO)、オブジェクト実行部112は、S21で取得した命令が第1変数の値を引数として第2オブジェクトを実行する命令であるか否かの判定を行う(S23)。
その結果、S21で取得した命令が第1変数を引数として第2オブジェクトを実行する命令である場合(S23のYES)、パラメタ変換部113は、図18に示すように、第1変数の有効データ長の情報を参照する(S41)。そして、パラメタ変換部113は、第1変数の値のうちの有効データ長に対応する値のみを取得する(S41)。
すなわち、パラメタ変換部113は、第1オブジェクトから引数として第1変数の値を引き渡された場合、図24に示すように、情報処理装置1のメモリ102を参照することにより、第1変数の値の有効データ長を取得することが可能になる(図24の(1))。そのため、パラメタ変換部113は、第1オブジェクトから引き渡された第1変数の値のうち、有効データ長に対応する値を特定する処理を迅速に行うことが可能になる。
また、パラメタ変換部113は、第1変数のデータ型の情報を参照して、S41で取得した値を第2オブジェクトが認識できる形式に変換する(S42)。
すなわち、パラメタ変換部113は、第1オブジェクトから引数として第1変数の値を引き渡された場合、図24に示すように、情報処理装置1のメモリ102を参照することにより、第1変数の値のデータ型を取得することが可能になる(図24の(1))。そのため、開発者は、図5で説明したように、第1オブジェクトから引き渡される可能性がある値のそれぞれに対応するために、複数のパラメタ変換部113を用意しておく必要がなくなる。以下、S42の処理が実行された場合における情報処理装置1のメモリ102の状態について説明を行う。
[S42の処理が実行された場合のメモリ102の状態]
図25は、図19に示すソースコードにおける「CALL “FUNC” USING P1 RETURNING R1.」に対応する処理が実行された場合を説明する図である。図24及び図25に示すように、データ項目「P1」の値を第2オブジェクトが認識できる形式に変換した場合、パラメタ変換部113は、変換した値を情報処理装置1のメモリ102内に格納する(図24の(2))。
図25は、図19に示すソースコードにおける「CALL “FUNC” USING P1 RETURNING R1.」に対応する処理が実行された場合を説明する図である。図24及び図25に示すように、データ項目「P1」の値を第2オブジェクトが認識できる形式に変換した場合、パラメタ変換部113は、変換した値を情報処理装置1のメモリ102内に格納する(図24の(2))。
具体的に、パラメタ変換部113は、この場合、図25に示すように、データ項目「P1」の値である「EFG」の文字コードをASCIIからUnicodeに変換する。そして、パラメタ変換部113は、図25に示すように、Unicodeに変換した値を、情報処理装置1のメモリ102のうちの先頭アドレスが「2500」である領域に格納を行う。これにより、パラメタ変換部113は、データ項目「P1」の値を第2オブジェクトが認識できる形式に変換することが可能になる。
図18に戻り、パラメタ変換部113は、S42で変換した値を引数として第2オブジェクトに引き渡し、第2オブジェクトに含まれる関数の呼出しを行う(S43、図24の(3))。なお、図25に示す例において、第2オブジェクトが、情報処理装置1のメモリ102内における先頭アドレスが「2500」である領域を参照し、第1オブジェクトが呼び出した関数を実行するための引数(「EFG」)を取得するものであってよい。
その後、パラメタ変換部113は、第2オブジェクトから、第1オブジェクトが呼び出した関数の実行結果(変更された引数及び戻り値)が引き渡されるまで待機する(S44のNO)。そして、第2オブジェクトから変更された引数及び戻り値が引き渡された場合(S44のYES)、パラメタ変換部113は、S44で取得した引数の値を第1オブジェクトが認識できる形式に変換し、変数格納領域102aに格納する(S45、図24の(4))。
また、パラメタ変換部113は、この場合、S44で取得した引数の値の有効データ長を、S45で変換後の引数の値を格納した変数格納領域102aに対応する第2変更格納領域に格納する(S46、図24の(5))。これにより、パラメタ変換部113は、第1オブジェクトが第2オブジェクトに含まれる関数に実行を要求することにより、引数の値が変更された場合であっても、変更後の引数の値に対応する有効データ長を第2情報格納領域102cに格納することが可能になる。
さらに、パラメタ変換部113は、S44で取得した戻り値を第1オブジェクトが認識できる形式に変換し、変数格納領域102aに格納する(S47、図24の(6))。また、パラメタ変換部113は、この場合、S44で取得した戻り値の有効データ長を、S47で変換後の戻り値を格納した変数格納領域102aに対応する第2変更格納領域に格納する(S48、図24の(7))。これにより、パラメタ変換部113は、第1オブジェクトが第2オブジェクトに含まれる関数に実行を要求した場合に、第2オブジェクトに含まれる関数の戻り値に対応する有効データ長を第2情報格納領域102cに格納することが可能になる。以下、S45及びS46の処理が実行された場合における情報処理装置1のメモリ102の状態について説明を行う。
[S45及びS46の処理が実行された場合のメモリ102の状態]
図26は、図19に示すソースコードにおける「CALL “FUNC” USING P1 RETURNING R1.」に対応する処理が実行された後、第2オブジェクトに含まれる関数から変更された引数及び戻り値が引き渡された後の情報処理装置1のメモリ102の状態を説明する図である。なお、以下、第2オブジェクトから引き渡された変更された引数についての説明を行い、第2オブジェクトから引き渡された戻り値についての説明は省略する。
図26は、図19に示すソースコードにおける「CALL “FUNC” USING P1 RETURNING R1.」に対応する処理が実行された後、第2オブジェクトに含まれる関数から変更された引数及び戻り値が引き渡された後の情報処理装置1のメモリ102の状態を説明する図である。なお、以下、第2オブジェクトから引き渡された変更された引数についての説明を行い、第2オブジェクトから引き渡された戻り値についての説明は省略する。
具体的に、第2オブジェクトは、例えば、図26に示すように、第1オブジェクトが呼び出した関数によって変更された引数である「HI」を、情報処理装置1のメモリ102のうちの先頭アドレスが「2500」である領域に格納を行う。なお、この場合、アドレスが「2500」から「2503」である領域に「HI」を示す情報が格納され、アドレスが「2504」及び「2505」である領域には、「NULL(¥0)」を示す情報が格納される。そのため、図26に示す例において、アドレスが「2506」及び「2507」である領域には、新たな情報が格納されない。したがって、図26に示すアドレスが「2506」及び「2507」である領域には、図25で格納された情報である「NULL(¥0)」がそのまま格納されている。
次に、図19に示すソースコードにおける「CALL “FUNC” USING P1 RETURNING R1.」に対応する処理が実行された後、パラメタ変換部113が第2オブジェクトから引き渡された引数を第1オブジェクトが認識できる形式に変換した場合を説明する。図27は、図19に示すソースコードにおける「CALL “FUNC” USING P1 RETURNING R1.」に対応する処理が実行された後、パラメタ変換部113が第2オブジェクトからの引数を第1オブジェクトが認識できる形式に変換した場合を説明する図である。
具体的に、パラメタ変換部113は、この場合、図27に示すように、先頭アドレスが「2500」である領域に格納された「HI」の文字コードをUnicodeからASCIIに変換する。そして、パラメタ変換部113は、図27に示すように、ASCIIに変換した値を、情報処理装置1のメモリ102のうちの先頭アドレスが「2100」である領域に格納を行う。これにより、パラメタ変換部113は、第2オブジェクトから引き渡された引数及び戻り値を第1オブジェクトが認識できる形式に変換することが可能になる。
なお、データ項目「P1」の領域(先頭アドレスが「2100」である領域)に格納された値(「HI」)の有効データ長は、「2」である。そのため、パラメタ変換部113は、例えば、第1オブジェクトコードからデータ項目「P1」の領域データ長が「4」である旨の情報を取得し、先頭アドレスが「2100」である領域に格納された値の末尾の領域に、空白を示す情報を付加する。具体的に、パラメタ変換部113は、図27に示すように、アドレスが「2102」及び「2103」である領域に空白を示す情報を付加する。
さらに、パラメタ変換部113は、この場合、図27に示すように、アドレスが「2001」である領域に、データ項目「P1」に格納された値(「HI」)の有効データ長である「2」を示す情報を格納する。これにより、パラメタ変換部113は、第1オブジェクトが第2オブジェクトに含まれる関数に実行を要求することによって引数の値が変更された場合であっても、変更された引数及び戻り値に対応する有効データ長を保持することが可能になる。
図16に戻り、S23の処理において、S21で取得した命令が第1変数を引数として第2オブジェクトを実行する命令でない場合(S23のNO)、オブジェクト実行部112は、S21で取得した命令を実行する(S24)。
このように、情報処理装置1は、第1ソースコードに含まれる第1変数を格納する変数格納領域102aに対応付けて、第1変数のデータ型の情報を格納する第1情報格納領域102bを確保する。そして、第1情報格納領域102bに格納された第1変数のデータ型の情報は、第1ソースコードから生成された第1オブジェクトの実行の際の第1変数の更新に応じて更新され、かつ、変数格納領域102aの第1変数とともに外部プログラムにより取得される。
これにより、開発者は、第1オブジェクトから引き渡される第1変数の値を第2オブジェクトが認識できる形式に変換するために、第1変数の値のデータ型にそれぞれ対応する複数のランタイムライブラリを用意する必要がなくなる。また、開発者は、第2オブジェクトに含まれる関数の変更の変更があった場合に、パラメタ変換部113や第1ソースコードの変更を行う必要がなくなる。
なお、上記の例において、コンパイル実行部111は、第1ソースコードのコンパイルを行う際に、第1変数の値を格納する変数格納領域102aとともに、第1変数の実データ型の情報及び有効データ長の情報を格納する情報格納領域の確保を行う場合について説明した。これに加え、コンパイル実行部111は、例えば、第1変数の領域データ長を格納するための情報格納領域の確保を行うものであってもよい。これにより、パラメタ変換部113は、例えば、第2オブジェクトから引き渡された引数の値及び戻り値を、第1オブジェクトが認識できる形式に変換する際に(図18のS45及びS47)、領域データ長の情報を迅速に取得することが可能になる。
また、コンパイル実行部111は、例えば、第1変数の宣言時のデータ型を格納するための情報格納領域の確保を行うものであってもよい。
以上の実施の形態をまとめると、以下の付記のとおりである。
(付記1)
コンピュータに、
第1ソースコードに含まれる第1変数を格納する変数格納領域に対応付けて、前記第1変数のデータ型を格納する第1情報格納領域を確保する、
処理を実行させ、
前記第1情報格納領域に格納された前記データ型は、前記第1ソースコードから生成された第1オブジェクトの実行の際の前記第1変数の更新に応じて更新され、かつ、前記変数格納領域に格納された前記第1変数とともに外部プログラムにより取得可能である、
ことを特徴とするコンパイラ。
コンピュータに、
第1ソースコードに含まれる第1変数を格納する変数格納領域に対応付けて、前記第1変数のデータ型を格納する第1情報格納領域を確保する、
処理を実行させ、
前記第1情報格納領域に格納された前記データ型は、前記第1ソースコードから生成された第1オブジェクトの実行の際の前記第1変数の更新に応じて更新され、かつ、前記変数格納領域に格納された前記第1変数とともに外部プログラムにより取得可能である、
ことを特徴とするコンパイラ。
(付記2)
付記1において、
前記第1情報格納領域は、前記変数格納領域のアドレスを特定する情報を格納する、
ことを特徴とするコンパイラ。
付記1において、
前記第1情報格納領域は、前記変数格納領域のアドレスを特定する情報を格納する、
ことを特徴とするコンパイラ。
(付記3)
付記1において、
前記確保では、前記第1変数のデータ型が固定長の文字列型である場合、前記変数格納領域に対応付けて、前記第1変数の有効データ長を格納する第2情報格納領域を確保し、
前記第2情報格納領域に格納された前記有効データ長は、前記第1オブジェクトの実行の際の前記第1変数の更新に応じて更新され、かつ、前記変数格納領域に格納された前記第1変数とともに外部プログラムにより取得される、
ことを特徴とするコンパイラ。
付記1において、
前記確保では、前記第1変数のデータ型が固定長の文字列型である場合、前記変数格納領域に対応付けて、前記第1変数の有効データ長を格納する第2情報格納領域を確保し、
前記第2情報格納領域に格納された前記有効データ長は、前記第1オブジェクトの実行の際の前記第1変数の更新に応じて更新され、かつ、前記変数格納領域に格納された前記第1変数とともに外部プログラムにより取得される、
ことを特徴とするコンパイラ。
(付記4)
付記3において、
前記第1オブジェクトは、前記第1変数を引数として、前記第1ソースコードが記述された言語とは異なる言語で記述された第2ソースコードから生成された第2オブジェクトを実行させる際に、前記第1変数の変換を行うランタイムライブラリに前記第1変数を引き渡し、
前記ランタイムライブラリは、前記第1変数の前記データ型を参照して、前記第1オブジェクトから引き渡された前記第1変数を、前記第2オブジェクトが認識できる形式に変換し、変換した前記第1変数を前記第2オブジェクトに引き渡す、
ことを特徴とするコンパイラ。
付記3において、
前記第1オブジェクトは、前記第1変数を引数として、前記第1ソースコードが記述された言語とは異なる言語で記述された第2ソースコードから生成された第2オブジェクトを実行させる際に、前記第1変数の変換を行うランタイムライブラリに前記第1変数を引き渡し、
前記ランタイムライブラリは、前記第1変数の前記データ型を参照して、前記第1オブジェクトから引き渡された前記第1変数を、前記第2オブジェクトが認識できる形式に変換し、変換した前記第1変数を前記第2オブジェクトに引き渡す、
ことを特徴とするコンパイラ。
(付記5)
付記4において、
前記ランタイムライブラリは、前記第1変数の前記有効データ長を参照し、前記第1変数のうちの前記有効データ長に対応するデータのみを、前記第2オブジェクトが認識できる形式に変換する、
ことを特徴とするコンパイラ。
付記4において、
前記ランタイムライブラリは、前記第1変数の前記有効データ長を参照し、前記第1変数のうちの前記有効データ長に対応するデータのみを、前記第2オブジェクトが認識できる形式に変換する、
ことを特徴とするコンパイラ。
(付記6)
付記1において、
前記第1ソースコードは、COBOLによって記述されたソースコードである、
ことを特徴とするコンパイラ。
付記1において、
前記第1ソースコードは、COBOLによって記述されたソースコードである、
ことを特徴とするコンパイラ。
(付記7)
付記1において、
前記第1変数の更新は、前記第1変数と異なる第2変数または定数が前記第1変数に転記されることによって行われる、
ことを特徴とするコンパイラ。
付記1において、
前記第1変数の更新は、前記第1変数と異なる第2変数または定数が前記第1変数に転記されることによって行われる、
ことを特徴とするコンパイラ。
(付記8)
第1ソースコードに含まれる第1変数を格納する変数格納領域に対応付けて、前記第1変数のデータ型を格納する第1情報格納領域を確保する領域確保部を有し、
前記第1情報格納領域に格納された前記データ型は、前記第1ソースコードから生成された第1オブジェクトの実行の際の前記第1変数の更新に応じて更新され、かつ、前記変数格納領域に格納された前記第1変数とともに外部プログラムにより取得可能である、
ことを特徴とするコンパイル装置。
第1ソースコードに含まれる第1変数を格納する変数格納領域に対応付けて、前記第1変数のデータ型を格納する第1情報格納領域を確保する領域確保部を有し、
前記第1情報格納領域に格納された前記データ型は、前記第1ソースコードから生成された第1オブジェクトの実行の際の前記第1変数の更新に応じて更新され、かつ、前記変数格納領域に格納された前記第1変数とともに外部プログラムにより取得可能である、
ことを特徴とするコンパイル装置。
(付記9)
付記8において、
前記領域確保部は、前記第1変数のデータ型が固定長の文字列型である場合、前記変数格納領域に対応付けて、前記第1変数の有効データ長を格納する第2情報格納領域を確保し、
前記第2情報格納領域に格納された前記有効データ長は、前記第1オブジェクトの実行の際の前記第1変数の更新に応じて更新され、かつ、前記変数格納領域に格納された前記第1変数とともに外部プログラムにより取得される、
ことを特徴とするコンパイル装置。
付記8において、
前記領域確保部は、前記第1変数のデータ型が固定長の文字列型である場合、前記変数格納領域に対応付けて、前記第1変数の有効データ長を格納する第2情報格納領域を確保し、
前記第2情報格納領域に格納された前記有効データ長は、前記第1オブジェクトの実行の際の前記第1変数の更新に応じて更新され、かつ、前記変数格納領域に格納された前記第1変数とともに外部プログラムにより取得される、
ことを特徴とするコンパイル装置。
(付記10)
第1ソースコードに含まれる第1変数を格納する変数格納領域に対応付けて、前記第1変数のデータ型を格納する第1情報格納領域を確保し、
前記第1情報格納領域に格納された前記データ型は、前記第1ソースコードから生成された第1オブジェクトの実行の際の前記第1変数の更新に応じて更新され、かつ、前記変数格納領域に格納された前記第1変数とともに外部プログラムにより取得可能である、
ことを特徴とするコンパイル方法。
第1ソースコードに含まれる第1変数を格納する変数格納領域に対応付けて、前記第1変数のデータ型を格納する第1情報格納領域を確保し、
前記第1情報格納領域に格納された前記データ型は、前記第1ソースコードから生成された第1オブジェクトの実行の際の前記第1変数の更新に応じて更新され、かつ、前記変数格納領域に格納された前記第1変数とともに外部プログラムにより取得可能である、
ことを特徴とするコンパイル方法。
(付記11)
付記10において、
前記確保では、前記第1変数のデータ型が固定長の文字列型である場合、前記変数格納領域に対応付けて、前記第1変数の有効データ長を格納する第2情報格納領域を確保し、
前記第2情報格納領域に格納された前記有効データ長は、前記第1オブジェクトの実行の際の前記第1変数の更新に応じて更新され、かつ、前記変数格納領域に格納された前記第1変数とともに外部プログラムにより取得される、
ことを特徴とするコンパイル方法。
付記10において、
前記確保では、前記第1変数のデータ型が固定長の文字列型である場合、前記変数格納領域に対応付けて、前記第1変数の有効データ長を格納する第2情報格納領域を確保し、
前記第2情報格納領域に格納された前記有効データ長は、前記第1オブジェクトの実行の際の前記第1変数の更新に応じて更新され、かつ、前記変数格納領域に格納された前記第1変数とともに外部プログラムにより取得される、
ことを特徴とするコンパイル方法。
1:情報処理装置 2:記憶装置
2a:ソースコード 2b:オブジェクトコード
11:管理者端末
2a:ソースコード 2b:オブジェクトコード
11:管理者端末
Claims (7)
- コンピュータに、
第1ソースコードに含まれる第1変数を格納する変数格納領域に対応付けて、前記第1変数のデータ型を格納する第1情報格納領域を確保する、
処理を実行させ、
前記第1情報格納領域に格納された前記データ型は、前記第1ソースコードから生成された第1オブジェクトの実行の際の前記第1変数の更新に応じて更新され、かつ、前記変数格納領域に格納された前記第1変数とともに外部プログラムにより取得可能である、
ことを特徴とするコンパイラ。 - 請求項1において、
前記第1情報格納領域は、前記変数格納領域のアドレスを特定する情報を格納する、
ことを特徴とするコンパイラ。 - 請求項1において、
前記確保では、前記第1変数のデータ型が固定長の文字列型である場合、前記変数格納領域に対応付けて、前記第1変数の有効データ長を格納する第2情報格納領域を確保し、
前記第2情報格納領域に格納された前記有効データ長は、前記第1オブジェクトの実行の際の前記第1変数の更新に応じて更新され、かつ、前記変数格納領域に格納された前記第1変数とともに外部プログラムにより取得される、
ことを特徴とするコンパイラ。 - 請求項3において、
前記第1オブジェクトは、前記第1変数を引数として、前記第1ソースコードが記述された言語とは異なる言語で記述された第2ソースコードから生成された第2オブジェクトを実行させる際に、前記第1変数の変換を行うランタイムライブラリに前記第1変数を引き渡し、
前記ランタイムライブラリは、前記第1変数の前記データ型を参照して、前記第1オブジェクトから引き渡された前記第1変数を、前記第2オブジェクトが認識できる形式に変換し、変換した前記第1変数を前記第2オブジェクトに引き渡す、
ことを特徴とするコンパイラ。 - 請求項4において、
前記ランタイムライブラリは、前記第1変数の前記有効データ長を参照し、前記第1変数のうちの前記有効データ長に対応するデータのみを、前記第2オブジェクトが認識できる形式に変換する、
ことを特徴とするコンパイラ。 - 第1ソースコードに含まれる第1変数を格納する変数格納領域に対応付けて、前記第1変数のデータ型を格納する第1情報格納領域を確保する領域確保部を有し、
前記第1情報格納領域に格納された前記データ型は、前記第1ソースコードから生成された第1オブジェクトの実行の際の前記第1変数の更新に応じて更新され、かつ、前記変数格納領域に格納された前記第1変数とともに外部プログラムにより取得可能である、
ことを特徴とするコンパイル装置。 - 第1ソースコードに含まれる第1変数を格納する変数格納領域に対応付けて、前記第1変数のデータ型を格納する第1情報格納領域を確保し、
前記第1情報格納領域に格納された前記データ型は、前記第1ソースコードから生成された第1オブジェクトの実行の際の前記第1変数の更新に応じて更新され、かつ、前記変数格納領域に格納された前記第1変数とともに外部プログラムにより取得可能である、
ことを特徴とするコンパイル方法。
Priority Applications (2)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| JP2015134301A JP2017016503A (ja) | 2015-07-03 | 2015-07-03 | コンパイラ、コンパイル装置及びコンパイル方法 |
| US15/180,588 US20170003907A1 (en) | 2015-07-03 | 2016-06-13 | Compilation apparatus and compilation method |
Applications Claiming Priority (1)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| JP2015134301A JP2017016503A (ja) | 2015-07-03 | 2015-07-03 | コンパイラ、コンパイル装置及びコンパイル方法 |
Publications (1)
| Publication Number | Publication Date |
|---|---|
| JP2017016503A true JP2017016503A (ja) | 2017-01-19 |
Family
ID=57683128
Family Applications (1)
| Application Number | Title | Priority Date | Filing Date |
|---|---|---|---|
| JP2015134301A Pending JP2017016503A (ja) | 2015-07-03 | 2015-07-03 | コンパイラ、コンパイル装置及びコンパイル方法 |
Country Status (2)
| Country | Link |
|---|---|
| US (1) | US20170003907A1 (ja) |
| JP (1) | JP2017016503A (ja) |
Families Citing this family (3)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| CN109324765A (zh) * | 2018-11-01 | 2019-02-12 | 郑州云海信息技术有限公司 | 一种磁盘状态检测方法、装置、设备及存储介质 |
| JP7014199B2 (ja) | 2019-03-08 | 2022-02-01 | オムロン株式会社 | 制御システム、情報処理装置、および情報処理プログラム |
| US12353860B2 (en) * | 2022-02-10 | 2025-07-08 | Mitsubishi Electric Corporation | Programmable controller system, development support device, and recording medium |
Family Cites Families (7)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| US668013A (en) * | 1900-03-06 | 1901-02-12 | John F Loresch | Burial-case. |
| US6718533B1 (en) * | 1999-02-26 | 2004-04-06 | Real-Time Innovations, Inc. | Method for building a real-time control system with mode and logical rate |
| JP3676312B2 (ja) * | 2002-03-12 | 2005-07-27 | 株式会社エヌ・ティ・ティ・ドコモ | 送信側移動機、受信側移動機、情報通信システム、情報通信方法及びサーバ装置 |
| JP4157016B2 (ja) * | 2003-11-05 | 2008-09-24 | 株式会社東芝 | コンパイラ装置及びコンパイル方法 |
| WO2014178255A1 (ja) * | 2013-04-30 | 2014-11-06 | 富士電機株式会社 | 制御装置、およびマップファイル変換装置 |
| US20150277868A1 (en) * | 2014-03-28 | 2015-10-01 | International Business Machines Corporation | Declared variable ordering and optimizing compiler |
| TWI643077B (zh) * | 2014-11-19 | 2018-12-01 | 財團法人資訊工業策進會 | 適應性調整資料庫結構之方法與調整裝置 |
-
2015
- 2015-07-03 JP JP2015134301A patent/JP2017016503A/ja active Pending
-
2016
- 2016-06-13 US US15/180,588 patent/US20170003907A1/en not_active Abandoned
Also Published As
| Publication number | Publication date |
|---|---|
| US20170003907A1 (en) | 2017-01-05 |
Similar Documents
| Publication | Publication Date | Title |
|---|---|---|
| US8984497B2 (en) | Source code converting, method program, and systems for first programming language to a code in a second programming language | |
| US5684955A (en) | Process for distributing an object-oriented program over a plurality of operating system processes of a computer system | |
| CN111831287A (zh) | 用于确定执行代码段所需的资源的方法、设备和程序产品 | |
| EP2378413B1 (en) | Methods and systems to implement non-ABI conforming features across unseen interfaces | |
| CN110149800A (zh) | 一种用于处理与源程序的源代码相关联的抽象语法树的装置 | |
| CN106681820B (zh) | 基于消息组合的可扩展大数据计算方法 | |
| US7739696B2 (en) | Message translation systems and methods | |
| CN111435312B (zh) | 应用程序管理方法、装置及电子设备 | |
| CN110780897A (zh) | 一种代码变更方法以及装置 | |
| CN103197942A (zh) | 一种补丁的生成方法、打补丁的方法及装置 | |
| CN113703829A (zh) | 一种Android生命周期多业务分发方法及系统 | |
| CN118409758B (zh) | 用于编译核函数的方法、装置、介质和程序产品 | |
| JP2017016503A (ja) | コンパイラ、コンパイル装置及びコンパイル方法 | |
| Aslam et al. | Optimized java binary and virtual machine for tiny motes | |
| CN111596970A (zh) | 动态库延迟加载方法、装置、设备和存储介质 | |
| JP2002116917A (ja) | オブジェクト指向型プログラミング言語によるソース・プログラムをコンパイルするコンパイラ | |
| JP2018081592A (ja) | コンパイルプログラム、コンパイル方法、およびコンパイル装置 | |
| JP4768984B2 (ja) | コンパイル方法、コンパイルプログラムおよびコンパイル装置 | |
| US8112741B1 (en) | Ignoring output arguments of functions in programming environments | |
| CN114443052B (zh) | 一种il指令运行时的动态特例化方法和装置 | |
| JPH08263299A (ja) | プログラム変換方法 | |
| US11435989B2 (en) | Thread-local return structure for asynchronous state machine | |
| US8898524B2 (en) | Computer-readable medium storing wrapper program and integrated circuit apparatus | |
| CN107817972B (zh) | 缓存代码处理方法、装置、存储介质及电子设备 | |
| CN116192963A (zh) | 微服务的错误码处理方法、装置、设备及存储介质 |