「予約語がない?」PL/Iの不思議な世界へようこそ ― STREAM I/Oと帳票制御の基礎
こんにちは。メインフレームの深淵へようこそ。
普段JavaやCOBOLに親しんでいる方にとって、PL/I(ピーエル・アイ)という言語は、まるで「自由すぎる芸術家」のように見えるかもしれません。
今日は、そんなPL/Iの中でも、帳票出力やデータ読み込みの要である「STREAM I/O(GET/PUT EDIT)」と、少し風変わりな言語仕様について、現場の知見を交えて紐解いていきましょう。大丈夫、一つずつ見れば決して怖くありませんよ。
—
1. 「予約語がない」という驚きの仕様
まず、PL/Iの最大の特徴であり、初学者が最も混乱するのが「予約語が存在しない」という点です。
Javaなら`if`や`class`は絶対に変数名に使えませんが、PL/Iでは極端な話、`IF`という名前の変数を作ってもコンパイラは怒りません(推奨はしませんが!)。
/i
/ 極端な例:PL/Iではこんな宣言も文法上は通ります /
DCL IF FIXED BIN(31); / IFという名前の変数 /
DCL THEN CHAR(10); / THENという名前の変数 /
IF = 10;
THEN = ‘TEST’;
これはPL/Iが「文脈(Context)」で判断しているからです。コンパイラは「ここにある`IF`は変数なのか、それとも制御文の`IF`なのか?」を前後の並びから賢く判断しています。COBOLのように「この単語は絶対に使ってはいけない」という制限がない分、驚くほど柔軟ですが、読みやすいコードを書くためには、ある程度の「暗黙のルール」を自分で守る必要がありますね。
—
2. STREAM I/O:GET/PUT EDITの魔法
メインフレームのバッチ処理では、帳票出力やフラットファイルの読み込みが日常茶飯事です。ここで使うのが`GET EDIT`と`PUT EDIT`です。
これらは「ストリーム(流れるデータ)」に対して、「フォーマット(編集)」を適用して読み書きするという考え方です。Javaの`printf`に似ていますが、より「帳票の印字」に特化した強力な制御項目が用意されています。
よく使う制御項目一覧
- COLUMN(n): 指定した列(桁)までスキップします。
- LINE(n): 指定した行までスキップします。
- SKIP(n): 現在の行からn行送ります(改行)。
- PAGE: 改ページを行います。
実践:帳票出力のコード例
例えば、帳票のヘッダーを印字し、データを指定位置に配置する例を見てみましょう。
/i
/ 帳票出力のイメージ /
PUT PAGE; / 改ページ /
PUT EDIT(‘売上管理表’, ‘作成日: 2023/10/27’)
(COLUMN(20), A, COLUMN(60), A);
PUT SKIP(2); / 2行空ける /
/ データの印字 /
DCL ITEM_NAME CHAR(20) INIT(‘メインフレーム保守’);
DCL PRICE FIXED DEC(7) INIT(50000);
PUT EDIT(ITEM_NAME, PRICE)
(COLUMN(5), A(20), COLUMN(30), F(7));
/
A(20) は文字列20文字、F(7) は7桁の数値を意味します。
COLUMNを指定することで、印字位置をガチガチに制御できます。
/
—
3. なぜ「STREAM I/O」を使うのか?
COBOLの`WRITE`文などが「レコード単位」でガチガチに構造を決めて扱うのに対し、PL/Iの`STREAM I/O`は「データストリームを文字の列として捉え、自由に編集する」というアプローチです。
この柔軟性は、例えば「既存の古いファイル形式から、複雑なレイアウトの帳票へ変換する」といったマイグレーション作業において、非常に強力な武器になります。`COLUMN`や`SKIP`を組み合わせるだけで、物理的な配置をプログラム上で直感的に記述できるからです。
—
4. 現場で役立つアドバイス
最後に、現場でトラブルを避けるための「ちょっとしたコツ」を授けます。
1. カラム位置の計算は慎重に: `COLUMN`は「絶対位置」です。現在の位置を意識せず適当に指定すると、前のデータに上書きしてしまったり、想定外の改行が入ったりします。帳票設計書を見ながら、1桁単位で合わせる癖をつけましょう。
2. 型宣言の沼: PL/Iは`FIXED BIN`(計算用)と`FIXED DEC`(金額などの10進数計算用)を明確に使い分けます。`EDIT`で出力する際は、型の不一致をコンパイラがよしなに変換してくれますが、計算精度に関わるので、基本的には出力用変数に代入してから印字するのが安全です。
最後に
PL/Iは、一見すると古い言語に思えるかもしれません。しかし、その柔軟で人間臭い仕様は、半世紀以上もの間、基幹システムを支え続けてきた「知恵」の結晶です。
「予約語がない」という自由は、「どう書くか」を書き手に委ねているという信頼の証でもあります。怖がらず、まずは小さな`PUT EDIT`から試してみてください。きっと、その便利さに驚くはずですよ。
また次回の記事では、PL/Iのデータ構造の真骨頂である「構造体(STRUCTURE)」について深掘りしていきます。お楽しみに!
