🧐

ワークファイルとは何か?

に公開

はじめに

オープンソース系にはない"ワークファイル"という概念がよく分からなかったのでChatGPAに聞いてみました。AS/400への理解が進んで分かりやすかったので回答を共有します。
あくまでもChatGPTの回答を貼り付けているだけであり誤っている可能性があるので、参考程度にとどめておいてください。
記述内容が誤っている場合はご指摘いただけると幸いです。
以下、回答内容です。

そもそも「ワークファイル」とは何か?

プログラムの処理途中で使われる一時的な作業用ファイル のことです。
いわゆる 「中間処理の結果をためておくファイル」 です。
たとえるなら――
"大量のデータを整理したいときに、机の上に “一時的なメモ紙” を置いて、途中経過をそこへ書いていく"
そんなイメージです。

なぜ AS/400(IBM i)では「ワークファイル」が登場するのか?

AS/400 は昔から
・RPG が「レコード指向の言語」
・DB(物理/論理ファイル)を直接操作する思想
で作られているため、
処理途中の結果を 物理/論理ファイルと同じ形で扱いたい 場面が多いです。
そのため、途中経過を保持するために「ワークファイル(WORK FILE)」 がよく使われます。

ここを深く理解するには、
・AS/400 の設計思想
・RPG の特徴
・当時のハード制限
が関係します。
ひとつずつわかりやすく説明します。

1. RPG は “レコード指向言語” だから

レコード指向とは?

RPG が生まれたのは 帳票を作るための言語 としてです。
だから RPG は、
・「1行ずつ読む」
・「1行ずつ加工する」
・「1行ずつ書き出す」
という “レコード単位で処理する” のが基本スタイルなんです。

READ  顧客ファイル → 1件取得
IF    条件に合うか?
WRITE ワークファイルへ出力
READ  次の行

つまり、RPG は
“1レコード処理 → 1レコード出力” が得意で、大量データをメモリに全部持つ文化ではないと言えます。

2. AS/400 は「DB をプログラムの一部」として扱う思想

AS/400 の大きな特徴は、
“DB(物理/論理ファイル)を OS に統合している”
ことです。

オープン系だと

アプリケーション
  ↓ SQL
データベース(MySQL / Oracle / PostgreSQL)

という「別物」ですよね。

でも AS/400 は違います。

プログラム(RPG)
  ↑↓ 同じ世界
データベースファイル(PF/LF)

なので、RPG プログラムの中では、
DBファイルは変数を扱う感覚で使われます。

3. だから「途中経過もファイルで扱う」必要が出てくる

レコード単位で処理して
DBファイルを直接読む・書く文化なので、
・途中で保持したいデータ
・ソートしたいデータ
・帳票のために並べたいデータ
“ファイルとして扱った方が自然” になります。

RPG(古いバージョン)には、
・高機能な配列操作
・動的メモリ
・コレクション
・リスト構造
がほぼ無かったため、複雑な処理をしようとすると
“メモリよりファイルの方が扱いやすい”
という状況だったのです。

だから「途中経過」もファイルに出す文化が生まれ、それがワークファイルの登場理由です。

ワークファイルは一言で言うと
「処理途中のデータを、一時的に保管しておくための“一時テーブル(Temp Table)” のようなもの」
といえます。

ただし AS/400 の文化として
・メモリよりファイル
・データ構造よりレコード
・配列より物理ファイル
という思想が根付いていて、その延長線上に存在するのがワークファイルです。

4. AS/400 のハードウェア制限も関係している

昔の AS/400(S/36/RPG III 時代)は、
・メモリが非常に少ない
・プログラムサイズ制限が厳しい
・実行中の配列サイズにも制限があった
・動的配列が無かった
という制限がありました。

なので、以下のような処理はメモリでやるのが困難でした。
・データを大量に読み込む
・並べ替える
・グルーピングする
・中間データを保持する

だからファイル(ワークファイル)に逃がしていたのです。

5. まとめ:なぜ AS/400 はワークファイルを多用するのか?

✔ RPG が「レコード(1行)単位で処理する」言語だから
✔ DB が OS に統合され「ファイル操作=基本動作」だから
✔ 昔はメモリや配列が貧弱で、大量データはファイルで扱う必要があった
✔ そのせいで「途中経過=ファイルに書く」が自然な文化になった
✔ その結果生まれたのが「ワークファイル」

つまり…
AS/400 の文化・歴史・技術的制限の “必然” から生まれた仕組み
ということです。

ワークファイルのよくある用途

1. ソートしたい時

昔の RPG では「内部でソートする」機能が貧弱でした。
そのため、
① ワークファイルへ一度書き込む
② OS のソート機能で並べ替える
③ 並んだ結果を再度読む
という手順がよく使われました。

2. 印刷帳票(RPG/PRTF)のレイアウト用

帳票印刷(PRTF)は
・ヘッダー
・ボディ
・フッター
などを整える必要がありますが、
元データをそのまま印刷するのは難しい場合があります。

そのため、
① ワークファイルに「印刷用に整形したデータ」を書く
② そのワークファイルを PRTF に流す
という処理が昔から多用されました。

3. 計算結果の一時保存

・集計をする
・条件で振り分ける
・特定の順番に並べる
といった場合、
プログラムの内部ではメモリが扱いにくい(固定フォーマット時代)ため、
いったんワークファイルに書いてから再利用することがあります。

4. 他プログラムとの受け渡し

AS/400では「ファイルを介して受け渡しする文化」が強く、以下のような用途でワークファイルが登場します。
① Aプログラム → ワークファイルに書く
② Bプログラム → ワークファイルを読む
→ これでデータ受け渡しを行う
(※今ならメッセージキューやAPIを使うことが多いですが、昔はファイルが主流。)

オープン系との違い(なぜオープン系には無い?)

オープン系(Java/PHP/Pythonなど)では、
・メモリで自由にデータ構造を扱える
・配列、ハッシュ、オブジェクト、DBなどが柔軟
・そもそもファイルを使わなくても処理できる
という環境なので、「中間データをファイルに置く」必然性がほぼ無い ためです。

一方 AS/400 は、
・古くからのレコード指向・ファイル指向
・メモリの扱いが制限されていた時代の影響
・実行中に DB ファイルをそのまま扱う文化
があり、ワークファイルの利用が自然だったのです。

まとめ

✔ 「ワークファイル」とは

AS400 のプログラム処理の途中で使う 一時的な作業用ファイル。

✔ 使う理由

・並べ替え(ソート)
・中間結果の蓄積
・帳票整形
・他プログラムとの受け渡し
・メモリではなくファイル中心で処理する文化
という AS/400 独自の歴史と設計思想があるため。

補足:現代RPG(ILE・Free-Format)では?

実は、最近のRPGでは
・大量のデータ構造
・動的配列
・データ構造配列
・コレクション風の使い方
などができるため、
昔ほどワークファイルを使わなくても済むようになっています。
とはいえ 既存資産(レガシーコード)には山ほど残っています。

Discussion