【入門編】PL/Iプリプロセッサ(%INCLUDE, %IF, %REPLACE)の展開順序 – PL/Iの基本構文とデータ制御実践ガイド

PL/Iの深淵へようこそ:予約語の檻がない自由と、プリプロセッサの魔法

こんにちは。メインフレームの世界へようこそ。
JavaやCOBOLという堅牢な言語を使いこなしてきた皆さんにとって、PL/I(Programming Language One)という名前は、どこか歴史の彼方にある「難解で古い言語」のように聞こえるかもしれません。

でも、安心してください。PL/Iは、現代の言語にはない「自由奔放な柔軟性」と、システムを極限までチューニングできる「職人魂」が詰まった、非常に面白い言語なんです。今日は、PL/Iを語る上で欠かせない「命名の自由」と、コンパイル前の裏方である「プリプロセッサ」について、紐解いていきましょう。

1. 「予約語がない」という衝撃

他の言語を経験した方が最初に驚くのが、「PL/Iには明確な予約語が存在しない」という事実です。

Javaなら `if` や `class` を変数名にすることはできませんよね。でもPL/Iでは、コンパイラが「文脈」を判断して読み解いてくれます。

/i
/ 変数名に言語キーワードをそのまま使うという暴挙 /
DCL IF CHAR(10) INIT(‘APPLE’);
DCL THEN CHAR(10) INIT(‘ORANGE’);

/ コンパイラは文脈で正しく識別してくれます /
IF IF = ‘APPLE’ THEN THEN = ‘BANANA’;

これ、最初は「えっ、バグらないの?」と怖くなるかもしれません。しかし、コンパイラは「ここには識別子が来るはず」「ここにはキーワードが来るはず」という文脈を完璧に解析しています。この「自由さ」は、かつてのプログラマたちが、どんな名前でも自由に付けられるようにしたという、懐の深い設計思想の表れなんですよ。

2. プリプロセッサ:コンパイル前の「影の演出家」

PL/Iのコードをコンパイルする際、実はソースコードがそのままコンパイラに渡るわけではありません。その前段階で、プリプロセッサという「影の演出家」がソースを書き換えています。

特に重要なのが、以下の3つの機能です。

%INCLUDE:外部パーツの差し込み

「この定義、他のプログラムでも使うよね?」という時に使うのが `%INCLUDE` です。COBOLの `COPY` 句とほぼ同じ役割ですが、ヘッダーファイルを読み込む感覚に近いです。

%REPLACE:文字列の置換(コンパイル時定数)

`%REPLACE` は、コード内の特定の文字を別な値に置き換えます。

/i
%REPLACE MAX_SIZE BY 100;
DCL MY_ARRAY(MAX_SIZE) FIXED BIN(31);
/ コンパイル時には自動的に配列サイズが100に置換されます /

%IF:条件付きコンパイルの制御

「テスト環境ではこのコードを有効にしたいけど、本番環境では消したい」といった制御が可能です。

/i
%DCL ENV_TYPE CHAR;
%ENV_TYPE = ‘TEST’;

/ コンパイル時、環境に合わせてコードを生成・削除する /
%IF ENV_TYPE = ‘TEST’ %THEN %DO;
PUT LIST(‘デバッグモードが有効です’);
%END;

3. 展開順序を知る:トラブルシューティングの鍵

さて、ここが実務で一番ハマるポイントです。これらのプリプロセッサは「ソースコードの上から順に」処理されます。

もし、`%REPLACE` で定義した名前を、その前に `%INCLUDE` されたファイル内で使おうとするとどうなるでしょうか?

/i
%INCLUDE MY_SETTINGS; / ここで変数を参照したい /
%REPLACE MAX_SIZE BY 100;

答えは「まだ定義されていないのでエラー(または期待通りに動かない)」です。
プリプロセッサは「上から下へ」流れる一本道です。順序を間違えると、まるで魔法の呪文を唱える順番を間違えたかのように、コンパイラは冷たいメッセージを吐き出します。

現場で困ったら、まずはプリプロセッサが展開された後の「展開リスト(Listing)」を確認してください。 多くの環境では、コンパイルオプションで `MACRO` や `LIST` を指定することで、プリプロセッサが書き換えた後の「清書されたソース」を覗くことができます。これができれば、あなたも立派なPL/Iアーキテクトの入り口です。

最後に:怖がらなくて大丈夫

PL/Iは確かに古い仕様かもしれませんが、その分、設計者の意図がダイレクトに反映される面白さがあります。

「予約語がない」という自由は、「何でもできる」という強力な武器です。そしてプリプロセッサは、あなたのコードを動的に変化させる頼もしいパートナーです。

もし現場で不可解な挙動に出会っても、まずは「プリプロセッサがどう解釈したか?」という視点に立ってみてください。そうすれば、複雑なレガシーコードも、一つずつ丁寧に紐解くことができるパズルに変わりますよ。

またいつでも相談しに来てくださいね。あなたのメインフレームライフを応援しています!

タイトルとURLをコピーしました