【COBOL 読み3ー1】EXITでいろいろ抜けてしまえ!〜EXIT PARAGRAPH

🧩今日の学び
・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.スタートして、PERFORMLOOP-PARAの実行。

LOOP-PARAスタートして、1CNTに入れて準備完了。

ループ開始。CNTを超えるまでルーピングスタート。
CNTだったら、Special point reached!とか言っちゃったりして。

言っちゃったりしちゃったらEXIT PARAGRAPH…?
PARAGRAPHって段落?

って、またEXIT?どんだけ抜けたいのさ!どんだけ仲悪いアイドルグループなのよ。

CNTじゃなかったら、END-IFからCNT入れちゃう系。
ルーピングが終わったら、もしくは、PARAGRAPHから抜けたら、DISPLAYAfter 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 PARAGRAPHPERFORMを抜けたら、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-PARALOOP-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は“戻る命令”じゃない──“この仕事はここまで”の宣言だ。

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

この記事を書いた人

コメント

コメントする