PL/Iの世界へようこそ!浮動小数点の「深淵」と、自由すぎる変数名の話
メインフレームの世界に足を踏み入れた皆さん、ようこそ!
JavaやCOBOLといった、整然とした言語に慣れ親しんだ方にとって、PL/I(ピー・エル・ワン)は時に「自由すぎて怖い」と感じるかもしれません。でも大丈夫。歴史あるこの言語は、実は非常に柔軟で、一度コツを掴めばこれほど頼りになる相棒はいません。
今回は、PL/Iのちょっと変わった「名前の付け方」と、エンジニアを悩ませる「浮動小数点」の正体について、現場の知見を交えて紐解いていきましょう。
—
1. PL/Iに「予約語」がない?自由すぎる命名規則
他の言語では `IF` や `THEN` といったキーワードは変数名に使えませんよね。ところがPL/Iには、厳密な意味での「予約語」が存在しません。
どういうことかというと、PL/Iのコンパイラは「文脈」で判断します。例えば、こんなことができてしまいます。
/i
/ PL/Iではこんな変な名前も許されてしまいます /
DECLARE IF FIXED BIN(15);
DECLARE THEN FLOAT BINARY(21);
IF = 10; / 変数IFに10を代入 /
THEN = 3.14; / 変数THENに3.14を代入 /
/ コンパイラは「ここがIF文の開始か、変数への代入か」を文脈で読み解きます /
IF IF > 5 THEN THEN = 0;
一見めちゃくちゃに見えますが、これは「既存のプログラムに新しい命令を追加しても、過去の変数名と競合しない」という、巨大な基幹システムを維持するための設計思想の現れです。とはいえ、可読性を下げるので現場では絶対に真似しないでくださいね(笑)。
—
2. 浮動小数点の正体:IEEE 754 vs IBM形式
さて、本題の浮動小数点です。PL/Iには `FLOAT BINARY` と `FLOAT DECIMAL` がありますが、初心者が一番混乱するのは「結局、メモリの中でどうなってるの?」という点ですよね。
FLOAT BINARY(2進数浮動小数点)
これは、Javaの `float` や `double` と同じIEEE 754形式に近いものです。計算が非常に高速で、CPUが直接処理できるため、科学技術計算や統計処理で重宝されます。
FLOAT DECIMAL(10進数浮動小数点)
こちらはメインフレーム特有の「IBM形式」に由来します。人間が書いた10進数の数値を、そのままの精度で保持することに長けています。金融計算などで「10進数での誤差」を嫌う場合に選ばれます。
—
3. 精度指定とストレージ消費の現実
PL/Iの面白いところは、`PRECISION`(精度)を自分で指定できる点です。
/i
/ ストレージ消費の例 /
DECLARE VAL1 FLOAT BINARY(21); / 短精度:通常4バイト /
DECLARE VAL2 FLOAT BINARY(53); / 倍精度:通常8バイト /
DECLARE VAL3 FLOAT DECIMAL(6); / 6桁精度:4バイト /
DECLARE VAL4 FLOAT DECIMAL(15); / 15桁精度:8バイト /
- なぜ指定するのか?
メインフレームのバッチ処理では、メモリを無駄にしないことが美徳とされます。もし計算結果が6桁で十分なら、わざわざ8バイト(倍精度)を使う必要はありません。必要な精度だけを確保し、ストレージを節約する。これが「メインフレームの職人芸」です。
- 注意点:
Javaから移行する際、安易に `FLOAT BINARY(53)` を使いたくなりますが、「本当にその精度が必要か?」を常に問いかけてください。無駄に精度を上げると、計算速度が低下するだけでなく、移行元のCOBOL等のデータ定義と一致せず、意図せぬ丸め誤差のトラブルを招くことがあります。
—
最後に:怖がる必要はありません
PL/Iは古い言語ですが、その設計思想は現代のプログラミングにも通じる「堅牢さ」と「効率」への執念に満ちています。
- 変数名は、読み手が困らないようにルールを決めましょう。
- 浮動小数点は、用途(計算速度重視か、10進数精度重視か)で選び分けましょう。
もし、コンパイルエラーが出ても大丈夫。それはコンパイラが「あなたの意図を正しく解釈できませんでした」と優しく教えてくれているだけです。一つずつ紐解いていけば、必ずPL/Iはあなたの強力な味方になります。
また次回の技術解説でお会いしましょう。ハッピー・コーディング!
