「えっ、予約語がない?」PL/Iの不思議な世界と、ピクチャ文字が操る「仮想小数点」の魔法
こんにちは。長年メインフレームの深淵を見つめてきたシステムアーキテクトです。
JavaやCOBOLの経験がある皆さんにとって、PL/I(ピーエル・ワン)という言語は、まるで「ルールが緩いようでいて、実は非常に奥深い迷宮」のように見えるかもしれません。
今日は、PL/Iを扱う上で避けては通れない「データ宣言」の面白さと、特に皆さんが最初に戸惑うであろう「ピクチャ指定(PIC)」の秘密について、現場の知見を交えてお話ししましょう。
—
1. 「予約語」という概念を忘れてください
多くの言語では `IF` や `THEN` といったキーワードが予約されており、変数名に使うことはできませんよね。しかし、PL/Iには「予約語」が存在しません。
例えば、こんなコードが書けてしまいます。
DCL IF FIXED DEC(5); / 変数名としてIFを使ってしまう /
IF = 10; / これが変数への代入になる /
これ、初学者は非常に混乱します。「え、IFって制御構文じゃないの?」と思いますよね。コンパイラは、その位置関係や文脈から「ああ、これは変数だな」「これは制御文だな」と文脈判断しています。自由度が高い反面、可読性を保つには「変数名には予約語っぽい名前を使わない」という、現場の暗黙の了解(コーディング規約)が非常に重要になるのです。
—
2. ピクチャ文字 ‘9’ と ‘V’ が作る「仮想の小数点」
さて、今日のメインディッシュです。メインフレームの世界では、お金や物理量を扱う際、浮動小数点のような誤差を嫌い、固定小数点数を好んで使います。
ここで登場するのが `PICTURE` 句です。
例えば `DCL PRICE PIC ‘999V99’;` と書いたとき、これは何を意味するのでしょうか?
‘V’ は「そこに小数点があるはずだ」という意思表示
‘V’ は Virtual(仮想) の頭文字だと覚えてください。物理的にメモリ上にドット(.)が刻まれるわけではありません。
- `PIC ‘999V99’` は、合計5桁の数字を保持し、「下から2桁目に小数点があるものとして扱え」というコンパイラへの命令です。
なぜこんな面倒なことをするのか?
答えは「演算時の自動スケーリング」にあります。
PL/Iのコンパイラは、演算を行う際、この ‘V’ の位置を基準にして、小数点位置が異なる数値同士を自動的に桁合わせしてくれます。
DCL A PIC ’99V99′; / 12.34 を保持 /
DCL B PIC ‘999V9’; / 123.4 を保持 /
DCL C PIC ‘9999V99’;
C = A + B;
/
コンパイラは自動的に以下の計算を行います:
012.34
+ 123.40
———-
135.74
この「自動桁合わせ(アライメント)」こそが、PL/Iが基幹システムで長年愛されてきた理由の一つです。
/
—
3. 実践:現場でよく見る「ありがちな罠」
現場の移行プロジェクトでよくあるトラブルは、「PICで定義した変数をそのまま計算に使ってしまうこと」です。
PIC指定された変数は、内部的には「文字(EBCDICコード)」として扱われる性質があります。計算するたびにコンパイラが「数値への変換」を裏で行うため、大量データを処理するバッチプログラムでは、これがオーバーヘッドになることがあります。
【現場のアドバイス】
- 計算用には `FIXED DEC` や `FIXED BIN` を使う:
計算ロジックの中核では、純粋な数値型を使いましょう。
- 出力・帳票用には `PIC` を使う:
`PIC ‘ZZZ,ZZ9.99’` のように、ゼロサプレス(不要な0を消す)やカンマ編集が必要なときは、最後の最後に `PIC` 型へ代入するのがスマートな作法です。
—
まとめ:PL/Iは「厳格な親切心」の塊
PL/Iの仕様は、一見すると「なぜこんなに自由なの?」「なぜこんなに細かく指定するの?」と感じるかもしれません。しかし、これらは全て「計算誤差を絶対に許さない」「メモリ消費を限界まで最適化する」という、メインフレームならではの哲学に基づいています。
‘V’ を使ったスケーリングも、慣れてしまえば「小数点位置のズレ」という計算ミスからあなたを守ってくれる強力な盾になります。
まずは怖がらず、`DCL` で変数を宣言し、`PUT LIST` で結果を出力して、その挙動を遊ぶように確かめてみてください。メインフレームの深淵は、意外と温かく皆さんを待っていますよ!
何か具体的なコードで詰まっていることがあれば、いつでも聞いてくださいね。一緒に紐解いていきましょう。
