STICKY-LINKAGE

プログラムが次に呼び出されるまで、そのプログラムへのパラメーターのリンクが解除されないようにします。
注: この指令は、ネイティブ COBOL でのみサポートされています。

構文:

>>-.---.-.------STICKY-LINKAGE--"integer"-.-><
   +-/-+ +----NO-STICKY-LINKAGE-----------+

パラメーター:

integer 1 または 2 のいずれか

プロパティ:

デフォルト: NOSTICKY-LINKAGE
段階: 構文チェック
$SET: 最初の行

説明:

COBOL の連絡節の目的は、連絡節 (リンク項目) で宣言されたレベル 01 またはレベル 77 のデータ項目 1 つと、動的に指定された複数のデータ項目をリンクし、これらが同じ記憶領域を共有しているように見せることです。リンクは、CALL program-name USING 文、CALL entry-name USING 文、または SET 文の 3 つのうちのいずれかの方法で確立されます。最初の機構 (プログラム名を参照する CALL 文) は ANSI で指定された標準の機能です。他の 2 つは、この COBOL システムでサポートされている COBOL 言語の拡張機能です。

ANSI COBOL では、呼び出し先プログラムは、CALL 文で渡されたパラメーターに、連絡節でアクセスできます。CALL 文の USING 指定のパラメーター数は、手続き部の見出しの USING 指定にあるパラメーターの数と同じでなければなりません。連絡節のレベル 01 または レベル 77 のデータ項目のうち、手続き部の見出しの USING 指定に存在しない項目は参照できません。

ENTRY 文は COBOL 言語の拡張機能で、プログラムに代替エントリ ポイントを設定します。ENTRY 文では、手続き部の見出しと同じように USING 指定を使用します。また、リンク項目に関しても同様で、リンク項目のうち、プログラムを呼び出したエントリ名に関連する USING 指定に存在しない項目は参照できません。

SET 文を使用すると、POINTER 値を使用して、リンク項目をリンクすることができます。POINTER の値は、記憶域の場所を識別する値です。このようなリンク項目は、記憶域の決まった場所に格納されているデータを参照する場合に使用できます。

リンク項目がリンクされる場合、およびリンクが解除される場合の詳細を、概念的な言葉を使って次で説明します。

この COBOL システムでは、実行時にリンク項目が参照されると、その項目がデータ項目にリンクされていることが確認されます。リンク項目がリンクされている記憶領域がない場合は、ランタイム エラーが発生します。容易に確認できるようにするために、プログラムの最初の文が実行される直前の呼び出しで、すべてのリンク項目のリンクがいったん解除され、その後、呼び出し元プログラムから渡されるパラメーターを持つリンク項目が再度リンクされます。つまり、呼び出し先プログラムのリンク項目のうち、SET 文を使ってデータ項目にリンクされるものは、そのプログラムが次に呼び出されたときにはリンクが解除されています。このため、プログラムが呼び出されるたびに SET 文を実行する必要があります。

他の多くの COBOL の動作は、ANSI 規則にそれほど厳密に従っていません。STICKY-LINKAGE 指令でも、パラメーターで 2 つの異なる方式を指定しますが、これらもこの規則に厳密に従った方式ではありません。

STICKY-LINKAGE"1" を指定すると、呼び出し先プログラムの USING 指定にあるリンク項目のみ、リンクが解除されます。他のリンク項目については前のリンクが維持されます。プログラム名を使ってプログラムが呼び出された場合にリンクが解除されるのは、手続き部の見出しの USING 指定の項目です。それ以外の場合は、プログラムが呼び出されたエントリ ポイントに関連する USING 指定の項目のリンクが解除されます。

この方式では、USING 指定のリンク項目が参照される際に、呼び出し元プログラムから渡されるパラメーターが不十分で、CALL 文の USING 指定に対応するパラメーターが存在しない場合はランタイム エラーになります。

STICKY-LINKAGE"2" を指定すると、プログラムが呼び出されたときに、すべてのリンク項目のリンク状態が維持されます。ただし、起動時や CANCEL 文で参照された後など、プログラムが初期状態にある場合は除きます。呼び出し元プログラムからパラメーターが渡された場合や、SET 文を使用してリンクが変更された場合を除き、すべてのリンク項目は、前の呼び出し時に確立されたリンクが維持されます。

これは特定の実装方法を暗示するものではありません。この指令をこの COBOL システムで使用し、ANSI 規則に反した動作をエミュレートした場合、プログラムのサイズや実行速度に悪い影響を与えることがあります。

例:

次のプログラムを STICKY-LINKAGE 指令を指定せずにコンパイルして実行すると、2 番目の CALL 文で、"ent" に制御が渡り、DISPLAY 文まで進みますが、ここで 2 つのリンク項目が参照されると、これらは ENTRY "ent" の USING 指定にないため、ランタイム エラー 203 (CALL パラメーターが連絡節に定義されていない) が発生します。

このプログラムを STICKY-LINKAGE"1" を指定してコンパイルして実行すると、3 番目の CALL 文で "sub" に制御が渡り、DISPLAY 文で、手続き部の見出しの USING 指定にあるリンク項目が参照されるところまで進みますが、CALL 文で対応するパラメーターが渡されていないため、ここで失敗します。

このプログラムを STICKY-LINKAGE"2" を指定してコンパイルして実行すると、プログラムの終わりまで正常に実行されます。

 program-id. main.
 working-storage section.
 01 param pic x value "a".
 procedure division.
     call "sub" using param
     call "ent"
     call "sub"
     stop run.
 end program main.

 program-id. sub.
 linkage section.
 01 link-1 pic x.
 01 link-2 pic x.
 procedure division using link-1.
     set address of link-2 to address of link-1
     display link-1 link-2
     exit program.

   entry "ent"
     display link-1 link-2
     exit program.

STICKY-LINKAGE"2" を呼び出し先プログラムに使用すると、このプログラムは COBOL プログラムからのみ呼び出せます。