PL/Iの深淵へようこそ:文字列の「固定」と「可変」、そのメモリ管理の裏側を紐解く
メインフレームの世界へようこそ。JavaやCOBOLを触ってきた方にとって、PL/Iは「自由奔放すぎて少し怖い」と感じるかもしれませんね。でも大丈夫です。PL/Iは、プログラマーの意図を忠実にメモリへ反映させる、非常に正直な言語なんです。
今回は、基幹システムの現場で最も頻繁に遭遇する「文字列の扱い」に焦点を当てます。`CHARACTER`型と`VARYING`属性。この二つの付き合い方をマスターすれば、PL/Iはもうあなたの手足となりますよ。
—
1. 識別子の自由度:予約語という「縛り」がない世界
まず驚かれるのが、PL/Iには「厳格な予約語」がほとんど存在しないという点です。例えば、`IF`という変数を作っても、PL/Iは怒りません。
- なぜそんなことができるの?
PL/Iは「文脈」を重んじる言語だからです。コンパイラが「あ、これはキーワードだな」と判断する場所と、「これはプログラマが名付けた変数だな」と判断する場所を、コードの構造から読み取っています。
- 注意点:
自由すぎてコードが読みにくくなるリスクはあります。実務では `IF = 10;` なんていう悪夢のような命名は避け、可読性を重視した名前を付けるのがエンジニアの美学ですよ。
—
2. CHARACTER型:固定長と可変長の「正体」
文字列を扱う際、私たちは `CHARACTER(n)` を使います。ここで重要なのが、`VARYING`(可変長)属性を付けるかどうかです。この違い、メモリの「箱」の構造をイメージすると一発で理解できます。
固定長文字列:`CHARACTER(10)`
これは、「10個分の席が必ず予約されている特等席」です。
中身が3文字でも、後ろの7文字分には「スペース(空白)」が詰め込まれます。
- メリット: メモリ配置が予測しやすく、アクセス速度が非常に高速です。
- デメリット: 常に最大長分のメモリを消費するため、大きな配列を作るとメモリを圧迫します。
可変長文字列:`CHARACTER(10) VARYING`
こちらは、「最大10人まで入れるけど、今は3人しかいないから3人分だけ使うね」という仕組みです。
面白いのは、「今の長さ」を保持するためのヘッダー領域が先頭に付く点です。
- 内部構造: `[長さ情報(2byte)] + [データ本体(n byte)]`
- メモリ効率: 必要な分だけ消費するため賢いですが、代入のたびに「現在の長さ」を書き換える処理が発生します。
—
3. 実践:コードで見てみよう
それでは、実際にPL/Iで宣言してみましょう。
1
/ 固定長:常に10バイト確保 /
DCL NAME_FIX CHAR(10) INIT(‘IBM’);
/ 可変長:最大10バイトだが、実質3バイト+長さ情報を消費 /
DCL NAME_VAR CHAR(10) VARYING INIT(‘IBM’);
/ 処理のイメージ /
NAME_FIX = ‘Z’;
/ NAME_FIXは ‘Z ‘ となり、スペースで埋められます /
NAME_VAR = ‘Z’;
/ NAME_VARは、ヘッダーに長さ1を書き込み、本体に’Z’を置きます /
なぜ代入時にオーバーヘッドがあるの?
`VARYING`の場合、代入のたびに「今の文字数は何文字か?」を計算し、先頭の2バイトを書き換えるという「事務作業」がコンパイラによって自動挿入されます。数百万件のバッチ処理で、ループ内で頻繁に大きな可変長変数を書き換える場合、この「事務作業」が積もり積もってボトルネックになることがあります。
—
4. 現場のアドバイス:使い分けの指針
現場でベテランたちがどのように使い分けているか、こっそり教えますね。
1. データベース(DB2)との連携:
DBの `VARCHAR` カラムに対応させるなら `VARYING` が自然です。ですが、データ転送時のバッファリングなど、「物理的な構造が固まっているほうが都合が良い」ケースでは、あえて固定長を使うことも多いです。
2. パフォーマンス重視の計算ロジック:
処理速度を最優先するループ内部では、固定長 `CHARACTER` を使い、`SUBSTR`関数などで必要な部分だけを切り出す方が、ヘッダー操作のオーバーヘッドを回避できて安全です。
—
最後に:怖がる必要はありません
PL/Iは、メモリという名の広大なキャンバスに対して、あなたがどのように描くかを極めて自由に許容してくれる言語です。「`VARYING`だから遅い」と決めつけるのではなく、「メモリを節約したいのか、それともCPUサイクルを節約したいのか」という目的意識を持って選ぶ。これだけで、あなたの書くコードは一気にプロフェッショナルなものに変わります。
最初は奇妙に見えるかもしれませんが、この自由度の高さこそが、何十年も基幹システムを支え続けてきたPL/Iの強さです。ぜひ、怖がらずに色々な宣言を試してみてください。何か詰まったら、いつでもまた聞きに来てくださいね。
