【入門編】LENGTH組み込み関数のVARYING属性に対する挙動 – PL/Iの基本構文とデータ制御実践ガイド

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つを区別できれば、バッチ改修で「空白だらけのデータが飛んできた!」なんてトラブルに慌てることもなくなります。

何か分からないことがあれば、いつでも聞いてくださいね。レガシーシステムの迷宮も、地図さえあれば楽しい冒険になりますから。それでは、次回の執筆でお会いしましょう!

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