【入門編】CHARACTER VARYING型の内部構造と長さ制御 – PL/Iの基本構文とデータ制御実践ガイド

PL/Iの「可変長文字列」を攻略する!CHARACTER VARYINGの裏側を覗いてみよう

こんにちは!メインフレームの世界へようこそ。
普段、JavaやCOBOLに慣れ親しんでいる方にとって、PL/I(ピーエル・ワン)という言語は、まるで「魔法と物理法則が入り混じった不思議な道具箱」のように見えるかもしれません。

特に、今回解説するCHARACTER VARYINGという型は、PL/Iの「古き良き、しかし非常に合理的な」設計思想が詰まった面白いトピックです。今日はこの「可変長文字列」の秘密を、一緒に解き明かしていきましょう。

1. PL/Iには「予約語」がない?名前付けの自由と恐怖

まず、PL/Iを触り始めて最初に驚くのが、「予約語がない」という点です。
Javaなら`class`や`public`は変数名に使えませんが、PL/Iではなんと`IF`という名前の変数を宣言できてしまいます。

/i
/ 極端な例ですが、これもPL/Iでは文法的に許されてしまいます /
DCL IF CHAR(10);
IF = ‘TEST’;

「えっ、何でもありなの!?」と驚かれるかもしれませんが、これは「文脈で判断する」というPL/I独自の設計によるものです。自由度は高いですが、あまりに自由すぎると可読性が落ちてしまいますよね。ですので、現場では「予約語っぽく見える名前は避ける」という暗黙のルール(慣習)が大切にされています。

2. CHARACTER VARYINGの内部構造:先頭の「2バイト」がすべて

では、本題の`CHARACTER VARYING`(可変長文字列)を見ていきましょう。

COBOLの`PIC X(10)`のように固定長なら簡単ですが、PL/IのVARYING型は、メモリ上で少し特別な姿をしています。この型は、「文字列の長さ」を保持するための領域を、データの先頭に持っているんです。

具体的には、先頭の2バイトが「現在の長さ(バイナリ値)」、その後に続くのが「実際の文字列データ」となります。

イメージ図

| 領域 | 役割 |
| :— | :— |
| 第1〜2バイト | 今、何文字入っているかのカウント(2進数) |
| 第3バイト以降 | 実際の文字列データ |

つまり、`DCL STR CHAR(10) VARYING;` と宣言した場合、メモリ上には「2バイトの長さ制御部」+「10バイトのデータ部」の計12バイトが確保されます。この「先頭の2バイト」こそが、PL/Iが可変長を実現するための「心臓部」なのです。

3. SUBSTR関数を使うときの「落とし穴」

PL/Iの強力な武器である`SUBSTR`関数。文字列を切り出す際に重宝しますが、可変長文字列を扱うときは少し注意が必要です。

特に、SUBSTRの結果に対して代入を行う際、「文字列の長さ情報(先頭2バイト)」がどう更新されるかを意識する必要があります。

/i
DCL MY_STR CHAR(20) VARYING;
DCL PART_STR CHAR(5);

/ 初期値を設定 /
MY_STR = ‘IBM_MAINFRAME’;
/ この時点で、先頭2バイトには ’13’ という長さ情報がセットされます /

/ SUBSTRで切り出して操作する例 /
/ MY_STRの4文字目から5文字を取得し、別の変数へ /
PART_STR = SUBSTR(MY_STR, 4, 5);

/ 注意:SUBSTRの戻り値自体を変数のように扱う場合 /
/ コンパイラは「可変長属性」を維持しようとしますが、 /
/ 複雑な代入では長さ情報の不整合が起きないよう、 /
/ 基本的にキャストや一時変数を使うのが安全な設計です /

なぜ気をつけるのか?

もし、あなたが「固定長(CHAR)」と「可変長(CHAR VARYING)」を混在させて演算を行うと、コンパイラは親切にも型変換を行ってくれます。しかし、この変換の裏で「長さ情報をどう付け替えるか」という処理が走るため、メモリを直接操作するようなコード(ポインタ操作など)を書く場合は、この「先頭2バイト」が壊れていないか注意深く見守る必要があります。

4. 今日から使える「賢い付き合い方」

最後に、PL/Iの現場でトラブルを避けるためのアドバイスを3つ。

1. VARYINGの乱用を避ける: パフォーマンスが極端に重要、あるいは他言語とのI/O連携が多い場合は、あえて固定長の`CHARACTER`を使うほうがトラブルが少ないです。
2. 長さの最大値を意識する: `VARYING`であっても最大長は決まっています。定義したサイズを超えて代入しようとすると、例外(ON条件)が発生します。
3. デバッグ時の表示: メインフレームのダンプリストを見るとき、先頭に奇妙な記号(バイナリデータ)が見えたら「ああ、これは長さ情報なんだな」と微笑んであげてください。

PL/Iは歴史が長く、一見すると「古臭い」と思われがちです。ですが、こうして内部構造を知ると、非常に論理的で、コンピュータの仕組みに忠実な言語であることが分かります。

「怖い」と感じるのは、見えない部分が多いから。今回のように「先頭2バイトに長さがある」というルール一つを知るだけで、コードを見る目が劇的に変わるはずです。

もし現場で「変な値が入っている!」とパニックになったら、まずは`DCL`文を見直し、その変数が`VARYING`かどうかを確認してみてくださいね。きっと、そこには合理的な理由があるはずですから。

それでは、次回のメインフレーム・アーキテクト通信でお会いしましょう!

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