【入門編】HBOUNDおよびLBOUNDビルトイン関数による境界値取得 – PL/Iの基本構文とデータ制御実践ガイド

メインフレームの世界へようこそ!PL/Iの「配列の境界」を怖がらずに使いこなそう

こんにちは。メインフレームの世界へ足を踏み入れたばかりの皆さん、ようこそ!
JavaやCOBOLといった言語から来られた方にとって、PL/Iのソースコードは、まるで「暗号のような大文字の羅列」に見えるかもしれません。確かに、IBMメインフレームという歴史ある大地で育ったこの言語には、独特の流儀があります。

でも、安心してください。PL/Iは実は非常に論理的で、一度コツを掴めばこれほど頼りになる相棒はいません。今日は、実務で絶対に避けては通れない、「配列のサイズを測る方法」、つまり `HBOUND` と `LBOUND` について紐解いていきましょう。

そもそも、なぜ「境界」を知る必要があるの?

Javaなどのモダンな言語では、配列に対して `.length` と打てば一発でサイズがわかりますよね。しかし、PL/Iはもっと「古風で厳格」です。

メインフレームのバッチ処理では、外部から渡されたデータや、動的にメモリを確保した配列を扱うことが多々あります。そんな時、「この配列、今どこからどこまでデータが入っているんだっけ?」と迷子になってしまうと、システムは容赦なく「アベンド(強制終了)」という鉄槌を下してきます。

ここで登場するのが、HBOUND(High Bound:上限値)LBOUND(Low Bound:下限値)です。これらは、配列の「端っこ」を教えてくれるGPSのようなものだと考えてください。

基本構造:PACKAGEからPROCEDUREへ

まずはPL/Iの基本的な器を見てみましょう。

/i
/ プログラムの始まりを宣言(パッケージ単位でコンパイルするのが今風です) /
MYPROG: PACKAGE OPTIONS(MAIN);

/ 処理の本体 /
MAIN_PROC: PROCEDURE;

/ ここに処理を書きます /

END MAIN_PROC;

END MYPROG;

`OPTIONS(MAIN)` がついているのが、このプログラムの入り口(エントリーポイント)です。COBOLでいう `PROGRAM-ID` や Javaの `main` メソッドと同じ役割ですね。

HBOUNDとLBOUNDの使い方:実践編

では、実際に配列の境界を取得してみましょう。ここで大切なのは、「配列は1から始まるとは限らない」というPL/I特有の仕様です。

/i
/ 配列の宣言:10番から20番までの要素を持つ配列 /
DCL MY_ARRAY(10:20) FIXED BIN(31);

/ 配列のサイズを判定するルーチン /
GET_BOUNDS: PROCEDURE;
DCL LOW_VAL FIXED BIN(31);
DCL HIGH_VAL FIXED BIN(31);

/ LBOUNDで開始位置(10)を取得 /
LOW_VAL = LBOUND(MY_ARRAY, 1);

/ HBOUNDで終了位置(20)を取得 /
HIGH_VAL = HBOUND(MY_ARRAY, 1);

/ 実際に使うときはこんな風にループを回します /
DO I = LOW_VAL TO HIGH_VAL;
/ ここでMY_ARRAY(I)を安全に処理する /
END;
END GET_BOUNDS;

なぜこれが重要なのか?

もし皆さんが「配列は0から始まるはずだ」と決めつけて `0 TO 20` のループを回したらどうなるでしょう?存在しないメモリ領域を読みに行こうとして、プログラムは一瞬でパニック(S0C4エラーなど)を起こします。

`LBOUND` を使えば、たとえ誰かが宣言を `(0:20)` から `(10:20)` に変更したとしても、プログラム側は何も修正せずに追従できます。これが「保守性の高いコード」というものです。

実務で役立つ「引き出し」:引数として渡された配列

実務では、配列を別のプロシージャに「引数(パラメータ)」として渡すことがよくあります。このとき、受け取った側は配列のサイズを知らないことがありますよね。

そんな時も、`HBOUND` があれば怖くありません。

/i
/ 配列を引数として受け取る処理 /
PROCESS_ARRAY: PROCEDURE(INPUT_ARR);
DCL INPUT_ARR() FIXED BIN(31); / ()は「サイズは後で教えるね」の意味 /

DCL I FIXED BIN(31);

/ 配列のサイズを動的に取得 /
DO I = LBOUND(INPUT_ARR, 1) TO HBOUND(INPUT_ARR, 1);
PUT SKIP LIST(‘値は:’ || INPUT_ARR(I));
END;
END PROCESS_ARRAY;

ここで使った `()` という記述は、「不特定サイズの配列を受け取りますよ」という強力な宣言です。これと `HBOUND` を組み合わせることで、どんなサイズの配列が来ても柔軟に処理できる、堅牢なシステムが作れるようになるのです。

最後に:怖がる必要はありません

PL/Iの構文は、最初は少しだけ「無骨」に見えるかもしれません。しかし、これらはすべて、限られた計算機資源の中で、いかに「事故を起こさず、正確にデータを処理するか」を突き詰めた結果の知恵です。

`HBOUND` や `LBOUND` は、いわばプログラムに対する「安全装置」です。これらを使いこなせれば、もう皆さんは立派なメインフレームエンジニアの第一歩を踏み出したと言っても過言ではありません。

もしまた詰まったら、いつでもここに戻ってきてくださいね。一緒に一つずつ、紐解いていきましょう!

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