【入門編】ON SUBSCRIPTRANGEによる配列境界チェック – PL/Iの基本構文とデータ制御実践ガイド

PL/Iの世界へようこそ!配列の「境界線」を賢く守る `SUBSCRIPTRANGE` のお話

こんにちは。長年メインフレームの深淵を見つめてきたアーキテクトです。
JavaやCOBOLの世界からやってきて、今まさに「PL/I」という少し風変わりな、しかし非常にパワフルな言語に向き合っているあなたへ。ようこそ、レガシーの大海原へ。

「PL/Iは難解だ」と噂を聞くかもしれませんが、大丈夫です。ルールさえ掴めば、これほど論理的で美しい言語はありません。今日は、初学者が最初にぶつかる壁のひとつ、「配列の境界線(添字)」の守り方について、現場の知恵を交えてお話ししましょう。

配列の境界を超えてしまう……その時、PL/Iはどうする?

Javaであれば `ArrayIndexOutOfBoundsException` が出てプログラムが止まりますよね。COBOLなら……実は、何も言わずに隣のメモリ領域を書き換えてしまうという「恐ろしい爆弾」を抱えているケースも少なくありません。

PL/Iには、`ON SUBSCRIPTRANGE` という非常に気の利いた仕組みがあります。これは、「配列の添字が定義範囲を超えたら、その瞬間に介入する」という監視員の役割を果たします。

まずは基本構造と「監視員」を配置するコード

PL/Iのプログラムは `PACKAGE` や `PROCEDURE` で構成されます。まずは、この監視員をセットしたコードを見てみましょう。

/i
TEST_PGM: PROCEDURE OPTIONS(MAIN);

/ 10個の要素を持つ配列を宣言します /
DECLARE MY_ARRAY(10) FIXED BIN(31);

/ 監視員をセット!境界を超えたらここに飛んできます /
ON SUBSCRIPTRANGE
BEGIN;
PUT SKIP LIST(‘警告:配列の境界を超えました!’);
/ ここでエラーログを出したり、処理を安全に中断させたりします /
STOP;
END;

/ 意図的に境界を超えてみる(11番目にアクセス) /
MY_ARRAY(11) = 999;

PUT SKIP LIST(‘正常終了’);

END TEST_PGM;

なぜこれが「開発」と「本番」で重要なのか

この `ON SUBSCRIPTRANGE`、実は諸刃の剣です。

  • 開発・テスト環境では「神」:

隠れたバグを即座に検知できます。特にメインフレームのバッチ処理では、境界外へのアクセスは「隣のデータ領域の破壊」に直結します。原因不明のデータ化けで徹夜……なんて事態を防ぐための最強の防壁です。

  • 本番環境では「重い」:

実は、実行時に毎回「範囲内か?」をチェックする命令がCPUレベルで走ります。何百万件ものトランザクションをさばく基幹バッチにおいて、このチェックはわずかですがオーバーヘッド(負荷)になります。

そのため、現場のベテランたちはこうします。
「テスト中は `SUBSCRIPTRANGE` を有効にしてデバッグし、リリース直前のコンパイルオプションでチェック機能をオフにする」

こうすることで、開発の安全性と、本番のパフォーマンスという二兎を追うことができるのです。

メインフレームの現場から、あなたへアドバイス

PL/Iのコードを眺めていると、`FIXED BIN` だとか `CHARACTER(10)` だとか、データ型の宣言が少し独特で戸惑うかもしれません。でも、これらはすべて「限られたメモリをいかに効率よく、かつ安全に使うか」という先人たちの切実な工夫の結晶です。

もしバッチの改修中に「添字が合わない」「データが予期せぬ場所で変わる」という怪奇現象に遭遇したら、まずは `ON SUBSCRIPTRANGE` を書き込んでみてください。暗闇にライトを灯すように、バグの所在がパッと浮かび上がってくるはずです。

PL/Iは古い言語ですが、その設計思想は現代の言語にも通じる「堅牢さ」を求めています。怖がらず、一つずつコードと対話してみてくださいね。

また何か壁にぶつかったら、いつでもここへ聞きに来てください。深淵の先で待っていますよ。

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