メインフレームの世界へようこそ。Javaでバリバリとオブジェクトを操ってきた皆さんや、COBOLの「ピクチャ句」に慣れ親しんだ皆さんにとって、PL/Iという言語は少し古風で、しかし非常に強力な「職人の道具」のように見えるかもしれません。
今日は、PL/Iのデータ宣言の中でも、特にシステム性能のボトルネックになりやすい「FIXED BINARY」の深淵についてお話しします。ここを理解すると、皆さんが書くバッチプログラムの実行時間が、劇的に変わる可能性がありますよ。
—
1. FIXED BINARY(15) と (31) の「正体」を見極める
PL/Iで数値を扱うとき、`FIXED BINARY`という型を使います。これは文字通り「固定小数点数のバイナリ表現」です。
- FIXED BINARY(15): ハーフワード(2バイト)。16ビットで表現されます。
- FIXED BINARY(31): フルワード(4バイト)。32ビットで表現されます。
これらは、IBMメインフレームのCPU(z/Architecture)が最も得意とする「レジスタ演算」に直結しています。Javaで言えば`short`と`int`のようなものですが、決定的な違いは「境界整列(アライメント)」という概念にあります。
なぜ「境界」が重要なのか?
メインフレームのCPUは、メモリからデータを読み出す際、「偶数番地から2バイト」や「4の倍数の番地から4バイト」という特定の区切りで読み出すときに最も高いパフォーマンスを発揮します。
これをアライメントと呼びますが、もし皆さんが不用意に配列や構造体を組むと、CPUは「端数」を処理するために余計なサイクルを回すことになります。これが塵も積もれば山となり、数百万件のレコードを処理するバッチプログラムでは、数分の遅延として現れるのです。
—
2. 実践:効率的なデータ宣言のコツ
では、実際のコードで見てみましょう。PL/Iでは`DECLARE`文で変数を定義しますが、ここでの属性指定が運命を分けます。
/i
/ 効率的なデータ定義の例 /
DCL COUNTER_HALF FIXED BIN(15) ALIGNED; / 2バイト境界に強制配置 /
DCL COUNTER_FULL FIXED BIN(31) ALIGNED; / 4バイト境界に強制配置 /
/ 構造体での配置例 /
DCL 1 MY_RECORD,
5 FIELD_A FIXED BIN(15) ALIGNED, / 2バイトできっちり整列 /
5 FIELD_B FIXED BIN(31) ALIGNED; / ここで2バイトのパディングが自動挿入され、4バイト境界に揃う /
「ALIGNED」と「UNALIGNED」の使い分け
PL/Iには`ALIGNED`(整列)と`UNALIGNED`(詰め込み)という属性があります。
- ALIGNED: CPUが読みやすいよう、メモリの区切りにきっちり配置します。速度は速いですが、メモリ消費は少し増えます。
- UNALIGNED: 境界を気にせず、隙間なくデータを詰め込みます。メモリは節約できますが、CPUがデータを読み込む際に「ズレ」を補正する処理が入るため、演算速度は低下します。
現場のアドバイス:
「メモリが逼迫して仕方がない」という特殊な状況を除き、計算に使う変数は基本的に`ALIGNED`を指定しましょう。特にループ内で何度も加算するカウンタなどは、`ALIGNED`であるか否かでCPUの負荷が目に見えて変わります。
—
3. コンパイラオプションの魔法を信じすぎない
最近のPL/Iコンパイラは非常に優秀で、最適化オプション(`OPTIMIZE(2)`や`OPTIMIZE(3)`など)を付けると、ある程度はコンパイラがよしなにパディングを入れてくれたり、演算順序を入れ替えてくれたりします。
しかし、「プログラマが意図を持って構造を設計すること」に勝る最適化はありません。
コンパイラに頼りすぎると、後から保守する人が「なぜこの構造体はこんなにメモリを食うんだ?」と首を傾げることになります。コードを書く段階で、「この変数は計算に使うから整列させておくべきだ」という意識を持つだけで、皆さんの書くコードは一気に「アーキテクト品質」へ昇華されます。
—
初学者の皆さんへ:怖がらないで
「アライメントとか境界とか、難しそう…」と思う必要はありません。最初は、「計算に使う変数は FIXED BIN(31) ALIGNED をデフォルトにする」と決めてしまうだけでも、十分に安定したシステムが作れます。
PL/Iは、書き手の意図を非常に素直にCPUへ伝える言語です。一つずつ紐解いていけば、これほどロジカルで美しい言語は他にありません。また何か疑問があれば、いつでも聞いてくださいね。現場の知恵を、また少しずつおすそ分けします。
それでは、良いコーディングを!
