【PL/I入門】「予約語がない?」PL/Iの不思議な世界と、IF文の賢い書き方
こんにちは。メインフレームの世界へようこそ。
JavaやCOBOLを触ってきた方にとって、PL/Iは時に「ちょっと変わった親戚」のように見えるかもしれません。今回は、そんなPL/Iの「自由すぎて逆に戸惑う」命名規則の秘密と、実務で絶対に知っておくべき「条件式の評価」の深淵について、現場の視点から紐解いていきます。
—
1. 「予約語がない」という衝撃
他の言語では、`IF`や`THEN`といった単語は「予約語」と呼ばれ、変数名に使うことはできませんよね。しかし、PL/Iの世界には驚くべきルールがあります。
PL/Iには、明確な予約語という概念が存在しません。
例えば、こんなコードが書けてしまいます。
/i
/ IFという名前の変数を宣言して、IF文で使うというカオスな例 /
DCL IF FIXED BIN(15) INIT(10);
DCL THEN FIXED BIN(15) INIT(20);
/ コンパイラは文脈で判断します /
IF IF = 10 THEN THEN = 30;
一見「なんて危険な言語なんだ!」と思うかもしれませんが、これはコンパイラが「文脈(Context)」を極めて高度に解析しているからこそ成せる業です。もちろん、可読性を考えると絶対にやるべきではありませんが、「PL/Iは懐が深い」というよりは「文脈で空気を読む言語」だと思っておくと、少し親近感が湧きませんか?
—
2. IF-THEN-ELSEと「短絡評価」の賢い付き合い方
さて、ここからが本題です。基幹システムのバッチ処理において、IF文の効率はそのままランタイムのコストに直結します。
PL/Iの条件式では、短絡評価(Short-circuit evaluation)が行われます。これは、「最初の条件で結果が確定したら、後ろの条件は評価(計算・実行)しない」という仕組みです。
なぜ短絡評価が重要なのか?
例えば、データベースのアクセスカウンタをチェックする処理を考えてみましょう。
/i
/ 不適切な例:重い処理が先に実行される可能性がある /
IF CHECK_DATABASE_STATUS() = 1 & DATA_COUNT > 100 THEN DO;
/ 処理 /
END;
もし `CHECK_DATABASE_STATUS()` が「0(異常)」を返した場合、後ろの `DATA_COUNT > 100` を判定する必要はありませんよね。PL/Iのコンパイラは、`&` (AND) や `|` (OR) で繋がれた条件式を左から順に評価し、結果が確定した時点で残りの評価をサボります。
現場での教訓:
「重い処理(外部関数呼び出しなど)」は必ず式の右側に配置してください。左側で「重い処理」を済ませてしまうと、結局は無駄なCPU時間を浪費することになります。
—
3. 分岐予測と最適化の「リアル」
メインフレームのCPUは、パイプライン処理の塊です。コンパイラはコードを解析し、「このIF文は、ほとんどの場合でTRUEになるはずだ」と推測(分岐予測)して最適化をかけます。
もし皆さんが書くコードの条件式が極端に複雑で、毎回結果がランダムに変わるようなものだと、CPUの分岐予測は外れまくり、性能がガクッと落ちます。
読みやすく、かつ速いコードの書き方
複雑な条件を一つのIF文に詰め込むのは、デバッグの際にも地獄を見ます。以下のように整理するのがプロの作法です。
/i
/ 条件をフラグ変数に分けて、可読性と評価順序を制御する /
DCL IS_VALID_USER BIT(1) INIT(‘0’B);
DCL IS_ACTIVE_SESSION BIT(1) INIT(‘0’B);
/ 判定処理を分割する /
IS_VALID_USER = (USER_ID > 0);
IS_ACTIVE_SESSION = (SESSION_TIME < 3600);
/ シンプルなIF文にすることで、コンパイラも最適化しやすくなる /
IF IS_VALID_USER & IS_ACTIVE_SESSION THEN DO;
/ 処理 /
END;
---
最後に:怖がらなくて大丈夫です
PL/Iは歴史が長く、一見すると「古い、難しい」と思われがちです。しかし、今日お話しした通り、その挙動は非常に論理的であり、コンパイラという「優秀な相棒」が常にコードの文脈を汲み取ってくれています。
「予約語がない」という自由は、「柔軟に書ける」という強力な武器でもあります。まずは今のコードを、少しだけ「コンパイラが読みやすい順序」に並び替えることから始めてみてください。それだけで、あなたの書くバッチ処理は、もっと速く、もっと健やかになるはずです。
次回は、PL/I独特のデータ宣言「`DCL`」と、メモリ配置の妙についてお話ししましょう。それでは、良きメインフレーム・ライフを!
