COBOLの GOBACK / EXIT PROGRAM / STOP RUN の違い、気になってませんか?
COBOLを勉強していると、プログラムの終わり方にいくつか種類があって、「え、どれ使えばいいの?」ってなりますよね。似たような命令に見えるけど、実はそれぞれ役割がちゃんと違うんです。
この記事では、そんなあなたの疑問をスッキリ解消! GOBACK、EXIT PROGRAM、STOP RUN、それぞれの役割と違い、そして「こういう時はこれ!」という使い分けを、初心者の方にもめちゃくちゃ分かりやすく解説していきます。
この記事で分かること
・GOBACK って何をする命令?
・EXIT PROGRAM ってどんな時に使う?
・STOP RUN ってどういう意味?
・3つの命令文の決定的な違い
・どんな時にどれを使うのがベストか
読み終わるころには、自信を持ってプログラムの出口を決められるようになっているはずですよ!
GOBACK / EXIT PROGRAM / STOP RUN の基本的な役割の違い
さて、本題に入る前に、3つの命令文の一番大きな違いを知っておきましょう。それは、プログラムの実行そのものを「まるごと」終わらせるか、それとも「呼ばれたお仕事」だけ終わって、呼び出し元に戻るか、という点です。
イメージとしてはこんな感じです。
・STOP RUN
工場全体の稼働を「停止!」させるイメージ。全ての機械が止まります。
・EXIT PROGRAM / GOBACK (サブプログラムで使った場合)
ある部署(サブプログラム)が頼まれた作業を終えて、「終わりました!」と上司(呼び出し元)に報告して持ち場に戻るイメージ。他の部署は動き続けています。
・GOBACK (主プログラムで使った場合)
工場長(主プログラム)が「今日の業務はこれで終わり!」と宣言して、工場全体の稼働を止めるイメージ。STOP RUN と同じ結果になります。
つまり、`STOP RUN` はプログラム全体を終わらせる最終手段。`EXIT PROGRAM` はサブプログラムから戻る専用。そして `GOBACK` は、状況によってどちらの役割もこなせる、ちょっと器用な命令なんです。では、それぞれ詳しく見ていきましょう!
「STOP RUN」とは?実行単位(ランユニット)全体を終了させる命令
`STOP RUN` は、COBOLプログラムの実行、つまり「ランユニット」と呼ばれる一連の処理全体を、その場で完全に終了させる命令です。これが実行されると、プログラムの制御はOS(Windowsとか、メインフレームのOSとか、プログラムを動かしている大元のシステム)に戻ります。一番強力な「おしまい」の合図ですね。
プログラムの流れの中で `STOP RUN` に到達したら、その後の処理がたとえ書かれていたとしても、実行されることなく、バッサリとプログラムが終了します。
STOP RUN の書き方
書き方はとってもシンプルです。
STOP RUN.
これだけです! 命令の後にはピリオド(.)を忘れずに付けてくださいね。
STOP RUN の使い方と注意点
`STOP RUN` は、基本的にプログラム全体の大元の処理(主プログラム、メインプログラム)の一番最後に書くのがお作法です。「全ての処理が終わったので、これにて終了!」という最終宣言の場所で使います。
一番大事な注意点は、サブプログラム(他のプログラムから呼ばれるプログラム)では絶対に使わないこと! もしサブプログラムの途中で `STOP RUN` を実行してしまうと、呼び出し元のプログラムに処理を返すことなく、プログラム群全体がそこで強制終了してしまいます。これは、システム全体で見たときに予期せぬトラブルの元になる可能性が高いので、サブプログラムでは使わない、と覚えておきましょう。
簡単な例を見てみましょう。
IDENTIFICATION DIVISION. PROGRAM-ID. MAINPROG-STOPRUN. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-MESSAGE PIC X(20) VALUE 'Main Program Finish!'. PROCEDURE DIVISION. DISPLAY 'Main Program Start'. *> ... ここでメインの処理を実行 ... DISPLAY 'Main Processing Done.'. DISPLAY WS-MESSAGE. STOP RUN. END PROGRAM MAINPROG-STOPRUN.
この例では、いくつかの処理(DISPLAY文)を実行した後、最後に `STOP RUN` でプログラム全体を終了させています。
「EXIT PROGRAM」とは?呼び出されたプログラムから抜ける標準的な方法
`EXIT PROGRAM` は、`CALL` 文などで他のプログラムから呼び出されたプログラム(サブプログラム)が、自身の処理を終えて呼び出し元のプログラムへ制御を返すための命令です。
`STOP RUN` がプログラム全体を終わらせるのに対し、`EXIT PROGRAM` は「今動いているこのサブプログラムだけを終わらせて、呼び出し元に戻りますよ」という宣言になります。
昔からある、サブプログラムの標準的な出口の書き方です。
EXIT PROGRAM の書き方
書き方自体はシンプルですが、少しルールがあります。
EXIT PROGRAM.
この `EXIT PROGRAM` 文は、通常、それ専用の段落(パラグラフ)に、この命令文ひとつだけを書く、というルールになっています。他の処理文と同じ段落には書けません。
例えば、こんな感じです。
PROCEDURE DIVISION. *> ... サブプログラムの処理 ... GO TO EXIT-PARA. EXIT-PARA. EXIT PROGRAM.
セクションを使っている場合は、セクションの最後の段落に書くこともあります。
PROCEDURE DIVISION. MAIN-LOGIC SECTION. *> ... サブプログラムの処理 ... PERFORM SUB-PROCESS. GO TO EXIT-SECTION. SUB-PROCESS SECTION. *> ... 何かの処理 ... EXIT. EXIT-SECTION. EXIT PROGRAM.
ちょっと書き方に癖がありますよね。
EXIT PROGRAM の使い方(サンプルプログラム)
では、主プログラムからサブプログラムを呼び出し、サブプログラムが `EXIT PROGRAM` で戻ってくる例を見てみましょう。
まず、呼び出す側の主プログラム(MAINPROG)です。
IDENTIFICATION DIVISION. PROGRAM-ID. MAINPROG-CALL. PROCEDURE DIVISION. DISPLAY 'Main Program Start'. DISPLAY 'Calling Sub Program...'. CALL 'SUBPROG-EXIT'. DISPLAY 'Returned from Sub Program'. DISPLAY 'Main Program End'. STOP RUN. END PROGRAM MAINPROG-CALL.
次に、呼び出されるサブプログラム(SUBPROG-EXIT)です。
IDENTIFICATION DIVISION. PROGRAM-ID. SUBPROG-EXIT. PROCEDURE DIVISION. MAIN-PROCESS SECTION. DISPLAY 'Sub Program Start'. *> ... サブプログラム固有の処理 ... DISPLAY 'Sub Program Processing...'. DISPLAY 'Sub Program End'. GO TO EXIT-SECTION. EXIT-SECTION. EXIT PROGRAM. END PROGRAM SUBPROG-EXIT.
これを実行すると、表示は以下のようになります。
Main Program Start Calling Sub Program... Sub Program Start Sub Program Processing... Sub Program End Returned from Sub Program Main Program End
サブプログラムの `EXIT PROGRAM` が実行されると、ちゃんと主プログラムの `CALL` 文の次 (`Returned from Sub Program` の表示) に制御が戻ってきているのが分かりますね。これが `EXIT PROGRAM` の役割です。
「GOBACK」とは?状況に応じて振る舞う柔軟な命令
さて、最後に登場するのが `GOBACK` です。この命令は、`STOP RUN` と `EXIT PROGRAM` の両方の性質を併せ持つ、非常に柔軟で便利な命令なんです。
どういうことかと言うと…
- サブプログラムの中で `GOBACK` を使うと → `EXIT PROGRAM` と同じ動きをします。つまり、呼び出し元に制御を返します。
- 主プログラムの中で `GOBACK` を使うと → `STOP RUN` と同じ動きをします。つまり、ランユニット全体を終了させます。
このように、実行されたプログラムが主プログラムなのかサブプログラムなのかを判断して、自動的に適切な動きをしてくれるのが `GOBACK` の最大の特徴です。
GOBACK の書き方
書き方は `STOP RUN` と同じくらいシンプルです。
GOBACK.
`EXIT PROGRAM` のように、単独の段落にしないといけない、といった特別なルールはありません。手続き部の好きな場所に書くことができます。
GOBACK の使い方と推奨される場面
`GOBACK` の使い方を、サブプログラムと主プログラムの両方で見てみましょう。
まずは、サブプログラムで `GOBACK` を使う例です。(`EXIT PROGRAM` の例とほぼ同じですが、出口が変わっています)
主プログラム(MAINPROG-CALL-G):
IDENTIFICATION DIVISION. PROGRAM-ID. MAINPROG-CALL-G. PROCEDURE DIVISION. DISPLAY 'Main Program Start (GOBACK ver)'. DISPLAY 'Calling Sub Program (GOBACK ver)...'. CALL 'SUBPROG-GOBACK'. DISPLAY 'Returned from Sub Program (GOBACK ver)'. DISPLAY 'Main Program End (GOBACK ver)'. GOBACK. *> 主プログラムの終了も GOBACK で! END PROGRAM MAINPROG-CALL-G.
サブプログラム(SUBPROG-GOBACK):
IDENTIFICATION DIVISION. PROGRAM-ID. SUBPROG-GOBACK. PROCEDURE DIVISION. DISPLAY 'Sub Program Start (GOBACK ver)'. *> ... サブプログラム固有の処理 ... DISPLAY 'Sub Program Processing (GOBACK ver)...'. DISPLAY 'Sub Program End (GOBACK ver)'. GOBACK. *> サブプログラムの出口は GOBACK END PROGRAM SUBPROG-GOBACK.
実行結果:
Main Program Start (GOBACK ver) Calling Sub Program (GOBACK ver)... Sub Program Start (GOBACK ver) Sub Program Processing (GOBACK ver)... Sub Program End (GOBACK ver) Returned from Sub Program (GOBACK ver) Main Program End (GOBACK ver)
サブプログラムで `GOBACK` を使っても、`EXIT PROGRAM` と同じように、ちゃんと呼び出し元の主プログラムに制御が戻っていますね。
そして、主プログラムの最後の `STOP RUN` も `GOBACK` に置き換えています。主プログラムで使われた `GOBACK` は `STOP RUN` と同じ意味になるので、これで問題なくプログラム全体が終了します。
このように、`GOBACK` を使えば、主プログラムであろうとサブプログラムであろうと、プログラムの出口は全部 `GOBACK.` と書けば良い、ということになります。どちらのプログラムかによって `STOP RUN` と `EXIT PROGRAM` を書き分ける必要がないため、コードがシンプルになり、分かりやすくなる傾向があります。そのため、現在のCOBOL開発では、特別な理由がない限り `GOBACK` を使うことが推奨されることが多いです。
GOBACK / EXIT PROGRAM / STOP RUN 違いのまとめと比較
ここまで解説してきた3つの命令文の違いを、改めて整理してみましょう。
STOP RUN について
・機能:プログラムの実行(ランユニット)全体を完全に終了させる
・使われる場所:主に主プログラムの最後
・制御の行先:オペレーティングシステム(OS)
・注意点:サブプログラムでは原則使わない!
EXIT PROGRAM について
・機能:呼び出されたプログラム(サブプログラム)の実行を終了させる
・使われる場所:サブプログラムの出口
・制御の行先:呼び出し元のプログラム
・ポイント:サブプログラム専用の「戻ります」宣言(書き方に少しルールあり)
GOBACK について
・機能:状況に応じて振る舞う。サブプログラムなら呼び出し元へ戻り、主プログラムならランユニット全体を終了
・使われる場所:主プログラムでもサブプログラムでもOK
・制御の行先:サブなら呼び出し元、メインならOS
・ポイント:一番柔軟で、現在のCOBOLでは推奨されることが多い出口の書き方
一番のポイントは、`STOP RUN` は「全体終了」、`EXIT PROGRAM` は「サブプログラムからの離脱」、そして `GOBACK` はその両方を状況に応じてこなせる、という点ですね!
【まとめ】適切な命令文を使い分けてCOBOLプログラムを制御しよう
今回は、COBOLのプログラム終了に関連する `GOBACK`、`EXIT PROGRAM`、`STOP RUN` の違いと使い方について解説しました。
簡単にまとめると…
- ランユニット全体を終わらせたい → 主プログラムの最後に `STOP RUN` か `GOBACK`
- サブプログラムから呼び出し元に戻りたい → `EXIT PROGRAM` か `GOBACK`
- 迷ったら → 基本的に `GOBACK` を使っておけば、主プログラムでもサブプログラムでも良い感じに動いてくれることが多い
という感じですね!
それぞれの命令文が持つ役割をしっかり理解して、プログラムのどこで処理を終えるのか、どこで呼び出し元に戻るのかを意識してコーディングしてみてください。
そうすれば、より意図通りに動き、他の人が読んでも分かりやすい、安定したCOBOLプログラムが書けるようになるはずです。
【関連記事】