【入門編】ALIGNED属性とUNALIGNED属性のメモリ効率 – PL/Iの基本構文とデータ制御実践ガイド

メインフレームの世界へようこそ。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は、あなたが書いた通りに、しかし驚くほど忠実にメモリを操作してくれます。

これからも、このレガシーで力強い言語を一緒に楽しんでいきましょうね。何かあれば、いつでも聞きに来てください。

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