【COBOL 読み3-7-1】EXIT系総まとめ〜COBOL姫の大冒険

🧩今日の学び
EXIT系命令は「脱出単位の違い」で整理すると一気に理解できる。
GO TONEXT SENTENCEは、構造と意図がコードに残らない点が最大の危険。
・COBOLの制御は“どう抜けるか”を明示することで、安全性と可読性が保たれる。

係長)ずっとEXIT関係を説明してきたが、ちゃんと理解してるんだろうな?

なるお)ろん of もち ですよ!

係)聞いた俺が間違いだったと…。

まぁいい。今日は EXITの総まとめ回とするぞ。

ちゃんと使い分けできるようになれ。

な)同じような話が続くんですもの⋯。使い分けとか言われても…。

係)コードなんてそういうもんだろが。いちいち文句言うな。覚えろ!

な)また横暴な…

あ、暴暴茶飲んだことあります?

係)ないし、どうでもいい。

な)え!?

係)まずは全体像からだ。

な)はい…

EXIT系は全部「脱出口」だが、脱出単位が違う

係)EXIT 系は全部「脱出口」だが、脱出単位が違う

これだけ覚えればいい。

な)また難しい感じに言う…

係)うるさいからな。

① EXIT PARAGRAPH

EXIT PARAGRAPHは、いま入っている入口だけ抜ける

コード例

MAIN-PARA.
    DISPLAY "開始"
    PERFORM SUB-PARA
    DISPLAY "戻ってきた"
    STOP RUN.

SUB-PARA.
    DISPLAY "サブ処理"
    EXIT PARAGRAPH
    DISPLAY "ここは実行されない".

結果

開始
サブ処理
戻ってきた

• 影響範囲:そのPARAGRAPH
• 小さく・安全
• 一番局所的

イメージとしては「この部屋から出る」

な)部屋から出る。買い物にでも出かけるんですかねー。

② EXIT SECTION

係)EXIT SECTIONは処理のかたまりごと抜ける。

コード例

MAIN-SECTION.
    PERFORM INIT-PARA
    PERFORM MAIN-PARA
    DISPLAY "ここは実行されない"
    STOP RUN.

INIT-PARA.
    DISPLAY "初期化"
    EXIT SECTION.

MAIN-PARA.
    DISPLAY "本処理".

結果

初期化

• 影響範囲:SECTION 全体
• 初期化失敗・前提条件NGで使うことが多い

イメージは「このフロアはもう用無し」

な)どんだけ広い家なんだって話ですよね。絶対姫じゃないですかこれ。馬車に乗りに行く途中じゃないですか!

③ EXIT PERFORM

係)EXIT PERFORMは、ループ自体を終わらせる

コード例

PERFORM VARYING I FROM 1 BY 1 UNTIL I > 5
    IF I = 3
        EXIT PERFORM
    END-IF
    DISPLAY I
END-PERFORM

結果

1
2

• 影響範囲:PERFORM 全体
• break 相当

イメージは「今日はもう店じまい」

な)馬車でお気に入りのブティックにいったら、「今日店じまいなんで…」とか言われて、セバスチャンに「このお店潰しておしまい!」とか怒りのままに言っちゃってますよ。これだからプリンセスのわがままは。

④ EXIT PERFORM CYCLE

EXIT PERFORM CYCLEは、今回の1周だけスキップだ。

コード例

PERFORM VARYING I FROM 1 BY 1 UNTIL I > 5
    IF I = 3
        EXIT PERFORM CYCLE
    END-IF
    DISPLAY I
END-PERFORM

結果

1
2
4
5

• 影響範囲:今の1回
continue相当
• 一番“構造に優しい”

イメージとしては、「この客は飛ばして次」

な)まだプリンセスムーブ続きますか!違う店に行ったら下民が先に会計しようとして、「下民は後回しでよろしいでしょう?最上民のあたくしが一番でしょう?」みたいな。まったくわがままに育ちすぎですぞ姫。

⑤ EXIT PROGRAM

係)EXIT PROGRAMは、呼び出し元に戻る(前提あり)だ。

コード例

メイン
CALL "SUBPROG"
DISPLAY "戻った"
STOP RUN.
サブ
SUBPROG.
    DISPLAY "サブ処理"
    EXIT PROGRAM.

結果

サブ処理
戻った

CALLされていることが前提
CALL専用サブで使う
• 意図が強い

※メインで使うと 何も起きない(危険)

イメージとしては、「俺の仕事はここまで」

な)ついにセバスチャンに見放されちゃいますよね!馬車から放り出されてあっけにとられる姫。スポットライトを浴びて「あぁ、私はなんてわがままだったのか」って、気づくの遅いわ!セバスチャンも呆れてますよね、絶対!

⑥ GOBACK

係)GOBACK「帰れるなら帰る/無理なら終わる」だ。

コード例

SUBPROG.
    DISPLAY "処理中"
    GOBACK.

CALLされていたら、CALL元へ戻る
• メインなら終了
• 一番安全だが、意図は弱い

イメージは「来た道があれば帰る」

な)そうですよね。初めて歩いて帰る姫。歩き姫。スカートの裾をずりずりと引きずりながら汚い道を歩く姫。セバスチャンもその姿を見ると涙が止まらないですね!

⑦ NEXT SENTENCE(※例外枠)

NEXT SENTENCE「次のピリオドの後へ」だったな。

コード例

IF A = 1
    DISPLAY "A=1"
ELSE
    NEXT SENTENCE
DISPLAY "ここが次".
DISPLAY "終了".

A = 1 だったときの結果

A=1
ここが次
終了

A ≠ 1 だったときの結果

終了

※「DISPLAY “ここが次”.」は 実行されないぞ。

• 構造・名前では決まらない
• 記号依存
• 読むために知る/書かない

イメージは「句読点ワープ」だな。

な)セバスチャンの能力「姫ワープ」を使用して、姫を屋敷にワープさせたんですね。姫も改心して、素晴らしい国になっていくんですね⋯感無量ですね。

係)だから、どこに姫要素があったんだよ…。

EXIT METHOD / EXIT FUNCTION

な)あれ?なんすかEXIT METHOD / EXIT FUNCTIONとか。

そんなのやってないっすよ!俺の記憶力は最強なんですから!

係)なんでやったことは覚えていないのに、やってないことは覚えてるんだよ…

いいか、これはモダンCOBOL限定な話だ。

一言で言うと「METHOD / FUNCTION から抜ける EXIT」ということだ

EXIT METHOD

コード例

METHOD-ID. SAMPLE-METHOD.
    DISPLAY "メソッド開始"
    EXIT METHOD
    DISPLAY "ここは実行されない"
END METHOD.

結果

メソッド開始
呼び出し元に戻った

呼び出し側のイメージ

INVOKE OBJ "SAMPLE-METHOD"
DISPLAY "呼び出し元に戻った"
  • EXIT METHODに到達した瞬間、「メソッドの処理は終了
  • その下に書いてある処理は「全部スキップ
  • 呼び出した側に制御が戻る

EXIT FUNCTION

FUNCTION-ID. ADD-ONE.
    IF X < 0
        EXIT FUNCTION
    END-IF
    MOVE X + 1 TO RETURN-VALUE
END FUNCTION.
  • FUNCTIONを終了
  • 戻り値を返す
  • return相当

もう少し詳しく言うと「関数を終了して、値を返す(または返さず戻る)」ということになる。

それでコードの結果だが、

ケース①:X = 5 のとき

  • IFに入らない
  • RETURN-VALUE6が入る
  • 関数終了

呼び出し側の結果

戻り値 = 6

ケース②:X = -1 のとき

  • IFに入る
  • EXIT FUNCTION実行
  • RETURN-VALUEを設定しないまま終了

呼び出し側の結果

戻り値 = 未定義(処理系依存)

EXIT FUNCTION の注意点

係)EXIT FUNCTIONは必ず戻り値を意識しろ。

  • 途中EXITするなら
    • デフォルト値を入れる
    • もしくは異常値を返す
MOVE -1 TO RETURN-VALUE
EXIT FUNCTION

という感じだ。

命令対象
EXIT PROGRAM従来のプログラム
EXIT METHODOOPの METHOD
EXIT FUNCTIONFUNCTION

全部「脱出単位」が違うだけで、思想は同じだぞ。

な)一言でまとめられるんじゃないんですか…

係)記憶力いいんだろ?こんぐらいすぐ覚えろよ。

な)おじさんは、すぐ根に持つ…。

全体的なまとめ

係)いいから、全体をまとめるぞ!

EXIT は「いま何の中にいるか」で選ぶんだ。

EXIT PARAGRAPH → 入口を抜ける
EXIT SECTION → かたまりを抜ける
EXIT PERFORM → ループ終了
EXIT PERFORM CYCLE → 今回だけスキップ
EXIT PROGRAM → CALL元へ戻る(前提あり)
GOBACK → 状況判断して戻る or 終了
NEXT SENTENCE → ピリオド依存ワープ(書くな)
EXIT METHOD/FUNCTION → OOP用の出口

そして逆から考えるとこういうことになる。

PARAGRAPH の中 → EXIT PARAGRAPH
SECTION の中 → EXIT SECTION
PERFORM の中 → EXIT PERFORM / CYCLE
METHOD の中 → EXIT METHOD
FUNCTION の中 → EXIT FUNCTION
PROGRAM の中 → EXIT PROGRAM / GOBACK

つまり、

  • EXITは「逃げ」じゃなく、構造を壊さずに抜ける正式ルート
  • GO TOは非常口を壊す
  • NEXT SENTENCEは非常口が見えない

ということだ。

おむすび

な)はーなんか感動ですよね。

係)そうだな、EXIT関係でもこれだけあるんだからな。

覚えるまで時間がかかるが、ここは必須だぞ。

な)姫は今後どうなると思います?

係)は?

な)やーだって、COBOL姫が安泰じゃなかったら、国が傾きますよ?そんなんじゃ姫のために下民は戦ってくれないですよ?

係)どこの国だよ!勝手にCOBOLと合体させるな!

係長のワンポイント

EXITは全部「逃げ」じゃない──構造を壊さずに抜けるための正規ルートだ。
違うのは“どこまで終わらせるか”という脱出単位だけ。
PARAGRAPH・SECTION・PERFORM・PROGRAM・METHOD・FUNCTION、それぞれ出口が用意されている。
GO TOは非常口を壊し、NEXT SENTENCEは出口を見えなくする。
EXITを正しく選べる人間が、COBOLを安全に書ける。

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

この記事を書いた人

コメント

コメントする