こんにちは!メインフレームの世界へようこそ。
JavaやCOBOLの経験がある方にとって、PL/Iは「なんだか古めかしくて、独特な記号が多い難解な言語」に見えるかもしれません。でも安心してください。PL/Iは非常に論理的で、コンピュータのハードウェアを直接制御するような「職人気質」な言語なんです。
今回は、PL/Iの性能を左右する心臓部、メモリ配置の制御についてお話しします。
—
なぜメモリ配置を気にする必要があるの?
現代のプログラミングでは、メモリ容量を気にすることは少ないかもしれません。しかし、メインフレームの世界では、「CPUがデータを読み取る速さ」と「メモリの消費量」のバランスが、バッチ処理の実行時間に直結します。
ここで登場するのが `ALIGN`(境界調整)と `UNALIGNED`(詰め込み)という属性です。これらは、変数という「荷物」を、メモリという「棚」にどう並べるかを決めるルールです。
1. ALIGN:CPUの「読み取りやすさ」を優先する
`ALIGN`は、データを「メモリのキリのいい場所」に配置します。
例えば、4バイトの整数なら、アドレスが4の倍数になる位置に置く、といった具合です。
- メリット: CPUがデータを一度で読み取れるため、アクセスが非常に高速です。
- デメリット: キリのいい場所を確保するために、わざと隙間(パディング)を作ることがあり、メモリを少し贅沢に使います。
2. UNALIGNED:メモリの「節約」を優先する
`UNALIGNED`は、隙間を一切作らず、データを「端から端まで詰め込む」ルールです。
- メリット: メモリを極限まで節約できます。大規模な配列を扱うときには非常に強力です。
- デメリット: データの境界がズレるため、CPUがデータを読み取る際に「半分ずつ2回に分けて読む」ような余計な処理が必要になり、わずかに性能が落ちることがあります。
—
実際にコードで見てみよう
PL/Iでの宣言はこんな感じです。構造体(STRUCTURE)を使って比較してみましょう。
/i
/ パッケージの定義:これがプログラムの大きな箱になります /
MY_TEST_PGM: PACKAGE;
/ メインプログラムの入り口です /
TEST_PROC: PROCEDURE OPTIONS(MAIN);
/ 境界調整を意識したデータ定義例 /
/ 1. ALIGN指定:CPU重視の配置 /
DCL 1 ALIGNED_DATA ALIGNED,
2 ITEM_A FIXED BIN(31), / 4バイト整数 /
2 ITEM_B CHAR(1); / 1バイト文字 /
/ 実際にはITEM_Bの後に3バイトの隙間が入り、合計8バイトになることが多いです /
/ 2. UNALIGNED指定:メモリ節約重視の配置 /
DCL 1 UNALIGNED_DATA UNALIGNED,
2 ITEM_A FIXED BIN(31),
2 ITEM_B CHAR(1);
/ 隙間なし!合計5バイトで詰め込まれます /
/ 処理の開始 /
PUT SKIP LIST(‘ALIGNとUNALIGNEDの使い分けが理解の第一歩!’);
END TEST_PROC;
END MY_TEST_PGM;
—
初学者が押さえておくべき「現場の知恵」
「じゃあ、どっちを使えばいいの?」と迷ってしまいますよね。現場のアーキテクトからのアドバイスは以下の通りです。
- 基本は「デフォルト」を信じる:
PL/Iコンパイラは優秀です。特に指定しなければ、その環境にとって最適な配置を選んでくれます。無理に最適化しようとせず、まずはデフォルトで書きましょう。
- 大量データならUNALIGNED:
数百万件のレコードをメモリ上に展開するようなバッチ処理なら、`UNALIGNED`にすることでメモリ消費を抑え、結果的にページング(ディスクへの退避)を減らして高速化できるケースがあります。
- 外部との連携には注意:
他システムとバイナリ形式でデータをやり取りする場合、この配置ルールが食い違っているとデータが化けます。その時は、相手側の仕様(COBOLの `SYNC` 指定など)に合わせて慎重に制御する必要があります。
—
最後に:怖がる必要はありません
PL/Iのこうした細かな制御は、ハードウェアの性能を限界まで引き出すための「先人たちの知恵」です。最初は戸惑うかもしれませんが、「メモリという限られた資源をどう効率的に使うか」という視点を持つと、まるでパズルを解くような楽しさが湧いてくるはずです。
もし現場で「この変数、なぜこんなにメモリを食うんだ?」という疑問にぶつかったら、ぜひ `ALIGN` 属性を確認してみてください。その一歩が、あなたを一人前のメインフレーム・エンジニアへと確実に近づけてくれますよ。
また次の記事でお会いしましょう!質問があればいつでもコメントくださいね。
