【入門編】DIMENSION属性の多次元配列定義とストレージ配置 – PL/Iの基本構文とデータ制御実践ガイド

PL/Iの多次元配列、実は「メモリという一本の道」を歩いているだけなんです

こんにちは。メインフレームの世界へようこそ。
JavaやCOBOLでバリバリ開発してきた皆さんにとって、PL/Iの「配列」という概念は、少しだけ、いや、だいぶレトロで奇妙に映るかもしれません。

でも安心してください。PL/Iの多次元配列は、決して難解な魔法ではありません。メモリという「一本の細長い道」をどうやって効率よく歩くか、そのルールを知るだけで、皆さんのコードは劇的に美しくなります。今日はその秘密を紐解いていきましょう。

1. そもそもPL/Iの配列はどうなっているの?

PL/Iでの配列宣言は、こんな感じです。

/i
/ 3行 × 4列の配列を宣言 /
DCL MATRIX(3, 4) FIXED BIN(31);

COBOLをご存知の方なら「あ、OCCURS句みたいなものか」と直感されるでしょう。Javaの `int[][] matrix = new int[3][4];` とも似ています。

しかし、ここからが本題です。コンピュータのメモリは、Javaのオブジェクトのようにあちこちに散らばっているわけではなく、「一本の長いテープ」のようなものなんです。このテープの上に、3×4=12個の数字をどう並べるか。そのルールが「行優先(Row-major order)」です。

「行優先」をイメージする

例えば、3行4列の表があるとき、PL/Iはこうやってメモリに書き込みます。

1. 1行目の1列目、2列目、3列目、4列目
2. 2行目の1列目、2列目、3列目、4列目
3. 3行目の1列目、2列目、3列目、4列目

つまり、「左から右へ」詰め込み、行が終わったら次の行へ進む。非常に律儀な性格なんですね。この配置を知っていると、後々「データの局所性」を意識した、爆速で動くプログラムが書けるようになります。

2. コンパイラはどうやって「場所」を探しているのか?

さて、皆さんが `MATRIX(2, 3)` と書いたとき、コンパイラはメモリ上のどこにあるデータかを探し当てる必要があります。これを「オフセット計算」と呼びます。

計算式はこんなイメージです:
`アドレス = 開始位置 + ( (行インデックス – 1) × 列の最大幅 + (列インデックス – 1) ) × 要素のサイズ`

「うわ、面倒くさそう!」と思いましたか?大丈夫です。コンパイラが裏で勝手にやってくれます。ただ、ここで一つだけ覚えておいてほしい「メインフレームの知恵」があります。

ループを書くときの鉄則

多次元配列を回すときは、「最も右側の添字」が一番速く動くようにループを回すことです。

/i
/ 良い例:メモリの並び順通りにアクセスする /
DO I = 1 TO 3;
DO J = 1 TO 4;
MATRIX(I, J) = 0; / 連続したメモリにアクセスするので非常に速い /
END;
END;

逆に、`DO J=1 TO 4; DO I=1 TO 3;` のように添字を逆転させると、メモリを行ったり来たりする「無駄なジャンプ」が発生します。データ量が数百万件規模になる基幹システムでは、このわずかな差が、バッチ処理時間を数分単位で変えてしまうこともあるんですよ。

3. 実践!プログラムの基本構造

最後に、PL/Iの基本骨格となる `PACKAGE` と `PROCEDURE` を使ったサンプルを見てみましょう。

/i
/

  • MAIN_PROG: 多次元配列を扱う基本形

/
MAIN_PROG: PROCEDURE OPTIONS(MAIN);

/ 宣言部:配列の定義 /
DCL MATRIX(3, 4) FIXED BIN(31) INIT((12)0);
DCL (I, J) FIXED BIN(15);

/ 行優先のアクセス例 /
DO I = 1 TO 3;
DO J = 1 TO 4;
/ 行を優先的に埋めていく /
MATRIX(I, J) = I 10 + J;
END;
END;

PUT SKIP LIST(‘配列の2行3列目の値は:’, MATRIX(2, 3));

END MAIN_PROG;

このコードのポイント

  • `FIXED BIN(31)`: これがPL/Iにおける「整数型」の標準です。COBOLの `PIC S9(9) COMP` に相当します。
  • `INIT((12)0)`: 全12要素を0で初期化する、PL/I特有の便利な書き方です。
  • `OPTIONS(MAIN)`: このキーワードがあることで、OSに対して「ここがプログラムの入り口ですよ」と教えています。

最後に:怖がらなくて大丈夫です

PL/Iは、1960年代から現代のクラウド環境まで生き抜いてきた非常に堅牢な言語です。今回解説した「メモリの配置」という概念は、Javaのガベージコレクションの裏側や、C言語のポインタ操作を理解する上でも共通する「コンピュータの根幹」の部分です。

「メモリというテープを、どう効率よく手繰り寄せるか」。
この視点を持つだけで、皆さんはもうPL/Iを操るアーキテクトの入り口に立っています。

また何か気になることがあれば、いつでも聞いてくださいね。現場の悩みは、一つずつ紐解けば必ず解決策が見えてくるものですから。

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