【入門編】PIC ‘9’と’V’を用いた固定小数点数の定義と内部挙動 – PL/Iの基本構文とデータ制御実践ガイド

「えっ、予約語がない?」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` で結果を出力して、その挙動を遊ぶように確かめてみてください。メインフレームの深淵は、意外と温かく皆さんを待っていますよ!

何か具体的なコードで詰まっていることがあれば、いつでも聞いてくださいね。一緒に紐解いていきましょう。

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