メインフレームの世界へようこそ。JavaやCOBOLというモダンで整然とした世界から、この「PL/I」という広大な荒野に足を踏み入れたあなたを歓迎します。
PL/Iは1960年代に生まれた言語ですが、その設計思想は非常に柔軟で、まるで「プログラマの直感を信じる」ような無骨な優しさを持っています。しかし、その優しさは時に、境界線を越えてしまう危険な罠にもなり得ます。
今日は、そんなPL/Iの「深淵」の一端である`SUBSTR`関数と、メモリ管理の危うい境界線について、現場の知見を交えて紐解いていきましょう。
—
1. PL/Iの基本の「型」:まずはここから
PL/Iのプログラムは、`PACKAGE`の中に`PROCEDURE`を入れ子にする構造が基本です。JavaのクラスやCOBOLのプログラムとは少し雰囲気が違いますね。
1
/ メインプログラムの始まり /
HELLO: PROC OPTIONS(MAIN);
/ 変数宣言:CHARACTER(10)は「10文字の箱」という意味です /
DCL MSG CHAR(10) INIT(‘HELLO PL/I’);
PUT SKIP LIST(MSG);
END HELLO;
見ての通り、`DCL`(DECLARE)で変数を宣言します。ここでのポイントは、PL/Iは変数のメモリ配置をプログラマが直接意識できる言語だということです。これが、これから話す「オーバーレイ(領域破壊)」の恐怖と、それゆえの強力なパワーの源泉になります。
—
2. SUBSTR関数の「甘い罠」
文字列を切り出す`SUBSTR`関数。他の言語でもお馴染みですよね。しかし、PL/Iの`SUBSTR`は単なる切り出しツールではありません。実はこれ、「メモリ上の特定範囲へのポインタ」を生成しているようなものなのです。
何が危険なのか?
例えば、10文字の領域しかない変数に対して、15文字目までを要求したらどうなるでしょうか? Javaなら例外(Exception)で止まりますが、PL/I(コンパイルオプションにもよりますが)は「そこにあるメモリを強引に読み取りに行こう」とします。
これが「境界外アクセス」です。
1
DCL DATA_AREA CHAR(5) INIT(‘ABCDE’);
DCL RESULT CHAR(10);
/ 本来は5文字しかないのに、強引に10文字切り出そうとする /
/ これが実行されると、DATA_AREAの隣にある別の変数の領域まで読み込んでしまう /
RESULT = SUBSTR(DATA_AREA, 1, 10);
なぜこれが「怖い」のか
メインフレームの世界では、変数はメモリ上で隣り合って配置されることが多いです。`SUBSTR`で境界を越えて読み込むと、隣の変数の値が混入して表示されます。さらに恐ろしいのは「書き込み」です。
1
/ SUBSTRを左辺に置くと、その領域を直接書き換えます /
/ DATA_AREAの範囲を超えて書き込むと、隣接する変数が「謎の書き換え」を受ける /
SUBSTR(DATA_AREA, 1, 10) = ‘1234567890’;
隣接していた「大切な業務データ」が、あなたのプログラムの一行で壊れる。これがレガシーシステムの現場で時折発生する「原因不明のバグ」の正体の一つです。
—
3. なぜPL/Iはそんなことを許すのか?
「なぜそんな危険な機能があるの?」と不思議に思いますよね。それは、PL/Iが誕生した時代、メモリは極めて貴重な資源であり、限られた領域を最大限に使い回すために、このような「自由なメモリ操作」が不可欠だったからです。
現代のJavaエンジニアから見ると「無法地帯」に見えるかもしれませんが、これは「コンピュータの限界ギリギリまで性能を絞り出すための工夫」だったのです。
—
4. 現場でトラブルを避けるための心得
私たちが現場でトラブルを起こさないために、以下の3つのルールを心に刻んでください。
- 1. 長さを厳密に管理する: `STG`(STORAGE)の境界を意識してください。変数の長さは常に`LENGTH`関数で確認する癖をつけましょう。
- 2. 境界チェックを活用する: コンパイルオプションで`SUBSCRRG`(添字範囲チェック)を有効にするのが一般的です。パフォーマンスはわずかに落ちますが、安全は金で買える安価な保険です。
- 3. 「動的」なメモリ管理を恐れない: `BASED`変数や`POINTER`を使う際は、必ず自分の足元(メモリ配置)を確認してください。
—
最後に:怖がる必要はありません
PL/Iは、確かに「境界線」に無頓着になりがちな言語ですが、それは同時に、あなたがシステムの支配者であることを意味しています。
Javaのように守られた箱の中だけで遊ぶのではなく、メモリという広大な荒野を自分の手で制御する。そんなPL/Iの醍醐味に触れてみてください。一つずつ、コードを追いながら「今、メモリのどこを触っているのか」を想像できるようになれば、あなたはもう立派なメインフレーム・アーキテクトの一歩を踏み出しています。
迷ったときは、いつでも聞いてください。この古くて新しい言語の旅路を、これからも一緒に歩んでいきましょう。
