🧩今日の学び
・CALLは「必ず戻る」ことを前提にした往復構造で、GO TOとは思想がまったく異なる
・GOBACK/EXIT PROGRAM/STOP RUNは動作だけでなく「設計意図をコードに残すため」に使い分ける
なるお)係長、さっきから普通に言ってますけど、
CALLってなんすか?
誰かを呼ぶんすか、また黒服すか?またキャバクラっすか。
係長、昭和感満載だから、キャバクラじゃなくてキャバレーの話してます?
係長)うるさいな!昭和の何が悪い!なんでお前にキャバレーの話するんだよ。
な)開き直った!?
係)だからうるさいんだよ。
じゃあまず、一言で言う。
CALLは「別のプログラムを呼び出す命令」だ。
CALLとは何か:別プログラムを呼ぶ“往復チケット”
係)今日のコードだ。
メインプログラム(呼ぶ側)
IDENTIFICATION DIVISION.
PROGRAM-ID. MAINPROG.
PROCEDURE DIVISION.
DISPLAY "MAIN: サブを呼ぶ"
CALL "SUBPROG"
DISPLAY "MAIN: 戻ってきた"
STOP RUN.
サブプログラム(呼ばれる側)
IDENTIFICATION DIVISION.
PROGRAM-ID. SUBPROG.
PROCEDURE DIVISION.
DISPLAY "SUB: 仕事をする"
GOBACK.
ちょっと読んでみろ。
な)はーい。
メインのほうに一個目のDISPLAYがあるから、「"MAIN: サブを呼ぶ"」を表示して、SUBPROGをコーリングしているので、あれ、先にSUBPROGを処理するのかな。
となると、「"SUB: 仕事をする"」を表示して…ってGOBACKってなんじゃ?
行って戻る?人生は進んだところで結局戻ってしまうという何をやっても無駄という格言?泡と消えた人生?チーズはどこに消えた?
GOBACKの役割:呼ばれていれば戻り、単体なら終わる
係)勝手に壮大な物語にしようとするなよ。
GOBACK は「呼ばれていれば戻る、呼ばれていなければ終わる」っていう万能型の命令だ。
な)そんな「万能くん」がいたんですね。
いますよねー。なんか「できるくん」。出来杉君みたいに才能をひけらかさないみたいな?でも、出来杉君って勉強しただけじゃないすか?天才じゃないっすよね、ただのガリ勉なのに、なに最上位ぶってんすかね!
係)なんで出来杉君の存在に怒りを感じてんだよ…。誰かさんみたいに優秀じゃないのにでかい顔してるよりいいだろ。
な)係長、いつもの課長批判はそこまでにしときましょうよー。
係)いつもって何だよ!なんで俺を貶めようとするんだよ、お前は…。
な)えーでも、呼ばれていれば戻るって言われてもなぁ…。
あれ?CALLで呼んでるってことになるのかしら?
そうなるとCALLに戻るもとのCALLのところに戻ってきて、次のDISPLAYで"MAIN: 戻ってきた"表示させて。STOP RUNで終了って感じ?
係)そんなところだ。まとめるとこうなるぞ。
MAINPROGが動く
CALL "SUBPROG"に到達
SUBPROGに処理が移る
SUBPROGがGOBACK
CALLの次の行へ戻る
という流れで、余計な話がないとスッキリするだろ。
な)へー、CALLの次の行に戻るんすね。
あれ?GO TOじゃだめなんすか?
係)使い方は、似てるといえば似てるが、決定的に違うぞ。
CALLとGO TOの決定的な違い:戻る保証があるかどうか
係)違いとしてはこうだ。
CALL → 別プログラムを呼ぶ → 必ず呼び出し元に戻る
GO TO → 同じプログラム内を好き勝手に飛ぶ → 戻る保証なし
な)あ、CALLは戻る前提ってことなんだ。
係)そう。CALLは往復チケット付きだ。
ここで、さっきの話に戻るぞ。
SUBPROG の中で、処理が終わってもうやることがなくなったら、このときどうする?
な)帰って寝る?
係)あぁん!?
な)…じゃ、じゃなくて…STOP RUN? (なに今の…)
係)それやったら全部終わるぞ。
呼び出した側(メイン)も巻き添えだ。
だから使うのはEXIT PROGRAMだ。

な)え?でも、コードのサブの方はGOBACKになってますよ?やっちまいましたか?土下座行脚すか?
係)うるせーな。まだ説明は終わってねーんだよ!
EXIT PROGRAMと設計意図:メイン/サブで“終わり方”を変える理由
係)「俺の仕事は終わった。呼んだやつに返す」
これが EXIT PROGRAM だ。
これはCALL元へ制御を戻すため、プログラム全体は終わらない。
な)だから「礼儀正しい帰り方」って言ってたんすかー。
係)そうだ。珍しく覚えてたか。
な)ひどっ!
係長のお言葉は全て書き起こして神社のおみくじ結ぶところに結んできてますよ!
係)どんだけバチ当たりなんだよ!
ったく、今の話の流れだとコードはこういう形になる。
メインプログラム(呼ぶ側)
IDENTIFICATION DIVISION.
PROGRAM-ID. MAINPROG.
PROCEDURE DIVISION.
DISPLAY "MAIN: サブを呼ぶ"
CALL "SUBPROG"
DISPLAY "MAIN: 戻ってきた"
STOP RUN.
サブプログラム(呼ばれる側)
IDENTIFICATION DIVISION.
PROGRAM-ID. SUBPROG.
PROCEDURE DIVISION.
DISPLAY "SUB: 仕事をする"
EXIT PROGRAM.
動き自体はさっきお前が言った流れになるぞ。
GOBACK と EXIT PROGRAM の関係
な)えーだったらGOBACKだけでいいんじゃないです?
めんどくさいことする必要あります?
係)設計ルールをきちんと決めているなら、「GOBACK だけで統一」でも“動く”し“事故りにくい”。
でもな、それを「正解」と言い切ると、設計が一段浅くなるんだ。
GOBACK は確かに強い。しかし、「呼ばれてたら戻る、呼ばれてなかったら終わる」という賢い出口を使うため、メインだろうが、サブだろうが、単体だろうが、同じコードが安全に動くというのがGOBACKの大きな特徴だ。
な)え、なんかGOBACKとEXIT PROGRAMに違いあります?どっち使っても同じじゃないっすか?
係)問題はそれで「意味が伝わるか」だ。
コードは機械のためだけじゃない。次に読む人間のためでもある。
そのためこういうことを考えていくわけだ。
メインプログラム
→ STOP RUN
サブプログラム(CALL 専用)
→ EXIT PROGRAM
メイン/サブ兼用・将来不明
→ GOBACK
そのためこういった選択になる。
「GOBACKだけ」にするとだ、コードは安全で、事故は減る。
でも、「このプログラムは、単体? サブ?」が読めない。
つまり、設計意図がコードから消えるし、ドキュメント依存になってしまうと。
COBOLはな、意図をコードに残す文化の言語だからな。使い方もこの意識を忘れてはならないわけだ。
ちなみに、サブで STOP RUN は絶対NGだ。プログラムが終わっちまうからな。
そして、CALLされていない状態でメインプログラムに EXIT PROGRAM を書くと、「命令が無視されてそのまま次の行に進んでしまう」 という動作をするから注意が必要だぞ。
おむすび
な)係長って学歴コンプっすか?
ところどころ、俺は優秀だ!みたいなとこ、ちょくちょく出してきますよね。
係)う、うるさいな!
な)なんか今日も係長の新たな一面が見れましたねー。
係)俺の新たな一面じゃなくて、COBOLの新たな一面を知れよ…
な)大事なのは人じゃないすか!
どんどん係長の魅力を発見していきますよ!
係)なんかものすごく恥ずかしくなってきたんだが…
な)大丈夫っすよ!それも係長の魅力ですよ!
係)存在自体が恥ずかしいやつに言われてもな…
な)え!?
係長のワンポイント
CALLは「必ず戻る」ことが前提の、往復チケット付きの命令だ。EXIT PROGRAMは“サブとしての仕事を終えて返る”という立場を示す出口になる。GOBACKは万能だが、そのぶん「このプログラムの役割」を曖昧にする。STOP RUNは最上位だけの終業ベルで、サブで鳴らすと全員帰宅だ。
COBOLは動かす言語じゃない──意図を残す言語だ。

コメント