導入
メインフレーム開発において、ソースコードをコンパイルする前に実行される「プリプロセッサ」は非常に強力なツールです。中でも%DECLARE(%DCL)で定義するプリプロセッサ変数は、コードの自動生成や、環境に応じた条件付きコンパイルを可能にします。なぜこれが重要かというと、冗長なコード記述を省き、修正漏れによるバグを未然に防ぐことができるからです。今回は、この「コンパイル時のみに存在する変数」の基礎と実践的な使い方を解説します。
基礎知識
プリプロセッサ変数は、通常のプログラム変数(実行時に値を持つもの)とは全くの別物です。これはコンパイル(プリプロセス)時にのみ存在し、コンパイラに対して「どのコードを生成するか」「どの行を無視するか」を命令するためのメタ情報として機能します。属性には数値用のFIXED BINARYと、文字列用のCHARACTERがあります。これらを活用することで、特定のデバッグコードの埋め込みや、テーブル定義の繰り返し生成を自動化できます。
実装/解決策
プリプロセッサ変数は、%DCLステートメントで宣言し、%IFや%DOなどのプリプロセッサ制御ステートメントと組み合わせて使用します。例えば、本番環境とテスト環境でログ出力の有無を切り替えたい場合、変数の値を変更するだけでソースコードを書き換えることなく、コンパイル結果を制御可能です。
サンプルプログラム
以下のコードは、プリプロセッサ変数を用いて、コンパイル時にメッセージの出力フラグを制御する例です。
/ %DCLでプリプロセッサ変数を宣言 /
%DCL DEBUG_MODE FIXED;
/ フラグの値を設定(1ならデバッグ有効) /
%DEBUG_MODE = 1;
%IF DEBUG_MODE = 1 %THEN %DO;
/ デバッグモードが有効な場合のみ、以下のコードがコンパイルされる /
PUT SKIP LIST (‘デバッグ情報: 処理を開始します’);
%END;
/ 通常の処理は常にコンパイルされる /
PUT SKIP LIST (‘メイン処理を実行中…’);
/ コンパイル後のイメージ:
DEBUG_MODEが1の場合:
PUT SKIP LIST (‘デバッグ情報: 処理を開始します’);
PUT SKIP LIST (‘メイン処理を実行中…’);
/
応用・注意点
プリプロセッサ変数の扱いで最も注意すべきは、「デバッグの難しさ」です。プリプロセッサ変数が複雑に絡み合うと、実際のソースコード上では見えない「展開後のコード」が生成されます。現場でトラブルが発生した際は、コンパイラオプションの「SOURCE」や「MACRO」などを活用し、プリプロセス後のソースリストを出力させて、期待通りのコードが生成されているか確認する癖をつけましょう。現代の言語にはない概念のため、オープン系へ移行する際は、これらのロジックを「実行時のフラグ」に置き換える設計変更が必要になる点も忘れないでください。

コメント