メインフレームの世界へようこそ。JavaやCOBOLの経験がある方なら、PL/Iという言語の「何でも詰め込める万能感」に最初は少し驚くかもしれませんね。
今日は、PL/Iのパフォーマンスを語る上で避けては通れない、「ALIGNED(境界調整)」と「UNALIGNED(境界調整なし)」という、メモリと速度のトレードオフについて紐解いていきましょう。
—
1. なぜ「整列」が必要なのか?:ホテルの部屋割りの例え
まず、コンピュータのメモリを「ホテルの廊下」だと想像してみてください。
- ALIGNED(整列): 1人部屋、2人部屋、4人部屋と、部屋の大きさに合わせて必ず「区切りのいい場所」から入居させます。チェックインは早いですが、区切りが悪くて空きスペース(パディング)が多くなります。
- UNALIGNED(詰め込み): 空きがあればどこでもいいから詰めて入居させます。部屋は無駄なく埋まりますが、掃除や荷物の運び出し(CPUのアクセス)には少し時間がかかります。
PL/Iでは、デフォルトがデータ型によって異なるため、この「整列」を意識しないと思わぬメモリ消費や、パフォーマンスの低下を招くことがあるんです。
—
2. 構造体でのパディング:見えない「空白」の正体
特に構造体(STRUCTURE)を定義するとき、この属性は非常に重要です。以下のコードを見てみましょう。
/i
/ パディングが発生する例 /
DECLARE 1 EMPLOYEE ALIGNED,
2 ID FIXED BIN(31), / 4バイト /
2 INITIAL CHAR(1); / 1バイト /
/ メモリ配置イメージ /
/ [ID(4byte)][INITIAL(1byte)][PADDING(3byte)] /
`ALIGNED`を指定すると、`INITIAL`の後に、次のデータが「区切りのいい位置」から始まるように、自動的に3バイトのパディング(隙間)が挿入されます。これが「メモリ効率」を犠牲にして「アクセス速度」を稼ぐPL/Iの戦略です。
逆に`UNALIGNED`を指定すると、この隙間が消滅します。
/i
/ メモリを節約する例 /
DECLARE 1 EMPLOYEE UNALIGNED,
2 ID FIXED BIN(31),
2 INITIAL CHAR(1);
/ メモリ配置イメージ /
/ [ID(4byte)][INITIAL(1byte)] (パディングなし!) /
—
3. どちらを選ぶべきか?実務での判断基準
「じゃあ、全部`UNALIGNED`にすればメモリが節約できて最強じゃないか!」と思うかもしれませんが、そう単純ではないのがメインフレームの奥深いところです。
ALIGNED を選ぶべきケース
- 計算処理が中心のプログラム: CPUは「4バイトの境界」にあるデータに一発でアクセスするのが最も得意です。頻繁に数値計算を行う構造体なら、迷わず`ALIGNED`です。
- 外部インターフェース: 他のシステムや言語(COBOLなど)とバイナリデータをやり取りする場合、相手側も境界調整を前提としていることが多いです。
UNALIGNED を選ぶべきケース
- 大量のデータ配列: メモリを数百万件確保するような配列の場合、`ALIGNED`によるパディングだけで数十メガバイトの無駄が出ることも。メモリ制限が厳しい環境では`UNALIGNED`が救世主になります。
- ストレージへの書き込み: ファイルに直接書き出すデータであれば、隙間だらけのデータよりも、コンパクトに詰まったデータの方がI/O効率が良くなることがあります。
—
4. スペシャリストからのアドバイス
初めてPL/Iを触る方が最もハマりやすいのが、「意図せずデフォルト属性が適用されてバグる」という現象です。
PL/Iでは、コンパイルオプションやブロックの宣言によって、何も指定しない場合のデフォルトが変わることがあります。実務で構造体を定義する際は、「面倒でも必ずALIGNEDかUNALIGNEDを明示する」。これがトラブルを未然に防ぐ、ベテランの作法です。
/i
/ 良いコードの例:明示的に属性を指定する /
DECLARE 1 DATA_REC UNALIGNED,
2 KEY_VAL CHAR(10),
2 AMT FIXED DEC(9,2);
—
最後に:怖がらなくて大丈夫です
「境界調整」という言葉を聞くと難しく感じるかもしれませんが、要は「スピードとスペースのどちらを優先するか?」というトレードオフの選択をしているだけです。
もしマイグレーション中に「なぜかメモリ使用量が跳ね上がった」「計算結果が合わない」なんてことがあれば、真っ先にこの`ALIGNED`属性を疑ってみてください。PL/Iは、あなたが書いた通りに、しかし驚くほど忠実にメモリを操作してくれます。
これからも、このレガシーで力強い言語を一緒に楽しんでいきましょうね。何かあれば、いつでも聞きに来てください。
