1. 導入:なぜ今、ラベル配列なのか
メインフレームの保守開発において、膨大な条件分岐に頭を悩ませた経験はありませんか?複雑な業務フローを処理する際、数多くのIF文やSELECT文を重ねると、可読性が低下し、メンテナンスが困難になります。PL/Iの「LABEL ARRAY(ラベル配列)」は、ラベル(行番号)を配列として格納し、インデックスによって動的にジャンプ先を決定する手法です。コードの構造を整理し、論理的な分岐を一括管理するために非常に強力な武器となります。
2. 基礎知識:LABEL ARRAYとは
PL/IにおけるLABEL型は、プログラム内の実行位置(文)を指し示すデータ型です。通常、GOTO文は固定されたラベルへ飛びますが、LABEL ARRAYを使用することで、配列の添字(インデックス)に基づいて、実行時にジャンプ先を決定できます。これにより、条件式を羅列するのではなく、添字の計算によって制御フローを切り替えることが可能になります。
3. 実装/解決策:動的分岐の構築
実装は非常にシンプルです。まず、DCL文でラベル型配列を宣言し、初期値としてジャンプ先のラベルを指定します。次に、実行時に計算されたインデックスを用いてGOTO文を発行します。これにより、多分岐処理をテーブル駆動に近い形で実装できます。
4. サンプルプログラム
以下は、処理区分に応じて異なるサブルーチン的処理へジャンプする例です。
/ ラベル配列による動的ジャンプのサンプル /
TEST_PGM: PROC OPTIONS(MAIN);
/ ラベル型配列の宣言と初期化 /
DCL SWITCH_LAB(3) LABEL INIT(PROC_A, PROC_B, PROC_C);
DCL CHOICE FIXED BIN(15);
/ 処理選択用のインデックス(本来は入力データ等から取得) /
CHOICE = 2;
/ 範囲チェックを行い、安全にジャンプ /
IF CHOICE >= 1 & CHOICE <= 3 THEN
GOTO SWITCH_LAB(CHOICE);
ELSE
GOTO ERROR_RTN;
PROC_A:
PUT SKIP LIST('処理Aを実行しました');
GOTO END_PGM;
PROC_B:
PUT SKIP LIST('処理Bを実行しました');
GOTO END_PGM;
PROC_C:
PUT SKIP LIST('処理Cを実行しました');
GOTO END_PGM;
ERROR_RTN:
PUT SKIP LIST('無効な選択です');
END_PGM:
RETURN;
END TEST_PGM;
5. 応用・注意点:現場での運用とリファクタリング
ラベル配列は非常に高速な分岐を実現しますが、多用すると「スパゲッティコード」の元凶となります。現代的な開発環境であれば、CASE文やサブルーチンの呼び出しへリファクタリングすることが推奨されます。しかし、メインフレームの既存資産では、パフォーマンスやメモリ制約からこの手法が最適解である場合も少なくありません。
実装時の注意点として、必ずインデックスの範囲チェック(Bounds Check)を行ってください。範囲外の添字を指定するとプログラムが異常終了(ABEND)するリスクがあります。レガシーの知恵を活かしつつ、安全性を担保したコーディングを心がけましょう。

コメント