【COBOL学習|初心者向け】プログラム名のグローバル参照:大規模開発で迷わない「CALL」の仕組み

導入

COBOLでのシステム開発において、一つのプログラムにすべての処理を詰め込むことはまずありません。機能ごとにプログラムを分割し、それらを連携させることで、保守性の高いシステムが構築されます。今回は、別々の翻訳単位(ソースファイル)に分かれたプログラム同士をどのように呼び出すのか、その「グローバル参照」の仕組みについて解説します。これが理解できると、大規模な業務システムの構造がぐっと見えやすくなります。

基礎知識

COBOLのプログラムには、必ず「PROGRAM-ID」という識別子が定義されています。これは、そのプログラムの「名前」です。
通常、ソースプログラムをコンパイルすると、そのPROGRAM-IDで指定された名前が「外部シンボル」として生成されます。この外部シンボルは、システム全体から参照可能なラベルのようなものです。
「CALL文」を使うと、指定した名前をリンカ(結合プログラム)が探し出し、実行時にそのプログラムへ制御を移すことができます。これを「静的リンク」と呼びます。

実装/解決策

別プログラムを呼び出す際は、以下の手順を意識してください。

1. 呼び出し元(メイン)で CALL “プログラム名” を記述する。
2. 呼び出し先(サブ)の PROGRAM-ID が、メイン側で指定した名前と一致していることを確認する。
3. データの受け渡しが必要な場合は、USING句で変数を指定する(引数の型と順序を合わせることが重要です)。

サンプルプログラム

[メインプログラム: MAINPROG.cbl]
IDENTIFICATION DIVISION.
PROGRAM-ID. MAINPROG.
WORKING-STORAGE SECTION.
01 WS-VALUE PIC 9(05) VALUE 100.
PROCEDURE DIVISION.

  • サブプログラム “SUBPROG” を呼び出す
  • USINGで変数を渡してデータを共有する

CALL “SUBPROG” USING WS-VALUE.
DISPLAY “メインに戻りました。値は: ” WS-VALUE.
STOP RUN.

[サブプログラム: SUBPROG.cbl]
IDENTIFICATION DIVISION.
PROGRAM-ID. SUBPROG.
LINKAGE SECTION.

  • メインから受け取るための定義

01 LK-VALUE PIC 9(05).
PROCEDURE DIVISION USING LK-VALUE.
DISPLAY “サブプログラムで受信: ” LK-VALUE.

  • 値を更新してメインへ返す

ADD 50 TO LK-VALUE.
EXIT PROGRAM.

応用・注意点

現場でよくあるミスは「プログラム名の大文字・小文字の不一致」と「リンク時のエラー」です。
多くの環境ではプログラム名は「大文字」で管理されますが、コンパイラの設定によっては区別される場合があります。また、CALLするプログラムが適切にコンパイル・リンクされていないと「未解決シンボル」というエラーが発生します。

コツとして、呼び出し元と呼び出し先の「USING句の引数構造(メモリレイアウト)」を厳密に合わせるようにしてください。ここがずれると、データが化けたり、最悪の場合はメモリ破壊を引き起こして異常終了する原因になります。コピーブックを使用して、引数の定義を共通化するのが、ベテランの現場では定石となっています。

コメント

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