🧩今日の学び
・READは1件ずつ流す命令、SORTは全部集めてから並べ替える命令であり、処理思想が根本から違う
・「READが含まれている」とは、SORTが内部で自動的に読み込みを繰り返しているという意味である
・COBOLは自分で並べ替えるのではなく、専門の仕組みに任せて流れを制御する設計になっている
なるお)係長ー、READもっかい教えてもらえます?
こないだのSORTのとき、SORTにREADが含まれてるっていってたじゃないすか?
あれを思い出したら、なんか違うような気がしたんすけど。
次のレコードを読み込んでいくだけだったらソートってできるんすか?
一つのレコードを読み込み続けてもソートされてないんじゃないのかしらって思ったんですけど、違うんす?
READは「1件ずつ流す」だけ
係長)READは「1レコード読む」命令だぞ。
な)ふんふん…って終わり!?
係)一回説明しただろ。それを思い出せよ。
な)いや、教えてくださいよー。
係)まぁ、振り返るのもありだな。
基本形はこれだ。
READ INPUT-FILE
AT END MOVE "Y" TO EOF-FLAG
END-READ
1回READを実行すると、ファイルの「次の1件」がレコード領域(INPUT-REC)に入る。
な)それ!!
係)なにがだよ…
な)いや、だからそれっすよ!
係)どれがなんだよ!
前、SORTにREADが含まれてるっていってたじゃないすか?
でも今の説明のように、次のレコードを読み込んでいくだけだったらソートってできるんすか?
一つのレコードを読み込み続むだけならソートされないんじゃないの?って思ったんですけど、違うんす?
係)あーそういうことか。よく覚えてたな。
な)なんか腑に落ちなかったの思いだしたんすよ。
係)まさか、お前が仕事のことで覚えてるとはな。
な)仕事一筋ですから!
係)一筋感がまったくないやつに言われてもな…
な)どんな評価すか…
SORTは「全部集めてから動く」命令
係)いいか、まず普通のREADだけではソートはできない。
SORT文は「全部読んで、並べ替えてから出す」んだ。
普通のREADの場合
READ INPUT-FILE
これは今の位置の1件だけ読む、そして、並び順はファイルの順番そのままだ。
つまり、ソートはされない。
な)やはり!思ったとおりですよ!犯人は係長だったんすね!いつものでまかせだったんすね…悲しいです。
係)誰がでまかせいったんだよ!SORTは別物だってはなしだ!
な)あれ、違わないんすか?
係)当たり前だろ。お前に言いくるめられることなんて生涯ないからな。
な)強気!?
係)SORT文の正体は、例えばこうだ。
SORT SORT-FILE
ON ASCENDING KEY ITEM-ID
USING INPUT-FILE
GIVING OUTPUT-FILE.
この1行で内部ではこうなる。
① INPUT-FILEを全部読む
② メモリ or ワーク領域に溜める
③ キーで並べ替える
④ OUTPUT-FILEに書き出す
つまり、SORTは「まとめて処理」する命令。
READが含まれてるってどういうことかというと、SORTは内部で自動的にREADを繰り返している。
だから「READが含まれてる」と言ったわけだ。
でもそれは1件ずつ処理してるわけじゃなく、SORTエンジンがやってる。
な)普通のREADは都度処理がされて、SORTは一旦集める処理がされているってことっすね?
係)そういうこった。
重要な思想の違いをまとめると、
| 処理 | 性質 |
|---|---|
| READ | 流す |
| SORT | 溜めて並べ替える |
な)あれ?ということは、自分でREADして並べ替えることもできる?
係)それはそうだが、それに意味があるかってことだな。お前の食欲みたいに。
な)人を食欲だけみたいに…
係)お前の構成要素は、食欲と炭水化物と脂質だけだろ。
な)なにその生物…
100GBはどうやって並べ替えるのか
な)でも、当時はメモリがない時代とかでしたよね?竹槍で藁をつついている時代でしたよね?
係)お前、タイムスリップして怒られてこい…
な)だとしたら、100GBのファイルをSORTとかできないんじゃないすか?
COBOLに呆れられるんじゃないすか?
お前、メモリなんて高価なものたくさん積んでると思ってる?「What are you thinking about?」って両手を広げてやれやれってため息つかれてバカにされるんじゃないんすか!?
係)お前の外国人のイメージはどうなってんだよ…
そういうときは、外部ソート(External Sort)になる。
な)外部ソート?
今からCOBOLで新語作っても流行語になるのは無理っすよ!諦めて!
係)流行語なんかとりにいくかよ!
いいか、100GBを全部メモリに乗せるのは無理。
だから
① メモリに入る分だけ読む(例:500MB)
② それをソート
③ 一時ファイルに書き出す
④ これを何回も繰り返す
⑤ 最後にそれらをマージする
な)分割してから合体ってことっすか?
係)そうだ。
こういう「分割してソートして、最後にマージするやり方」を、マージソートみたいな方式でやってると思えばいい。
な)また新語!
係)うるさいな…
COBOLはソートしない、指揮する
係)つまり、100GB SORTしても100GB全部メモリに載せずに、OSが分割して処理する
COBOLのSORTはSORTユーティリティを呼び出してるだけってことだな。
な)ということは、SORTはSORTしているふうにみせかけて、他人がSORTするのを待っているだけってこと?
他人にやらせて僕は寝てる君じゃないっすか!幻滅です。
係)なんで俺が幻滅されてるんだよ…。
いいか、COBOLはソートの専門家がいるならそいつにやらせる。
これが分業思想だ。
COBOLは
• データ定義する
• キー指定する
• 入力指定する
• 出力指定する
• 流れを制御する
つまり指揮官ってことだ。
おむすび
な)課長的な感じっすかね。たまに寝てますし。
係)お前ね…でも、指揮官のイメージとしてはそうだな。
な)でも太ってますよ?
係)お前もだろ!
な)ひど!
係)お前のほうがよっぽどひどいだろ!
係長のワンポイント
READは“今ある1件”を前に進める命令だ。SORTは“全部集めてから並べる”命令だ。
似ているのは入口だけで、思想はまったく違う。
巨大ファイルを扱えるのは、COBOLが実働部隊を持っているからだ。
COBOLは作業者じゃない──指揮官だ。

コメント