🧩今日の学び
・EXIT PARAGRAPHはPERFORM UNTILを抜けるのではなく、段落そのものを終了させる命令
・見た目は「上に戻る」ようでも、制御フロー的には呼び出し元の次の処理へ進む
・COBOLは行番号ではなく「呼び出しと復帰」で動く言語だと理解するのが肝
なるお)おれもう読めちゃうんで、何が来ても解決しちゃうんでしょうねー。
係)……言うじゃねぇか。
だったら、基礎が読めるんだったら、“流れを作る”構文に進むぞ。
今日のコード
PROCEDURE DIVISION.
MAIN-PARA.
PERFORM LOOP-PARA
DISPLAY "After loop"
STOP RUN.
LOOP-PARA.
MOVE 1 TO CNT
PERFORM UNTIL CNT > 5
DISPLAY "CNT = " CNT
IF CNT = 3
DISPLAY "Special point reached!"
EXIT PARAGRAPH
END-IF
ADD 1 TO CNT
END-PERFORM
DISPLAY "Loop done."
COBOL中級編、EXITから逃げろ!
な)えーと、MAIN-PARA.スタートして、PERFORMでLOOP-PARAの実行。
LOOP-PARAスタートして、1をCNTに入れて準備完了。
ループ開始。CNTが5を超えるまでルーピングスタート。CNTが3だったら、Special point reached!とか言っちゃったりして。
言っちゃったりしちゃったらEXIT PARAGRAPH…?PARAGRAPHって段落?
って、またEXIT?どんだけ抜けたいのさ!どんだけ仲悪いアイドルグループなのよ。
CNTが3じゃなかったら、END-IFからCNTに1入れちゃう系。
ルーピングが終わったら、もしくは、PARAGRAPHから抜けたら、DISPLAYでAfter loopを表示して、LOOP-PARA終了
どうこれ?
ってかPARAGRAPHって何?
EXIT PARAGRAPHとはなんなのか
係)んーちゃんと筋は読めてるな。
“COBOLの段落(PARAGRAPH)”ってのはな、処理のひとかたまり(サブルーチン)を区切る単位なんだ。
な)だとしたら、今回のこのコードだと、
LOOP-PARA.
MOVE 1 TO CNT
PERFORM UNTIL CNT > 5
DISPLAY "CNT = " CNT
IF CNT = 3
DISPLAY "Special point reached!"
EXIT PARAGRAPH
END-IF
ADD 1 TO CNT
END-PERFORM
DISPLAY "Loop done."
ここのPERFORMから脱出するってわけっすよね?
PERFORM UNTIL CNT > 5
段落を抜けるってことは、また上のMOVEに行くってことになるんすか?
「戻るようで戻らない」COBOLの世界
係)お、いいとこ突いてきたな。
でもな、そこが“COBOL脳”の落とし穴ポイントだ。
な)え、また落とし穴!?
この言語どんだけトラップ好きなんすか!?
罠の中に罠とか、敵の敵はやっぱり敵で、三すくみになって、結局なにもないってことになるじゃないっすか!
係)なにも無いなら、それでいいじゃねーか!
COBOLってのはな、意外と「上には戻らない」構造なんだよ。
だから EXIT PARAGRAPH は上(MOVE 1 TO CNT)には戻らない。
な)え、じゃあどこに行くんすか!?
外!?宇宙!?美少女地獄!?
係)なんだよ美少女地獄って。
な)美少女がみちみちている状態?
係)どうでもいいこと乗せてくるなよ。
みちみちてるってなんなんだよ…
「この段落の外」——つまり、次の文(次の段落)に進むんだ。
例えば、この例だとすると
PROCEDURE DIVISION.
MAIN-PARA.
PERFORM LOOP-PARA
DISPLAY "After loop"
STOP RUN.
LOOP-PARA.
MOVE 1 TO CNT
PERFORM UNTIL CNT > 5
DISPLAY "CNT = " CNT
IF CNT = 3
DISPLAY "Special point reached!"
EXIT PARAGRAPH
END-IF
ADD 1 TO CNT
END-PERFORM
DISPLAY "Loop done."
係)EXIT PARAGRAPHでPERFORMを抜けたら、LOOP-PARAの処理を途中で中断して、MAIN-PARAに戻る。
な)あ、そか、段落はLOOP-PARA.だから、ここから抜けちゃうって話っすか!
係)その通り。
COBOLは“段落の内と外”が絶対に分かれてる。EXIT PARAGRAPHは「この段落もうおしまい、外に出る」となる。
な)あれ?MAIN-PARA.に戻るってなると、上にもどってんじゃないすか?
久しぶりにたぬき来里ですか!?
係)なんでまたたぬき呼ばわりされているんだよ、ったく。
これがCOBOLのクセモノなところでな、“戻ってるように見えて、実際は戻ってない”んだよ。
な)え?
でもMAIN-PARAに戻るってことは、上っすよね?
上に書いてありますもん。
係)見た目は上。
でも実行の流れ的には「先へ進む」んだ。
ほら、COBOLって「上から順に読む」けど、PERFORMで一時的に“呼び出し”をしてるだけ。
な)呼び出し?
係)そう、こういう流れになるってことだ。
MAIN-PARA → 呼び出し → LOOP-PARA → EXIT PARAGRAPH → MAIN-PARAに戻る
な)……あ、そっか。MAIN-PARAが上に書いてあっても、今の流れの中では「次の処理」になるんすね。
係)その通り。
COBOLって“行番号じゃなくて制御フロー”で動いてる。
つまりEXIT PARAGRAPHは呼び出し元に返す命令。
テープを逆回転してるわけじゃない。
な)うわー、ややこしいっすねこれ… 。
ということは、PERFORMを抜けたので、下の DISPLAY "Loop done." は無視されて、MAIN-PARA.に戻ったらDISPLAYに進むってことですね?

係)そうそう、まさにその通り。
つまりこういう順番になってる。
MAIN-PARA.
PERFORM LOOP-PARA
DISPLAY "After loop"
STOP RUN
① MAIN-PARA 開始
② PERFORM LOOP-PARA → LOOP-PARAの中へ入る
③ LOOP-PARAの中でCNT = 3になったとき → EXIT PARAGRAPH発動
④ LOOP-PARAの処理を途中で打ち切って MAIN-PARAに“戻る”
⑤ MAIN-PARAの次の命令(DISPLAY "After loop")を実行
⑥ STOP RUNでプログラム終了
な)おおー思ったとおりの展開!
EXIT PARAGRAPHって“PERFORM呼び出しを終わらせて外に出る”ってことっすね。
係)その通り。
でな、もしLOOP-PARAの中にEXIT PARAGRAPHが無かったら、ループを全部やりきってから、DISPLAY “Loop done.” を出して、そこからMAIN-PARAに戻ると。
な)うわ、つまり途中で“帰ってくるポイント”を作れるってことっすね!
係)そう。
EXIT PARAGRAPHは「呼び出された処理の中断スイッチ」みたいなもんだ。
しかも安全に“呼び出し元”へ返すだけで、プログラム全体はちゃんと続く。
おむすび
な)なるほどー。
なんかややこしくて頭痛いっす…
係)お前はじめる前、なんでも解決できるって言ってたじゃねーか。
な)それは係長がいればという前提をEXITしただけで。
係)だったら、お前からEXITさせろよ。
な)えー、おれが先に会社からEXITしますからー。
係)だから、俺はお前がEXITしても困らないからな?
な)少しは悲しんでくださいよ…昭和は良かったって…あれ明治でしたっけ?
係)せめて大正だろ!
係長のワンポイント
EXIT PARAGRAPH は「今いる段落の処理を即座に打ち切る」命令だ。
PERFORM UNTIL を抜けるのではなく、段落そのものを終わらせて呼び出し元に返る。
だから MOVE に戻ることはなく、MAIN-PARA の“次の文”へ進む。
見た目は上に戻っても、制御フロー的には先へ進んでいる。
EXIT PARAGRAPHは“戻る命令”じゃない──“この仕事はここまで”の宣言だ。

コメント