PL/Iの世界へようこそ!「RECORD」と「STREAM」の意外な関係を紐解く
皆さん、こんにちは。長年メインフレームという巨大な「鉄の城」の設計に携わってきたアーキテクトです。
新しくPL/Iの世界に足を踏み入れた皆さん、ようこそ!JavaやCOBOLの経験がある方にとって、PL/Iの文法は少しばかり「クセが強い」と感じるかもしれません。でも大丈夫、この言語は非常に論理的で、かつてのメインフレーム全盛期に「あらゆる用途をこれ一つで」という野心を持って作られた、極めて柔軟なツールなんです。
今日は、PL/Iのプログラムを読み解く上で避けては通れない、「入出力モード(RECORD vs STREAM)」という概念を、現場の視点から丁寧に解説しますね。
—
1. PL/Iの基本の「型」:PROCEDUREとメインプログラム
まず、PL/Iのコード構造を少しだけ見ておきましょう。Javaの`public static void main`にあたるのが、`OPTIONS(MAIN)`というオプションです。
1
/ プログラムの入り口はここから始まります /
MY_PROG: PROCEDURE OPTIONS(MAIN);
/ ここに変数宣言や処理を書きます /
PUT SKIP LIST(‘Hello, Mainframe World!’);
END MY_PROG;
この`MY_PROG`という名前がプログラムの「顔」になります。PL/IはCOBOLのように「DIVISION」で厳格に分かれておらず、手続き的な書き方ができるのが特徴です。
—
2. RECORDモードとSTREAMモード:どっちを使うべき?
ファイルの読み書きをする際、PL/Iには大きく分けて2つの「モード」があります。これが、皆さんが最初の壁にぶつかるポイントです。
STREAMモード:人間様のための「編集屋さん」
STREAMモードは、データを「文字の連続」として扱います。例えば、CSVファイルやレポート出力など、人間が読んで理解できる形式に変換して書き出す時に使います。
- 特徴: `PUT LIST`や`GET LIST`といった命令を使います。
- 現場の感覚: 「適当にデータを詰め込んで、よしなに変換して!」という時に便利ですが、変換処理が入るため少し速度は落ちます。
RECORDモード:マシンのための「高速レーサー」
一方、RECORDモードは、データをメモリ上の構造体(DECLAREで定義した形)のまま、そっくりそのままディスクへ書き込みます。変換を一切挟まないため、圧倒的に高速です。
- 特徴: `READ`や`WRITE`命令を使い、データブロック単位で操作します。
- 現場の感覚: 基幹システムの膨大なトランザクション処理は、ほぼすべてこれです。データの「形」を厳密に守る必要があるため、COBOLのコピー句に近い「構造体」の定義が非常に重要になります。
—
3. 内部バッファの挙動:ここがトラブルの温床!?
さて、ここからが少し深い話です。STREAMモードを使っていると、出力したはずのデータがログにすぐ出ない……なんて経験をしたことはありませんか?
実は、STREAMモードには「バッファリング」という仕組みがあります。効率化のために、ある程度の量が溜まるまでメモリに保持し、溜まったら一気にディスクへ書き込むのです。
- STREAMの罠: プログラムが異常終了した際、まだバッファに残っていたデータが書き出されず、ログが途中で途切れることがあります。
- RECORDの安心感: RECORDモードは、OSのファイルシステムと直結しているため、書き込みのタイミングを制御しやすく、バッチ処理の堅牢性を担保しやすいのです。
—
4. 実戦コード例:RECORDモードの書き方
では、実際にRECORDモードでデータを書き込む際によく使う「構造体」の定義例を見てみましょう。
1
/ 従業員データの定義 /
DECLARE 1 EMP_REC,
2 EMP_ID CHAR(5), / 社員番号 /
2 EMP_NAME CHAR(20), / 名前 /
2 SALARY FIXED BIN(31); / 給与(バイナリ形式で高速!) /
/ ファイルをRECORDモードで開く宣言 /
OPEN FILE(EMPFILE) RECORD OUTPUT;
EMP_ID = ‘A001’;
EMP_NAME = ‘TANAKA TARO’;
SALARY = 500000;
/ レコードをそのまま書き込む(高速!) /
WRITE FILE(EMPFILE) FROM(EMP_REC);
CLOSE FILE(EMPFILE);
見ての通り、`DECLARE`でメモリ上の並びを細かく指定しています。この「メモリの形」をそのままディスクに叩き込むので、変換オーバーヘッドがゼロ。これがメインフレームの高速処理の秘訣なんです。
—
最後に:怖がらなくて大丈夫です
PL/Iは、一見すると古い文法に見えますが、現代のプログラミング言語にある「構造化」や「型システム」の基礎がすべて詰まっています。
- 「あれ、このデータは文字なの? 数値なの?」と迷ったら、まずは`DECLARE`文に戻って、その変数がどんな「形(属性)」をしているか確認してください。
- 「STREAM」は便利屋、「RECORD」は職人。そうイメージするだけで、プログラムの挙動がぐっと見えてくるはずです。
もし現場で「コンパイルエラーが取れない!」「データが化ける!」と悩んだら、いつでもこの基本に立ち返ってくださいね。皆さんのメインフレーム・エンジニアとしての旅路が、素晴らしいものになりますように!
それでは、また次回のレクチャーでお会いしましょう。Happy Coding!
