こんにちは!IBMメインフレームの世界へようこそ。
普段JavaやCOBOLに慣れ親しんでいる方にとって、PL/Iは少し「古風で堅苦しい、謎の多い言語」に見えるかもしれませんね。でも、安心してください。PL/Iは、その名の通り「Programming Language One(言語の決定版を目指した)」という名の通り、非常に理にかなった設計思想を持っています。
今回は、メインフレームの性能を左右する「数字の扱い」、特に`FIXED BINARY`という型について、現場の知見を交えて紐解いていきましょう。
—
1. なぜPL/Iには「数字の型」がこんなに多いのか?
Javaなら`int`や`long`、COBOLなら`PIC S9(9) COMP`といった具合に、言語によって整数の扱い方は決まっていますよね。PL/Iが面白いのは、「メモリの節約」と「CPU処理効率」のバランスを、プログラマが細かく指定できるという点です。
その中でも最も基本となるのが`FIXED BINARY`です。これは「2進数(バイナリ)で値を保持する整数」という意味です。
FIXED BIN(15) と FIXED BIN(31) の正体
この括弧の中の数字は「ビット数」を指しています。
- FIXED BIN(15):合計16ビット(符号1ビット+数値15ビット)。つまり、約2バイトの整数です。
- FIXED BIN(31):合計32ビット(符号1ビット+数値31ビット)。つまり、約4バイトの整数です。
「なぜ16や32ではなく15や31なのか?」と疑問に思いますよね。これは、「符号ビット(プラスかマイナスか)を別に数える」というPL/Iの歴史的経緯によるものです。最初は少し奇妙に感じるかもしれませんが、「最大値(レンジ)」を指定していると捉えると分かりやすいですよ。
—
2. 現場でなぜ「(15)か(31)か」が議論になるのか?
「メモリが安い現代、わざわざ(15)を使う必要があるの?」と思われるかもしれませんが、メインフレームのバッチ処理では、これが数千万件のループ処理の速度に直結します。
レジスタとメモリの最適化の話
IBMの汎用機(z/Architecture)のCPUは、32ビット(4バイト)単位でのレジスタ演算が非常に得意です。
- FIXED BIN(31)を使う場合:CPUのレジスタにピッタリ収まるため、演算は一瞬です。現代のシステムでは、基本は迷わず(31)でOKです。
- FIXED BIN(15)を使う場合:メモリ領域は半分で済みますが、演算のたびにCPU側で「符号拡張(16ビットから32ビットへ引き伸ばす処理)」という一手間が発生することがあります。
結論: メモリが極端に逼迫している配列データ以外は、基本は `FIXED BIN(31)` を選ぶのが、現代のIBMメインフレームにおける「最も速く、バグを生まない」最適解です。
—
3. 実践:PL/Iのプログラム構造とデータ宣言
では、実際にプログラムを書いてみましょう。PL/Iは、`PACKAGE`の中に`PROCEDURE`を配置し、`OPTIONS(MAIN)`でエントリポイントを指定するのが基本です。
1
MY_PROG: PACKAGE;
/
- メインの処理ブロック
- OPTIONS(MAIN)は、ここがプログラムの開始地点であることを示します
/
MAIN_PROC: PROCEDURE OPTIONS(MAIN);
/ 2バイト整数:カウンターやフラグなど、値が小さいものに利用 /
DCL LOOP_COUNT FIXED BIN(15) INIT(0);
/ 4バイト整数:計算処理のメイン(基本はこちらを推奨) /
DCL TOTAL_AMOUNT FIXED BIN(31) INIT(0);
/ 簡単な加算処理 /
LOOP_COUNT = 100;
TOTAL_AMOUNT = TOTAL_AMOUNT + 5000;
PUT SKIP LIST(‘処理完了。TOTALは:’, TOTAL_AMOUNT);
END MAIN_PROC;
END MY_PROG;
このコードのポイント
1. DCL (DECLARE): データの宣言です。「これを使うぞ!」という宣言を先に行うのは、少し古い言語の作法ですが、これによってコンパイラがメモリ配置を完璧に最適化してくれます。
2. INIT: 変数宣言と同時に初期値を入れることができます。変数の「ゴミ値」問題に悩まされないための親切設計ですね。
3. 大文字ベース: もちろん小文字でも動きますが、メインフレームの伝統として大文字で書くと、ベテランのエンジニアからも「おっ、わかってるね」と思われるかもしれません。
—
最後に:怖がらなくて大丈夫です
PL/Iの宣言は、最初は複雑に見えるかもしれませんが、それは「ハードウェアの能力を極限まで引き出すための調整ネジ」が多いだけのことです。
「とりあえず最初は(31)にしておこう」
「配列が大きすぎてメモリが足りない時だけ(15)を検討しよう」
このくらいのスタンスで触れてみてください。一つずつ紐解いていけば、これほど柔軟で力強い言語は他にありません。また何か迷ったときは、いつでもこのブログを覗きに来てくださいね。
あなたのメインフレームライフが、素晴らしいものになりますように!
