【入門編】INDEX関数による検索アルゴリズムとパフォーマンス特性 – PL/Iの基本構文とデータ制御実践ガイド

ようこそ、メインフレームの世界へ。

JavaやCOBOLという素晴らしい武器を携えてこの世界に足を踏み入れた皆さんは、今まさに「PL/I(ピーエル・ワン)」という、かつてIBMが「最強の言語」を目指して作り上げた巨大な城の入り口に立っています。

初めて見るPL/Iのコードは、少し無骨で、まるで古代の遺物のように見えるかもしれませんね。でも安心してください。紐解いてみれば、その設計思想は極めて合理的で、現代の言語にも通じる優しさを秘めています。

今日は、そんなPL/Iのデータ処理の基本、「INDEX関数」を入り口に、メインフレーム特有の文字列操作の世界を覗いてみましょう。

1. PL/Iプログラムの「骨格」を知る

まずは、PL/Iがどのようにプログラムを構成しているかを見てみましょう。

/i
/ プログラムの入り口はPACKAGEやPROCEDUREで定義します /
SEARCH_SAMPLE: PACKAGE;

/ メイン処理のエントリポイントにはOPTIONS(MAIN)を付けます /
MAIN_PROC: PROCEDURE OPTIONS(MAIN);

DCL TARGET_STR CHAR(20) VAR INIT(‘IBM MAINFRAME’);
DCL SEARCH_KEY CHAR(5) VAR INIT(‘MAIN’);
DCL POS FIXED BIN(31);

/ ここにINDEX関数のロジックが入ります /
POS = INDEX(TARGET_STR, SEARCH_KEY);

END MAIN_PROC;

END SEARCH_SAMPLE;

JavaのクラスやCOBOLのIDENTIFICATION DIVISIONに相当するものが、この`PACKAGE`や`PROCEDURE`です。`DCL(DECLARE)`は変数宣言ですが、ここで指定する`CHAR`(文字型)や`FIXED BIN`(固定小数点)といった属性が、メインフレーム特有のメモリ管理の「きめ細やかさ」を物語っています。

2. INDEX関数の挙動:魔法の杖の仕様

文字列検索を行う`INDEX(source, target)`関数は、非常に強力ですが、いくつか「知っておくべき作法」があります。

検索対象が「空文字」だったら?

もし、検索キー(target)に空文字(長さ0の文字列)を指定したらどうなると思いますか?
実はPL/IのINDEX関数は、「空文字はどこにでも存在する」と解釈します。そのため、結果は常に「1」を返します。これはバグではなく仕様です。もし「見つからない場合に0」を期待するロジックを組むなら、事前に`LENGTH`関数で空文字チェックを行うのが、基幹システムの現場で生き残るための「お作法」です。

計算量とパフォーマンス特性

INDEX関数は、内部的に非常に高度に最適化されたマシンコードで動作します。
計算量は基本的には $O(N \times M)$(Nは対象文字列、Mは検索文字列の長さ)ですが、メインフレームのコンパイラは、この関数を非常に効率的なハードウェア命令(System zの命令セット)に翻訳します。

大規模なバッチ処理で数百万件のレコードを回す場合、自作のループで一文字ずつ比較するよりも、標準の`INDEX`関数を使う方が、遥かに高速かつ安全です。「標準関数を信じろ」。これがメインフレーム開発の鉄則です。

3. 実務で役立つ「データ制御」のヒント

PL/Iのデータ宣言で、初心者が一番戸惑うのが`CHAR(N) VAR`と`CHAR(N)`の違いです。

  • `CHAR(20)`:常に20バイトを確保します。足りなければ空白で埋め、多ければ切り捨てます。
  • `CHAR(20) VAR`:実際に使った文字数+長さ情報(VARYING)を保持します。

データベース(DB2)との親和性を考えると、固定長の`CHAR`を使う場面が多いですが、内部ロジックで文字列を結合・検索する場合は`VAR`を使うと、`TRIM`(空白除去)のストレスから解放されます。

実践:INDEX関数を使った検索処理

現場の改修でよくある「特定のコードが含まれているか調べる」パターンを例に挙げます。

/i
/ 文字列検索のサンプル /
IF INDEX(DATA_BUFFER, ‘ERROR’) > 0 THEN DO;
/
INDEX関数が見つけた場合は「1以上の位置」を返します。
見つからなかった場合は「0」を返します。
この「0かそれ以外か」で判断するのがPL/I流のスマートな書き方です。
/
PUT SKIP LIST(‘エラーコードが見つかりました’);
END;

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

PL/Iは、一見すると命令的で厳格に見えますが、実は非常に強力な「道具箱」です。今回紹介した`INDEX`関数一つとっても、何十年もの間、数兆件のトランザクションを支え続けてきた実績があります。

皆さんがJavaやCOBOLで培った「論理的に考える力」があれば、PL/Iを攻略するのは決して難しくありません。むしろ、メモリの隅々まで意識したコードを書く楽しさに、きっとハマるはずです。

もし分からないことがあれば、いつでもまた聞きに来てください。この巨大なメインフレームという城の中には、まだまだ面白い仕掛けがたくさん隠されていますから。それでは、良き開発ライフを!

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