【COBOL学習|実務向け】[COBOLの「EXTERNAL句」で実現する、プログラム間データ共有のベストプラクティス]

導入

COBOL開発において、複数のプログラム間でデータを共有する際、CALL文のUSING句で引数を渡し続ける手法は一般的ですが、引数が膨大になると保守性が著しく低下します。そこで活用したいのが「EXTERNAL句」です。本稿では、引数渡しを介さずにデータ領域を共有し、設計をシンプルにするための実務的なテクニックを解説します。

基礎知識

EXTERNAL句は、データ項目を「外部データ」として定義するための指定です。これを使用した項目は、そのプログラム単体ではなく、同じランユニット(プログラムが実行されているメモリ空間)内で「グローバルな領域」として確保されます。

通常のWORKING-STORAGE SECTIONで定義した変数は、プログラム終了とともに破棄され、他のプログラムから直接参照することはできません。しかし、EXTERNALを指定すると、名前さえ一致していれば、別々にコンパイルされたプログラム間でも同一のメモリ領域を参照・更新できるようになります。

実装/解決策

共有したいデータ項目を、各プログラムのWORKING-STORAGE SECTIONに全く同じレベル番号、名前、データ型で定義し、最後に「EXTERNAL」を付与します。

1. 共有対象のデータ項目を定義する(各プログラム共通)。
2. プログラムAで値をセットする。
3. プログラムBでそのままその変数を参照する。

この際、引数(BY REFERENCE等)による受け渡しは一切不要です。

サンプルプログラム

以下のコードは、親プログラムで設定した共通フラグを、子プログラムで参照する例です。

[親プログラム例]
WORKING-STORAGE SECTION.

  • 外部データとして定義(他プログラムでも同じ定義が必要)

01 COM-FLAGS EXTERNAL.
05 CF-EXEC-MODE PIC X(01).

PROCEDURE DIVISION.

  • フラグに値をセット

MOVE ‘1’ TO CF-EXEC-MODE.

  • 子プログラムを呼び出す

CALL ‘SUBPROG’
STOP RUN.

[子プログラム例]
WORKING-STORAGE SECTION.

  • 親と同じ名前・型でEXTERNAL定義する

01 COM-FLAGS EXTERNAL.
05 CF-EXEC-MODE PIC X(01).

PROCEDURE DIVISION.

  • 引数を受け取っていないが、親でセットした値が参照できる

IF CF-EXEC-MODE = ‘1’
DISPLAY ‘モード1で実行中’
END-IF.
EXIT PROGRAM.

応用・注意点

現場でEXTERNALを使用する際は、以下の3点に注意してください。

1. 定義の完全一致
EXTERNAL項目はコンパイル時にチェックが及ばないことが多いため、データ定義(PIC句や長さ)が一つでも異なると、予期せぬメモリ破壊やデータ異常を引き起こします。定義はコピー句(COPY文)を用いて、全プログラムで完全に同一のソースを読み込ませるのが鉄則です。

2. 競合リスクの管理
グローバル変数と同様、どこからでも書き換え可能であるため、大規模なシステムでは「どのタイミングで誰が値を変更したか」が追いにくくなります。更新頻度が高いデータには使用を控え、ステータス管理や設定値の保持など、読み取りが主となる用途に限定することをお勧めします。

3. 初期値の制限
EXTERNAL項目にはVALUE句を指定できません。初期化が必要な場合は、プログラムの先頭で明示的にMOVE処理を行うか、イニシャライズ処理を共通化するように設計してください。

コメント

タイトルとURLをコピーしました