【PL/I学習|豆知識】メインフレームの知恵:PL/Iにおける「アスタリスク()」を活用した柔軟な引数処理

1. 導入:なぜ「アスタリスク()」が必要なのか

メインフレーム開発、特にPL/I環境において、サブプログラム(プロシージャ)を設計する際、「受け取るデータの長さが毎回異なる」というケースは頻繁に発生します。もし長さが固定された引数しか扱えないとすれば、長さごとに別々のプロシージャを用意せねばならず、保守性が著しく低下します。この課題をスマートに解決するのが、引数定義における「アスタリスク()」の指定です。これにより、呼び出し側のデータ長を動的に解決し、単一のコードで多様な電文を処理する「PL/I流の多態性」を実現できます。

2. 基礎知識:記述子(Descriptor)の役割

PL/Iで `CHAR()` と定義すると、コンパイラは内部的に「記述子」と呼ばれる情報を生成します。この記述子には、実引数のメモリアドレスだけでなく、そのデータの実際の長さや属性情報が含まれています。プロシージャが呼び出された際、この記述子を自動的に参照することで、プログラムは受け取ったデータが何バイトなのかを正確に把握できるのです。これは現代のJavaやC#における可変長文字列やコレクション処理の先駆けとも言える仕組みです。

3. 実装と解決策

実装のポイントは、プロシージャの宣言部で `DCL 引数名 CHAR()` と記述することです。この定義により、呼び出し元が `CHAR(10)` を渡そうが `CHAR(100)` を渡そうが、プロシージャ側で `LENGTH(引数名)` を実行するだけで、正しい長さを取得できます。

4. サンプルプログラム

以下は、受け取った文字列が何バイトであっても、その内容をそのまま表示するシンプルなプロシージャの例です。

/ サンプル:可変長引数を受け取るプロシージャ /
PROC_SAMPLE: PROC(INPUT_STR);

/ 引数に()を指定することで、呼び出し側の長さを動的に解決 /
DCL INPUT_STR CHAR();
DCL V_LEN FIXED BIN(15);

/ 記述子から実際の長さを取得 /
V_LEN = LENGTH(INPUT_STR);

/ 取得した長さを使って処理を分岐したり制御したりする /
PUT SKIP LIST(‘受信したデータの長さは: ‘ || V_LEN);
PUT SKIP LIST(‘データ内容: ‘ || INPUT_STR);

END PROC_SAMPLE;

5. 応用・注意点:移行時の罠

現代の言語(JavaやPythonなど)へ移行する際、この「アスタリスク」の挙動を安易に「固定長」と読み替えてしまうとバグの温床になります。PL/Iでは `LENGTH` 関数が「文字数」や「バイト数」を正確に返しますが、現代言語の `.length` プロパティが、実は「メモリ上の最大確保サイズ(Capacity)」ではなく「現在の有効文字数」を指しているのか、あるいはその逆なのかを精査する必要があります。

また、`CHAR()` を使用する際は、引数として渡すデータが「VARYING」属性である場合とそうでない場合の挙動の違いにも注意が必要です。常に `LENGTH()` 組み込み関数を使用して長さを取得する癖をつけておくことが、将来的なマイグレーションや保守における安全性を高める秘訣です。

コメント

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