PL/Iの「長さ」に迷わない!VARYING属性とLENGTH関数の深淵を紐解く
皆さん、こんにちは。基幹システムの現場へようこそ。
JavaやCOBOLの世界からやってくると、PL/Iという言語は少しばかり「気難しい職人」のように見えるかもしれませんね。特に「予約語が存在しない」という仕様は、初めて聞くと「じゃあどうやってコンパイラは命令を識別しているの?」と不安になることでしょう。
今回は、そんなPL/Iの中でも、特に多くのエンジニアを悩ませる「文字列の長さ」の扱いについて、現場の視点から優しく、かつ深く解説していきます。
—
なぜPL/Iには「予約語」がないのか?
Javaでは `if` や `while` が予約語ですが、PL/Iにはそれがありません。極端な話、`IF` という名前の変数を宣言してもエラーにはならないのです。
「じゃあ、コンパイラはどうやって判断しているの?」と思いますよね。答えは「文脈(コンテキスト)解析」です。PL/Iのコンパイラは、その位置に置かれた単語が「変数として使うのが自然か、命令として使うのが自然か」を、周囲の並びから空気を読んで判断します。
少し人間味のある言語だと思いませんか? ただ、この「空気を読む」仕様ゆえに、変数の命名には少しだけ気をつけるのが、現場でのスマートな流儀です。
—
文字列の「長さ」を知る:固定長 vs VARYING
さて、本題の `LENGTH` 関数です。この関数は、引数に指定した文字列の長さを返してくれるのですが、「属性によって結果が変わる」というPL/I特有のトラップがあります。
1. 固定長文字列(CHARACTER(n))
これはCOBOLの `PIC X(n)` と同じです。宣言した時点で領域が確保され、値が短くても、残りのスペースは空白で埋められます。
2. 可変長文字列(CHARACTER(n) VARYING)
こちらが今回の主役です。`VARYING` をつけると、メモリ上では「現在の実際の長さ」を保持するための記述子(Descriptor)という情報が文字列の先頭付近に付与されます。
—
現場で役立つコード例
まずは、この違いを視覚的に見てみましょう。
/i
/ — 固定長と可変長の挙動確認 — /
DCL FIX_STR CHAR(10) INIT(‘IBM’); / 固定長: 常に10バイト確保 /
DCL VAR_STR CHAR(10) VARYING INIT(‘IBM’); / 可変長: 最大10バイトだが、中身は動的 /
/
- LENGTH関数を実行してみる
/
PUT SKIP LIST(‘固定長の長さ: ‘ || LENGTH(FIX_STR)); / 結果は 10 となる /
PUT SKIP LIST(‘可変長の長さ: ‘ || LENGTH(VAR_STR)); / 結果は 3 となる /
なぜこの違いが重要なのか?
Javaの `String.length()` に慣れていると、`FIX_STR` を使ったときに「なんで3じゃなくて10が返ってくるんだ!」と焦ることがあります。
- 固定長(CHAR(10))の場合:
メモリ上には常に「I・B・M・(空白)・(空白)・(空白)…」と10文字分が居座っています。PL/Iは「宣言された領域そのもののサイズ」を返すのが基本動作です。
- 可変長(VARYING)の場合:
内部で管理されている「現在の文字数」を参照しに行きます。これが、基幹システムのバッチ処理でデータ転送を行う際に非常に重要な違いとなります。
—
記述子(Descriptor)を意識する
PL/Iの内部では、`VARYING` 属性が付いた変数が渡されるとき、コンパイラは自動的に「データ本体」と「現在の長さ」をセットにした情報の塊(記述子)を裏側で受け渡しています。
もし、外部のプログラム(例えばCOBOLやC言語など)からこのデータを呼び出す場合、この「隠れた長さ情報」が邪魔をして、思わぬバグを生むことがあります。そんな時は、`STG`(Storage)関連の組み込み関数や、`ADDR` を使ってメモリ上のポインタを覗き込む必要が出てくるのですが……。
これはまた別の機会にじっくりお話ししましょう。まずは、「`VARYING` をつければ、`LENGTH` は純粋な文字数を教えてくれる」という感覚を掴んでいただければ十分です。
—
まとめ:怖がる必要はありません
PL/Iは古い言語ですが、その設計思想には「データの構造を厳密に管理する」というプロフェッショナルな意図が込められています。
1. 固定長は、領域の「枠そのもの」の長さ。
2. VARYINGは、中身の「現在地」の長さ。
この2つを区別できれば、バッチ改修で「空白だらけのデータが飛んできた!」なんてトラブルに慌てることもなくなります。
何か分からないことがあれば、いつでも聞いてくださいね。レガシーシステムの迷宮も、地図さえあれば楽しい冒険になりますから。それでは、次回の執筆でお会いしましょう!
