導入
メインフレームのPL/I開発において、プログラムの入り口を定義する「OPTIONS(MAIN)」属性は、すべての処理の起点となる非常に重要な宣言です。しかし、JCLから渡されるPARM引数の解釈や、呼び出し側の仕組みを正しく理解していないと、予期せぬアベンドやデータの読み込みミスが発生します。本記事では、PL/Iでメインプロシージャを安全に実装するための要点を解説します。
基礎知識
PL/Iの「OPTIONS(MAIN)」属性は、その手続きがOS(z/OS)やTSOからの制御を直接受け取る「メインプログラム」であることを宣言します。Javaの「public static void main」に相当する役割を持ち、プログラム実行時にOSから制御が渡されるエントリポイントとして機能します。通常、JCLのEXECステートメントで指定されたPARM文字列は、このメインプロシージャの引数として渡されます。
実装/解決策
JCLから渡されるPARMは、仕様上「先頭の2バイトが長さ(ハーフワード)、以降がデータ本体」という構造になっています。PL/IのVARYING属性を持つ文字列変数を引数に定義することで、コンパイラがこの形式を自動的に解析し、長さ情報を取り除いた純粋な文字列としてコード内で扱うことが可能になります。実装時は必ず「VARYING」属性を忘れず付与してください。
サンプルプログラム
以下は、JCLから渡されたパラメータを標準出力へ表示する基本的な実装例です。
/
サンプルプログラム: PARMを受け取って表示する
コンパイル時にOPTIONS(MAIN)を指定することでエントリポイントとなる
/
MAIN_PROG: PROC(PARM_STR) OPTIONS(MAIN);
/ VARYING属性を付けることで、先頭2バイトの長さ情報が自動処理される /
DCL PARM_STR CHAR(100) VARYING;
/ JCLのPARMが空の場合へのガード条件 /
IF LENGTH(PARM_STR) > 0 THEN
PUT SKIP EDIT(‘受け取ったパラメータ:’, PARM_STR)(A, A);
ELSE
PUT SKIP EDIT(‘パラメータは指定されていません’)(A);
END MAIN_PROG;
応用・注意点
現場でよくある失敗は、引数の長さ不足や、VARYING属性の欠落による「先頭2バイトのゴミ」の混入です。特に、PARMの最大長(100バイト)を超えて渡した場合、エラーや予期せぬ切り捨てが発生します。また、複数の値を渡す必要がある場合は、コンマ区切りでPARMを定義し、プログラム内で「INDEX関数」や「SUBSTR関数」を用いて自前でパースする設計が一般的です。もし複雑な引数解析が必要な場合は、メインプロシージャ内で解析用ルーチンを呼び出す構成にすると、保守性が向上します。

コメント