1. 導入:なぜプリプロセッサの理解が重要なのか
メインフレームでPL/Iを扱っていると、ソースコードの中に「%」から始まる命令を見かけることはありませんか?これはプリプロセッサと呼ばれる、コンパイルの「前段階」で動く強力なツールです。特に、変数宣言(DECLARE)を動的に生成する際、プリプロセッサがどのようにコードを再スキャン(RESCAN)して型を決定するかを知ることは、バグを防ぎ、複雑なコードを読み解くために不可欠です。
2. 基礎知識:プリプロセッサとRESCANとは
PL/Iのコンパイラは、いきなりプログラムを機械語に直すわけではありません。まずプリプロセッサがソースコードを読み込み、マクロや定数置換を実行します。この「置換後の文字列」をコンパイラがもう一度読み直すプロセスが「RESCAN」です。
例えば、配列のサイズを定数化しておくと、後から一箇所修正するだけでプログラム全体に反映できます。しかし、この仕組みを理解していないと、コンパイルエラーの原因が「プリプロセッサの結果」にあるのか、「ソースコードの書き方」にあるのかが分からず、デバッグに苦労することになります。
3. 実装と解決策:定数置換を賢く使う
宣言を動的に生成する際は、プリプロセッサの変数や置換機能(%REPLACE)を活用します。重要なのは、プリプロセッサが処理を終えた後の「展開後の姿」を常に意識することです。移行解析やコードレビューを行う際は、コンパイラが出力する「プリプロセス済みソース(Listing)」を確認するのが鉄則です。
4. サンプルプログラム:動的な配列宣言の例
以下のコードは、プリプロセッサを使用して配列のサイズを柔軟に管理する例です。
/ プリプロセッサによる定数定義 /
%REPLACE MAX_COUNT BY ’50’;
%REPLACE DATA_TYPE BY ‘FIXED BIN(31)’;
/ プリプロセッサが展開すると:DCL MY_ARRAY(50) FIXED BIN(31); となる /
DCL MY_ARRAY(MAX_COUNT) DATA_TYPE;
/ 動作確認用の簡単な処理 /
MY_ARRAY(1) = 100;
PUT SKIP LIST(‘配列の1番目の値は:’ || MY_ARRAY(1));
/
解説:
1. %REPLACE により、コンパイル時に MAX_COUNT が 50 に置き換わります。
2. コンパイラは、この置換が行われた後の完全な宣言文(DCL MY_ARRAY(50) FIXED BIN(31))を解析します。
3. この仕組みを使えば、プログラム全体で配列サイズを一括管理でき、保守性が飛躍的に向上します。
/
5. 応用・注意点:現場での落とし穴
現代の言語における「ジェネリクス」に近い機能ですが、あくまで「文字列置換」である点に注意してください。
注意点1:型情報の誤認
移行ツールや静的解析ツールを使う際、生のソースコードだけを読ませると、MAX_COUNTのような変数が定義されていないと誤判定されることがあります。「プリプロセス済みソース」を解析対象にすることが、正確な型情報を得るための鍵です。
注意点2:複雑なマクロの多用
便利だからといってマクロを何重にもネストさせると、展開後のコードが読みづらくなり、保守が困難になります。「展開後の姿」を常にListingファイルで確認し、誰が見ても挙動が追える範囲で活用するようにしましょう。
このRESCANの仕組みをマスターすれば、メインフレームのPL/I開発がより論理的で効率的なものになります。ぜひ、ご自身のプロジェクトのソースコードでListingファイルを確認してみてください!

コメント