自由すぎるPL/Iの世界へようこそ:変数名からバッファの深淵まで
こんにちは!メインフレームの世界へようこそ。JavaやCOBOLの厳格な「予約語の壁」に慣れていると、PL/Iのコードを初めて見たとき、そのあまりの自由奔放さに「えっ、これでいいの?」と面食らうかもしれません。
今日は、そんなPL/Iの「おおらかな性格」を理解しつつ、基幹システムの心臓部であるファイル入出力(I/O)のパフォーマンスを左右する`BUFFERED`と`UNBUFFERED`の違いについて、現場の知恵を交えて紐解いていきましょう。
—
1. PL/Iの「予約語がない」という驚きの仕様
まず驚くのが、PL/Iには明確な「予約語」が存在しないという事実です。これは、COBOLのように「`MOVE`は命令語だから変数名には使えない」といった制限がないことを意味します。
例えば、こんなコードが書けてしまいます。
1
/ PL/Iの自由すぎる一例 /
DECLARE IF CHARACTER(10) INITIAL(‘HELLO’);
DECLARE THEN CHARACTER(10) INITIAL(‘WORLD’);
/ 構文解析器が文脈で判断するため、これでもコンパイルが通ります /
IF = THEN;
「えっ、プログラムが壊れないの?」 と思いますよね。実は、PL/Iは文脈(コンテキスト)を見て「これはキーワードだ」「これは変数名だ」と高度に判断しています。ただし、現場の作法としては「予約語として使われそうな単語を変数名にするのは、トラブルの元なので厳禁」というのが暗黙の了解です。可読性は、保守性の命ですからね。
—
2. SEQUENTIALファイルのバッファリング:高速化の魔法
さて、ここからが本題です。基幹システムのバッチ処理で、夜間処理の時間を左右する「ファイル入出力」の話をしましょう。
`SEQUENTIAL`ファイル(いわゆる順次ファイル)を扱う際、`BUFFERED`と`UNBUFFERED`という属性を指定します。これは、「データを一度に運ぶトラックの数」だとイメージしてください。
BUFFERED(バッファ付き)
- イメージ: 大型トラックで一度に大量の荷物を運ぶ。
- 特徴: OSがメモリ上にバッファを確保し、複数レコードをまとめて読み書きします。物理的なI/O回数が激減するため、処理速度は爆速です。
- 注意点: 更新処理(UPDATE)を行う際、バッファの中にあるデータが書き戻されるタイミングがOS任せになるため、排他制御の粒度が粗くなりがちです。
UNBUFFERED(バッファなし)
- イメージ: 軽トラックで荷物を一つずつ運ぶ。
- 特徴: 1レコードごとに直接ディスクとやり取りします。I/Oは遅くなりますが、「今、どのレコードを触っているか」という制御が極めて確実です。
- 使いどころ: 厳密なレコード単位の排他制御が必要な環境や、更新の整合性を最優先する場合に選ばれます。
—
3. 実践!コードで見るバッファ戦略
実際の現場では、パフォーマンス要件に応じて以下のように属性を使い分けます。
1
/ 高速読み取り用:BUFFERED指定 /
DCL FILE_IN FILE SEQUENTIAL INPUT BUFFERED;
/ 厳密な更新用:UNBUFFERED指定 /
DCL FILE_OUT FILE SEQUENTIAL UPDATE UNBUFFERED;
/ 処理のイメージ /
OPEN FILE(FILE_IN);
OPEN FILE(FILE_OUT);
READ FILE(FILE_IN) INTO(MY_RECORD);
/
- UNBUFFEREDの場合、ここで書き込むと即座に物理ディスクへ反映されます。
- データの整合性を保ちたい「締め処理」などで重宝します。
/
REWRITE FILE(FILE_OUT) FROM(MY_RECORD);
CLOSE FILE(FILE_IN);
CLOSE FILE(FILE_OUT);
なぜ現場ではBUFFEREDを好むのか?
メインフレームのバッチ処理では、数百万件のレコードを処理することが日常茶飯事です。`UNBUFFERED`で書くと、ディスクの回転待ち(I/O Wait)だけで夜が明けてしまいます。基本は`BUFFERED`で最大限の効率を出しつつ、データの整合性がクリティカルな部分だけ`UNBUFFERED`や`EXCLUSIVE`オプションを組み合わせる……これが熟練アーキテクトの腕の見せ所です。
—
最後に:怖がらず、まずは動かしてみる
PL/Iは歴史が長く、仕様が膨大なため、すべてを暗記する必要はありません。
「予約語がないから、変数は分かりやすい名前をつけよう」「バッファ属性は、トラックの大きさを選ぶ感覚で」……そうやって一つずつ紐解いていけば、この言語はとても強力な相棒になります。
もし、レガシーシステムのコードを読んでいて「なぜこの指定があるんだ?」と迷ったら、いつでも聞いてください。そのコードが書かれた当時の「背景」を読み解くお手伝いをさせていただきますから。
それでは、良いメインフレームライフを!
