![]() | NLS の実装例 | 複数の言語による開発 | ![]() |
複数の言語を使ってアプリケーションを開発するためには、各言語のコンパイラが互いに整合性のあるランタイムサポートを備え、一貫性のあるプログラム間インターフェイスを提供することが条件になります。Server Express には、COBOL プログラムをコンパイルしてネイティブのオブジェクトコード (.o ファイル) を生成する機能があります。この .o ファイルは、他言語のさまざまなコンパイラでも生成される標準的なファイルであり、それゆえ Server Express では、COBOL で開発したサブプログラムと他の言語で開発したサブプログラムを併用してアプリケーションを開発することが可能です。
この章では、Server Express の呼び出しメカニズムについて説明します。この情報は、COBOL で開発したプログラム (COBOL プログラム) と他の言語で開発したプログラム (非 COBOL プログラム) 間のインターフェイスを構築するために役立ちます。具体的には、COBOL プログラムと非 COBOL プログラム間のインターフェイスで発生する問題と、その解決に利用できる Server Express の機能について説明します。COBOL プログラム間の呼び出しは、この章では取り上げません。
この章を読み終わったら、『複数の言語による開発』に進んでください。COBOL プログラムと次の各言語で開発したプログラム間のインターフェイスの各側面が詳しく説明されています。
ここでは、複数の言語を使ってアプリケーションを開発する際に留意すべきいくつかの基本 ポイントの説明を通じて、特殊な COBOL 構文で対処すべき問題と対処方法を示します。また、そのようなアプリケーション開発で使用できる Server Express のランタイムライブラリと、各種の呼び出し規約に応じて利用できる拡張構文についても説明しています。
次の章も参照してください。
呼び出しを正しく実行するためには、呼び出し元プログラムと呼び出し先プログラムの両方が、共通の規則に従っていることが重要です。最も重要性の高いいくつかの規則を次に示します。
呼び出し元と呼び出し先のプログラムが同じ規則に従っていないと、呼び出しを実行したときにアプリケーションがクラッシュする可能性があります。
サブプログラムを呼び出すときには、その直前にパラメータがスタックにプッシュされます。パラメータをスタックにプッシュする順序には、呼び出しの最後に指定されたパラメータから順次プッシュする「逆順序」と、最初に指定されたパラメータから順次プッシュする「指定順序」の 2 種類があります。COBOL や C では、逆順序のプッシュが一般的です。
COBOL で開発したプログラムは他の言語で開発したサブプログラムに、次の 2 種類の方法でパラメータを渡すことができます。
方法 |
形式 |
---|---|
by reference | アドレス (メモリ上のオフセット) を渡します。パラメータが示すデータにサブプログラム側で加えられた変更は、すべて呼び出し元プログラムにも反映されます。 |
by value | 値そのものをサブプログラムに渡します。パラメータで渡された値にサブプログラム側で変更を加えても、呼び出し元プログラムには反映されません。 |
Server Express は、複数言語による開発上の問題に対処するための多彩な機能を備えています。これらの機能は、各種の呼び出し規約に対応する構文拡張として実装されています。
『言語リファレンス』には、前述したプログラム間インターフェイスに関するさまざまな留意点に対処するための COBOL 構文が説明されています。以下の各項では、これらの COBOL 構文のいくつかを取り上げ、その使用方法を説明します。
CALL-CONVENTION 構文を使用すれば、COBOL プログラムがサブプログラムを呼び出すときに使用すべき呼び出し規約や、COBOL プログラムを呼び出すプログラム側で使用されるべき呼び出し規約を指定できます。必要な呼び出し規約は、すべて特殊名段落で宣言する必要があります。同段落内で、次に定義する呼び出し規約番号のいずれかを任意の呼び名に割り当てます。呼び出し規約番号を割り当てた呼び名は、必要に応じて呼び出し規約の指定に使用できます。
呼び出し規約番号は 16 ビットの番号で、次のように定義されています。
呼び出し規約の設定例を次に示します。
special-names. call-convention 0 is c-callconv
CALL 文で使用すべき呼び出し規約を指定するには、定義した呼び名を次の構文で使用します。
call c-callconv "routine-name" using param-1,...,param-n
プログラムの呼び出し側で使用されるべき呼び出し規約は、次の構文で指定します。
procedure division c-callconv using param-1,...,param-n
呼び出し規約を指定しない場合には、COBOL 標準の呼び出し規約 (CALL-CONVENTION 0) が使用されます。
『言語リファレンス』で説明されているように、値そのものを渡すパラメータは BY VALUE 指定で指定する必要があります。バイト長は常に偶数にすべきです。この種のパラメータの値は常にスタックにプッシュされるため、アドレスが最も小さいバイトが最後にプッシュされます。
SIZE 句を省略すると、渡される値のバイト長は LITVAL-SIZE 指令によって指定されます。この指令のデフォルト値は 4 です。
パラメータを値渡しする文の例を次に示します。
call "routine-name" using by value 2 size 4.
この文は、値 4 を 2 バイトのデータとして渡します。
大部分の COBOL データ型の形式は、『言語リファレンス』で説明されています。複数の言語によるアプリケーション開発には、次のデータ型が適しています。
データ型 |
記憶域の表現 |
---|---|
COMP-X | COBOL の標準形式。データを最上位バイトから順に格納します。そのため、最上位バイトのアドレスが最も小さくなります。 |
COMP-5 | チップで定義された順序に従ってデータを格納します。非 COBOL プログラムや API を呼び出すときに使用すべきデータ型です。 |
ポインタ変数は、動的に割り当てられるメモリ領域のアドレスを保持する手段としてきわめて効果的です。COBOL プログラムは SET ADDRESS 文を使用して、ポインタが指すメモリ領域にアクセスできます。
C などの言語では、数値項目は通常的に WORD や DOUBLE WORD (DWORD) の境界に整列されます。COBOL プログラムの場合には、4 の倍数のパラメータを指定した ALIGN 指令を使用すれば、01 レベルの全項目が DOUBLE WORD の境界に整列されます。
ALIGN 指令を明示的に指定しない場合は、ALIGN"8" が使用されます。
COBOL プログラムから非 COBOL プログラムに 01 レベル以外の数値項目をパラメータとして、または集団項目内の基本項目として渡す場合は、適切な整列が施されているかどうかを確認することが重要です。
COBOL プログラムは、サブプログラムから渡されるリターンコードを 2 種類の方法で処理できます。1 つは COBOL 特殊レジスタである RETURN-CODE を使用する方法です。COBOL サブプログラムは、EXIT PROGRAM 文や GOBACK 文で呼び出し元の COBOL プログラムに制御を戻す前に RETURN-CODE に値を格納します。サブプログラムが終了すると、呼び出し元プログラムの RETURN-CODE レジスタには自動的にリターンコードが格納されるため、このレジスタの値をチェックすればリターンコードが得られます。RETURN-CODE レジスタは PIC S9(4) COMP (プログラムが RTNCODE-SIZE "4" 指令付きでコンパイルされた場合には PIC S9(8) COMP) として定義されており、COBOL プログラム間の連絡手段として活用できます。ただし、非 COBOL サブプログラムの呼び出しに対処するほど、柔軟ではありません。
非 COBOL プログラムとの間でリターンコードをやり取りする手段としては、CALL、EXIT PROGRAM、GOBACK、および STOP RUN 各文で RETURNING 指定を使用する方法が柔軟性も高く、より効果的です。この方法では、リターンコードの形式を指定できるため、あらゆるサイズのリターンコードに対応できます。
$set rtncode-size"4" working-storage section. 01 my-c-string pic x(80) value z"Hello world". 01 my-c-len pic s9(9) comp-5. procedure division. call "strlen" using by reference my-c-string, returning my-c-len end-call display "my-c-string is " my-c-len " chars long" display "my-c-string is: " my-c-string(1:my-c-len)
コンパイラ指令の詳細については、『Server Express ユーザガイド』の『コンパイラへの指令』の章を参照してください。COBOL 構文については、『言語リファレンス』に詳しい説明があります。
Copyright © 2002 Micro Focus International Limited. All rights reserved.
本書、ならびに使用されている固有の商標と商品名は国際法で保護されています。
![]() | NLS の実装例 | 複数の言語による開発 | ![]() |