【COBOL 読み3-11-6】ファイルをASSIGNするとは?〜ポンコツでも生きぬく!

🧩今日の学び
SELECTは論理名の登録、ASSIGNは実体との紐付けであり、OPENして初めてファイルは動く
・「芸名と本名」の比喩で、論理名と物理名の世界が分かれていることを理解する
・COBOLは処理より先に契約と身元確認を済ませる設計思想で事故を防いでいる

FILE-CONTROL.
SELECT INPUT-FILE
ASSIGN TO "input.csv".

なるお)これってどういうことなんす?
SELECTしてASSIGNするって、うーん…

係長)そこはちゃんと整理しとくか。

ここを曖昧にすると、後で100%事故るからな。

SELECT INPUT-FILE
ASSIGN TO "input.csv".

これはこういう意味だ。

SELECTは「登録」、ASSIGNは「紐付け」

係)「INPUT-FILEという“論理名”は実際にはinput.csvを指す」

SELECTはな、“このプログラム内で使うファイル名を登録する” という宣言だ。

まだ開いてない。

まだ読んでない。

ただ、名前を登録してるだけ

ASSIGNは、「どの実体に結びつけるか」を書く部分だ。

つまり、

INPUT-FILE(プログラム内の名前)
↓
"input.csv"(OS上の実ファイル)

を紐付けてる。

SELECT = 芸名登録

ASSIGN = 本名

と考えるとわかりやすいだろ。

芸名:INPUT-FILE
本名:input.csv

プログラムは芸名しか知らない。

OSは本名しか知らない。

SELECTはその橋渡しだ。

なぜこんな面倒なことするのかっていうと、ファイル名を変更しても、他に影響が出ないようにするためだ。

つまり、ENVIRONMENT DIVISIONを変えただけで、DATA DIVISIONは一切変更がない。

DIVISIONを明確に分離するというのがCOBOLの設計思想なんだ。

よくある誤解だが、SELECT → ファイル開く じゃない。

実際に開くのはこれ。

OPEN INPUT INPUT-FILE.

SELECT戸籍登録

OPEN扉を開ける行為

COBOLはファイルを三層で扱う

もう一段深い理解として、COBOLは

ENVIRONMENT DIVISION→ 外の世界との約束

DATA DIVISION→ 中身の設計図

PROCEDURE DIVISION→ 実際に開いて読む

という三層構造だということだ。

な)じゃあSELECTしないとどうなるんすか?

係)コンパイルエラー。

COBOLはな、身元不明のファイルを絶対に触らせない言語なんだ。

  • SELECT = 論理名の登録
  • ASSIGN = 実体との紐付け
  • OPEN が実際に開く

SELECTは「動作」じゃなく「契約」ってことだな。

な)…つか、論理名ってなんすか?

論理名と物理名は「世界が違う」

係)…プログラムの中だけで通じる名前だな。

な)わざと難しく言うし…

係)気づいたか。

物理名(本当の名前)

  • input.csv
  • /home/user/data.csv
  • BANK.SALES.FILE

つまり、OSやメインフレームが実際に持っている名前だ。

論理名(プログラム側の名前)

  • INPUT-FILE
  • INPUTDD
  • OUTPUT-FILE

プログラムが「そう呼ぶ」だけの名前だ。

例えば、お前は「なるお」だが、会社では「ポンコツ」と呼ばれている。

な)え!?

係)会社の資料は全部「ポンコツ」で通ってる。
でも実体は「なるお」だ。

それをファイルでやっているという話だ。

な)ひどひどす…

係)お望みのとおり、わかりやすかっただろ。

おむすび

係)SELECTは「登録」、ASSIGNは「実体との約束」、OPENが「実際の動作」

COBOLは外の世界と内側の世界をきっちり分ける言語だから事故らない。だから50年動き続けられたってわけだ。

お前が婿入りして苗字変わっても、会社の資料は「ポンコツ」から決して変わらないって信頼があることからもわかるな。

な)ひどマドモアゼル

係)でも結婚できないか…ポンコツだもんな…残念です。

な)えぇ!?

係長のワンポイント

SELECTは「開く」命令じゃない、名乗らせる宣言だ。
ASSIGNは「どこにいるか」を決める、外の世界との約束だ。
OPENして初めて、ファイルは動き出す。
ENVIRONMENTDATAを分けているのは、事故らないための設計だ。
COBOLは処理より先に、身元確認を済ませる言語だ。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする