導入:なぜ「入れ子プログラム」が重要なのか
COBOLの現場では、一つの機能ごとにソースファイルを分けるのが一般的ですが、特定の計算ロジックや、そのプログラム内でしか使わない補助的な処理を外部から隠蔽したい場面があります。そんな時、わざわざ別ファイルにするまでもない「局所的な処理」を整理するのに役立つのが、今回紹介する「入れ子プログラム(Nested Programs)」です。これを使うことで、プログラムの静的構造を整理し、保守性を劇的に向上させることができます。
基礎知識:入れ子プログラムとは
入れ子プログラムとは、一つのソースファイルの中に「親プログラム」と、その内部に「子プログラム」を定義する構造のことです。
重要なのは、プログラムの境界を明示する「END PROGRAM」文です。これにより、コンパイラはどこからどこまでが一つのプログラム単位であるかを正確に認識します。また、子プログラムから親プログラムのデータ項目へアクセスできる「スコープ(有効範囲)」のルールを理解することが、この機能を使いこなす鍵となります。
実装と解決策
入れ子プログラムは、主に「特定の処理をサブルーチン化したいが、外部からはその存在を隠したい」というケースで有効です。
実装のコツは以下の通りです。
1. 親プログラムのIDENTIFICATION DIVISIONの直後に子プログラムを配置する。
2. 各プログラムの最後に必ず「END PROGRAM プログラム名」を記述する。
3. 呼び出し時は通常のCALL文を使用する。
サンプルプログラム
以下は、親プログラムが子プログラムを呼び出し、計算結果を受け取る実用的な例です。
PROGRAM-ID. PARENT-PROG.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM-A PIC 9(03) VALUE 10.
01 WS-NUM-B PIC 9(03) VALUE 20.
01 WS-RESULT PIC 9(04).
PROCEDURE DIVISION.
> 子プログラムを呼び出して計算結果を取得
CALL ‘CHILD-PROG’ USING WS-NUM-A, WS-NUM-B, WS-RESULT.
DISPLAY ‘計算結果: ‘ WS-RESULT.
STOP RUN.
> ここから子プログラムの定義
PROGRAM-ID. CHILD-PROG.
DATA DIVISION.
LINKAGE SECTION.
01 LK-A PIC 9(03).
01 LK-B PIC 9(03).
01 LK-RES PIC 9(04).
PROCEDURE DIVISION USING LK-A, LK-B, LK-RES.
> 簡易的な掛け算を実行
COMPUTE LK-RES = LK-A LK-B.
EXIT PROGRAM.
END PROGRAM CHILD-PROG.
END PROGRAM PARENT-PROG.
応用・注意点:現場での活用と落とし穴
現場で使う際に注意すべき点は、「データの共有範囲」です。子プログラムは親プログラムのデータ項目を直接参照可能ですが、これはスパゲッティコードを生む原因にもなります。基本的にはLINKAGE SECTIONを介した値の受け渡しを徹底しましょう。
また、入れ子構造が深くなりすぎるとソースコードの可読性が逆に低下します。「一つのソースには親+子数個まで」という自分なりのルールを設けるのが、ベテランの知恵です。ぜひ、ちょっとしたツール作成や内部処理の整理に活用してみてください。

コメント