🧩今日の学び
・PERFORM THRUは段落を順番に実行して呼び出し元へ戻る「一回きりの段落実行」
・END-PERFORMはループ終了、EXIT PERFORMは途中脱出、STOP RUNはプログラム全体終了
・COBOLの制御構造は「どこまで終わらせるか」を常に意識して書く必要がある
係長)て、いいんだよそんなことは!
なるお)いや、疲れたって言い出したの係長ですって。なんで早退しましょ!ついでに飲みに行きましょ!昼飲みいきましょ!飲み代出してくれれば付き合いますよ!
係)だからいいんだよ!忘れろ!この瞬間に忘れろ!いいな!
な)そんな段落名なんでもいいからって、愛と恋の違いってなんですかって話ですよ。
係)しらねーよ!だから読めっての!
な)その読めって嫁とかけてます?
係)うるせー!早くやれ!
今日のコード
PERFORM INIT-PARA THRU END-PARA
STOP RUN.
INIT-PARA.
DISPLAY "Initializing..."
MOVE 1 TO CNT.
NEXT-PARA.
PERFORM UNTIL CNT > 3
DISPLAY "CNT = " CNT
ADD 1 TO CNT
END-PERFORM
DISPLAY "Loop done."
END-PARA.
DISPLAY "Program finished."
な)ブーブー!
係)豚の真似はいいから、はよしろ!
な)なんてひどい…愛も何も無いっすよ…
係)どうでもいいから!
PERFORM THRUの流れ:段落を順番に実行するだけの命令
な)むー。
INIT-PARAからEND-PARAまで一つずつPERFORMを進めていく。
んでINIT-PARAからはじまって、Initializingを表示からのCNTに1入れる。
NEXT−PARAに進んで、CNTが3より大きくなるまでルーピング。
まずは、CNT=表示させてCNTに入っている数字を横に表示。そしてCNTを1プラス。
終わったらPERFORM UNTIL CNT > 3のループPERFORMから抜けて、Loop done.を表示する。
そして、END-PARA. に進んで、Program finished.を表示する。
これでどうっすか?
係)なんかイラッとする言い方だが、合格だ。
な)あのー
PERFORM INIT-PARA THRU END-PARA
STOP RUN.
ってなってますけど、なんでSTOP RUNになるんです?
PERFORMだからEND-PERFORMで終わるもんじゃないんですか?
なぜSTOP RUNなのか:PERFORMとプログラム終了の関係
係)やっと気づいたか。
PERFORMは「ほら、この段落を動かしてこい」って命令。
で、動かし終わったあとに、プログラム全体を止めるためにSTOP RUN.を書く。
もう少し詳しく言うとだ、COBOLのPERFORMには、大きく2種類ある。
段落呼び出し型(PERFORM THRU)
「指定した段落たちを順番に実行して戻る」
ループでも繰り返しでもない。1回きり。
終わったら呼び出し元(つまり STOP RUN の上)に戻る。
繰り返し型(PERFORM UNTIL / TIMES)
「条件が満たされるまで、同じ処理をグルグル回す」
この中ではEND-PERFORMが必要。
つまり
PERFORM INIT-PARA THRU END-PARA ← 段落呼び出し
↓
INIT-PARA. ~ END-PARA. の中を全部実行
↓
戻ってくる
↓
STOP RUN. ← プログラム終了
という流れになる。
終わり方は3種類:END-PERFORM/EXIT PERFORM/STOP RUN
な)うーん。
ルーピングとかの何度かPERFORMの中で何度か回すときはEND-PERFORMで抜けさせる必要がある。
回す必要がなければ、STOP RUNで終わらせる?
てか、この段階で終わらせる必要がなければ、STOP RUNは必要ないって感じっすよね。
ここにEXIT PERFORMの考え方が入ってくると…
うーん、読むのは別に困らないけど、書くときに悩ませるとか嫌な感じですね。
係)そうだな。
「読むのは分かるけど、書くとき悩む」——そこがCOBOLの真髄だ。
ここを整理しておくぞ。
今言ったように、PERFORMまわりってのは「終わり方が3種類」ある。
それぞれ“どのレベルで終わるか”が違うんだ。
| 終わり方 | 対象 | 意味 | どこに戻るか |
|---|---|---|---|
| END-PERFORM | ループ | このPERFORMブロックを閉じる | そのまま次の文へ進む |
| EXIT PERFORM | ループ | ループの途中だけど抜ける | PERFORMの外(次の文)へジャンプ |
| STOP RUN | プログラム全体 | もう終わり | どこにも戻らない(実行終了) |
な)つまり、STOP RUN → 終業ベルEND-PERFORM → 授業終了EXIT PERFORM → せ、先生!漏れるからトイレいってきます!あ…
てな感じっすよねー。
おむすび
係)それ最後の例えを言いたかっただけだろ…ホント疲れた…
な)大丈夫ですか?
疲れたときはカレーもいいっすよ。辛!!とか言ってれば元気になりますって!憂いだらけも人生も晴らせますって!
係)誰のせいで、憂いだらけなんだよ…
係長のワンポイント
PERFORM THRUは「段落を順番に一度だけ実行して戻る」呼び出し型だ。END-PERFORMはループ構文の中だけで使う“繰り返し終了の合図”。
段落呼び出しにはEND-PERFORMは存在せず戻った先で次の文が実行される。
プログラム自体を終わらせたいなら、そこで初めてSTOP RUNが必要だ。PERFORMは処理の依頼STOP RUNは人生の終業ベル──役割は全く別だ。

コメント