伝説の言語「PL/I」へようこそ!:変数名に予約語がない不思議と、オーバーフローの罠
こんにちは。メインフレームの深淵へようこそ。
JavaやCOBOLといった現代的な言語に慣れていると、PL/I(ピーエルワン)という言語は、まるで「自由すぎる古の魔法」のように映るかもしれません。
今回は、PL/I入門者が最初にぶつかる「識別子の不思議」と、基幹システムのバッチ処理で最も恐れられる「算術オーバーフロー(桁あふれ)」の制御について、現場の知見を交えて紐解いていきましょう。
—
1. 「予約語」という概念がない世界
まず驚くのが、PL/Iには「予約語(Keyword)」が存在しないという点です。
「えっ、`IF`とか`DO`とかあるじゃない?」と思いますよね。実はこれ、厳密には「予約」されているのではなく、「文脈によってそう解釈される」だけなのです。
これは何を意味するかと言うと、極端な話、こんな宣言ができてしまいます。
/i
/ 極端な例:予約語を識別子として使ってしまう /
DECLARE IF FIXED BIN(15);
DECLARE THEN FIXED BIN(15);
IF = 10; / 変数IFに10を代入 /
THEN = 20; / 変数THENに20を代入 /
コンパイラは「この位置に来る単語は文法的にIF文の開始ではないから、これは変数名だな」と賢く判断します。ただし、現場のコードでこれをやると保守担当者が泣きを見ますので、絶対に真似しないでくださいね。「自由だけど、ルールは守る」のが一流のメインフレーマーです。
—
2. 算術オーバーフローと「ON SIZE」の守護神
さて、本題の「算術オーバーフロー」です。
COBOLでいう`ON SIZE ERROR`ですが、PL/Iでは`ON SIZE`ユニットを使います。
基幹システムでは、計算結果が変数の桁数(精度)を超えてしまうと、データが切り捨てられたり、予期せぬ値になってしまったりします。これを見逃すと、決算処理でとんでもない金額の差異が生まれる……なんて悪夢が待っています。
算術オーバーフローが発生する仕組み
PL/Iでは、計算を行う際に「計算結果を格納する一時的な領域」の精度が自動的に決定されます。ここで、宣言した変数の桁数を超えてしまうと、例外が発生するのです。
/i
/ 固定小数点数での計算例 /
DECLARE A FIXED DECIMAL(5, 0) INIT(99999);
DECLARE B FIXED DECIMAL(5, 0) INIT(2);
DECLARE C FIXED DECIMAL(5, 0);
ON SIZE BEGIN;
PUT SKIP LIST(‘警告:計算結果が桁あふれしました!’);
/ ここでログを出したり、異常終了を回避する処理を記述 /
END;
C = A B; / 99999 2 = 199998 となり、5桁には収まらない! /
なぜパフォーマンスが低下するのか?
ここが重要な「現場の知見」です。
`ON SIZE`属性を有効にしてコンパイルすると、コンパイラは「すべての演算のたびに、桁あふれが起きていないか監視せよ」という追加の命令(チェックコード)を生成します。
現代のCPUは高速ですが、数百万件のレコードを処理するバッチプログラムにおいて、全ての演算でこの監視が走ると、無視できないオーバーヘッドになります。「安全を買うか、速度を優先するか」。これが我々アーキテクトが常に悩むポイントです。
—
3. 実践:現場で使うべき「ON SIZE」の作法
もしあなたがバッチ改修を任されたなら、まずは「どこで桁あふれが起きる可能性があるか」を特定しましょう。闇雲に全体を監視するのではなく、境界値チェックが必要なロジックに限定して`ON SIZE`を適用するのがスマートです。
/i
/ 安全かつ効率的な処理のヒント /
BEGIN;
/ スコープを限定してONユニットを定義 /
ON SIZE BEGIN;
/ エラーログ出力とリカバリ処理 /
CALL ERROR_HANDLER(‘計算エラー発生’);
END;
/ ここで計算ロジックを実行 /
TOTAL_AMOUNT = PRICE QUANTITY;
END;
先輩からのアドバイス
1. 変数の宣言をケチらない: `FIXED DECIMAL`の桁数は余裕を持って設計しましょう。「これで足りるだろう」という思い込みが、一番のバグの温床です。
2. コンパイラオプションの確認: `SIZE`オプションを付けると全てを監視しますが、特定の箇所だけなら`SIGNAL SIZE`などを使って手動制御することも可能です。
3. 怖がらないで: PL/Iは歴史が長い分、強力なデバッグ機能も備わっています。最初は奇妙に見えるかもしれませんが、一度掴んでしまえば、これほど「計算に強い」言語はありません。
—
いかがでしたか?
「予約語がない」という自由と、「ON SIZE」という責任。PL/Iは、プログラマの技量がそのまま品質に直結する、非常にやりがいのある言語です。
最初は戸惑うこともあるかと思いますが、一つずつ動かして、コンパイラの「言い分」を聞いてあげてください。メインフレームの世界で、あなたのコードが確かな処理を実行する日を楽しみにしています!
