導入
メインフレームでのPL/I開発において、似たような構造体宣言や、命名規則に従った変数の記述を繰り返すことはありませんか。これらの「単調かつミスが許されない記述」を自動化し、保守性を高めるために不可欠なのが「%PROCEDURE(マクロプロシージャ)」です。本稿では、コンパイル時にコードを生成するこの強力なプリプロセッサ機能について解説します。
基礎知識
PL/Iのプリプロセッサ機能である「%PROCEDURE」は、コンパイルの最初のフェーズで実行されます。一般的なプログラムが「実行時に動く」のに対し、このマクロは「コンパイル時にソースコードを書き換える」という特徴があります。これにより、複雑なデータ定義を一元管理し、コードの記述量を減らしつつ、命名規則の強制や型の一貫性を担保することが可能になります。
実装/解決策
マクロを使用する際は、まず先頭に「%」を付与してプロシージャを定義します。この関数は引数を受け取り、生成したいPL/Iのソースコードを文字列としてリターンします。コンパイラは、この関数が返した文字列を、ソースコード上の記述と置き換えてコンパイルを続行します。この仕組みにより、特定のパターンに基づいたコード生成を完全に自動化できます。
サンプルプログラム
以下のコードは、指定した名前で「固定小数点変数」を自動生成するマクロの例です。
/ マクロプロシージャの定義 /
%GEN_FIXED_VAR: PROC(VAR_NAME) RETURNS(CHAR);
/ 引数として受け取った変数名をもとにDCL文を生成する /
RETURN(‘DCL ‘ || VAR_NAME || ‘ FIXED BIN(31,0);’);
%END GEN_FIXED_VAR;
/ メインプログラム内での呼び出し /
%DECLARE GEN_FIXED_VAR ENTRY;
%GEN_FIXED_VAR(‘COUNTER’);
%GEN_FIXED_VAR(‘TOTAL_AMT’);
/ 上記のプリプロセス結果は以下のように展開されます /
/ DCL COUNTER FIXED BIN(31,0); /
/ DCL TOTAL_AMT FIXED BIN(31,0); /
応用・注意点
注意点1:デバッグの難易度
マクロが展開された後のコードは、元のソース上には存在しません。コンパイルリスト(SYSIN/SYSPRINT)で展開結果を確認する癖をつけないと、エラー発生時に「どこで間違ったのか」を特定するのが困難になります。
注意点2:将来の移行を見据える
参考本文にもある通り、この強力なメタ機能はJavaやPythonといった現代言語には直接相当する機能がありません。将来的なシステム移行を考慮する場合、マクロで生成するコードの構造を標準化し、将来的に外部コードジェネレーター(T4テンプレート等)へ容易に移行できるよう設計しておくことが、長期的な保守の鍵となります。使いすぎはコードの可読性を下げるため、「ルールが固定された定型コード」に限定して使用するのが現場での賢い運用術です。

コメント