なぜPROCEDURE(手続き)が重要なのか
メインフレームでPL/Iを扱う際、全ての処理を一つの巨大なコードの中に書いてしまうと、修正や保守が非常に困難になります。PROCEDURE(PROC)を使って処理を小さな単位に分割することで、コードの可読性が向上し、バグの発生を抑えることができます。これは、現代のJavaにおけるメソッドの考え方と非常に似ており、プログラムの構造を整理する上で最も重要な概念です。
PROCEDUREの基礎知識:外部と内部
PL/IのPROCEDUREには、大きく分けて二つの種類があります。
1. 外部手続き(External Procedure):プログラムの入り口となる、独立した単位です。ロードモジュール単位で管理されます。
2. 内部手続き(Internal Procedure):他のPROCEDUREの中に入れ子状態で記述される手続きです。これがPL/Iの大きな特徴で、外側の変数をそのまま参照できるという強力なスコープ(有効範囲)を持っています。
z/OSの環境では、これらの手続きが呼び出されるたびにDSA(Dynamic Storage Area)と呼ばれるスタック領域がLE(Language Environment)によって動的に管理されています。
実装のポイント
内部手続きを多用すると、どこでどの変数が変更されたか分かりにくくなる傾向があります。他の言語へ移行する際や、保守性を高めるためには、「一つのPROCEDUREは一つの機能に徹する」ことを意識しましょう。また、引数(ARG)を適切に定義することで、データの受け渡しを明確にすることが成功の秘訣です。
サンプルプログラム:計算処理のモジュール化
以下は、メインの処理から内部手続きを呼び出し、計算を行うサンプルです。
/ メインの外部手続き /
MAIN_PROG: PROC OPTIONS(MAIN);
DCL A FIXED BIN(31) INIT(10);
DCL B FIXED BIN(31) INIT(20);
DCL RESULT FIXED BIN(31);
/ 内部手続きの呼び出し /
CALL ADD_NUM(A, B, RESULT);
/ 結果の表示 /
PUT SKIP EDIT('計算結果は:', RESULT)(A, F(5));
/ 内部手続きの定義 /
ADD_NUM: PROC(IN1, IN2, OUT);
DCL (IN1, IN2) FIXED BIN(31); / 入力引数 /
DCL OUT FIXED BIN(31); / 出力引数 /
OUT = IN1 + IN2; / 加算処理 /
END ADD_NUM;
END MAIN_PROG;
応用と注意点:モダンな開発への備え
PL/I独自の機能である「入れ子構造」は便利ですが、JavaやC#といった言語へ移行する際には注意が必要です。これらの言語には「手続きの中に手続きを置く」という概念は標準ではありません。
現場での回避策として、内部手続きを「プライベートメソッド」へ抽出する準備をしておきましょう。また、内部手続きが外側の変数を直接参照している場合、引数として変数を渡す設計(カプセル化)に書き換えておくと、将来的な言語移行が圧倒的にスムーズになります。まずは「一つのPROCの中は完結させる」ことを意識してコーディングしてみましょう。

コメント