1. 導入:なぜEXTERNAL句の理解が重要なのか
COBOL開発の世界では、複数のプログラム間でデータを共有したいというケースが多々あります。その際、最も手軽に見えるのが「EXTERNAL句」です。しかし、この機能は「どこからでも変更できてしまう」という強力な副作用を秘めています。なぜこの機能が現代の開発現場であまり推奨されないのか、そしてどのように使うべきなのか。ベテランの視点から、その仕組みとリスクを解説します。
2. 基礎知識:EXTERNAL句とは何か
EXTERNAL句は、データ項目を「プログラムの外側に配置する」ための命令です。通常、COBOLの変数(データ項目)は各プログラムの中に閉じられていますが、EXTERNALを指定すると、その変数は「プログラムの境界を越えて共有されるメモリ領域」に置かれます。これにより、引数として値を渡す手間を省き、複数のプログラムから同じ変数へ直接アクセスできるようになります。
3. 実装と課題:便利さの裏にある罠
EXTERNAL句を使用すると、プログラムAで更新した値が、即座にプログラムBから参照できるようになります。一見便利ですが、大規模なシステムになると「誰がいつ値を書き換えたのか」を追跡するのが非常に困難になります。バグが発生した際、原因箇所を特定するために全プログラムを調査しなければならない事態に陥る可能性があるのです。そのため、現在では「引数によるデータの受け渡し」が設計の基本とされています。
4. サンプルプログラム:EXTERNAL句の動作例
以下のコードは、共有変数を使用して値を更新・参照する例です。動作確認用として参考にしてください。
[メインプログラム側]
IDENTIFICATION DIVISION.
PROGRAM-ID. MAIN-PROG.
WORKING-STORAGE SECTION.
- 共有変数の定義。EXTERNAL句を付けることで他プログラムと共有される
01 SHARED-COUNTER PIC 9(05) EXTERNAL.
PROCEDURE DIVISION.
MOVE 100 TO SHARED-COUNTER.
DISPLAY “メイン側で初期化: ” SHARED-COUNTER.
- 別のプログラムを呼び出す
CALL “SUB-PROG”.
DISPLAY “サブから戻った後の値: ” SHARED-COUNTER.
STOP RUN.
[サブプログラム側]
IDENTIFICATION DIVISION.
PROGRAM-ID. SUB-PROG.
WORKING-STORAGE SECTION.
- メインと同じ名前・型で定義する必要がある
01 SHARED-COUNTER PIC 9(05) EXTERNAL.
PROCEDURE DIVISION.
- 共有変数を直接書き換える
ADD 50 TO SHARED-COUNTER.
DISPLAY “サブ側で加算後の値: ” SHARED-COUNTER.
EXIT PROGRAM.
5. 応用と注意点:現場で生き残るための教訓
実務でEXTERNAL句を使う際は、以下の点に注意してください。
1. 名前空間の汚染を防ぐ
EXTERNAL変数はグローバル変数と同じです。名前が被ると意図しない場所で値が書き換わります。必ずプロジェクト内で一意となるプレフィックス(例:EXT-WK-など)を付けてください。
2. 引数渡しを優先する
可能な限り、CALL文のUSING句を使用してデータを明示的に渡してください。どのプログラムがどのデータを操作しているのかが明確になり、保守性が格段に向上します。
3. 変更履歴を残す
どうしてもEXTERNALを使用せざるを得ない場合(古いシステムの改修など)、どのタイミングで値が変わるのか、設計書に明確なフローを記載しておくことが、将来の自分を助けることになります。
便利な道具ほど、扱いには慎重さが必要です。技術の裏側を理解し、安全な設計を心がけましょう。

コメント