🧩今日の学び
・PERFORM THRU は段落を“範囲指定”で実行し、END段落のピリオドで呼び元に戻る仕組み
・END-PERFORMはループの終わりであり、段落や呼び出しの終了を意味しない
・THRUの乱用は保守で静かに壊れるため、「読む人の生存」を最優先に構造を設計すべき
今回のコード
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."
係長)お前未亡人とかいってたから、忘れてたが、お前これ全然読んでないからな。
なるお)あ・・・もういいんじゃないすか。お疲れした。
係) 待て待て!
半角と全角と未亡人しか言ってないからな!
な)いやいや、係長が好きそうな設定じゃないすかー、係長が全角スペースですよ。
係)なんでだよ!嫌な奴の方にすんな!
違うって!くそ、お前のペースに巻き込まれると勝てねーよ。
な)で、THRUってなんです…
係)そうだよな!そこだよな!
横道にそれすぎだろ!もっと本道をいけっての!
な)Yes, Sir!!
で、THRUってなんです?
係長)はぁ…
な)あれ?
これってもしかして
INI-PARAからEND-PARAまで順に処理をしていくとか?
なに、また、おしゃれ記述ってやつー?
七三分け黒縁のくせにおしゃれ気にしすぎでしょ!
係)お前一回現場行って、色んな人から殴られてこい。
まず、考え方は正解だ。
PERFORM THRUの正体:段落を“範囲指定”で実行する仕組み
係)PERFORM INIT-PARA THRU END-PARA は——
INIT-PARA から始めて
NEXT-PARA も含め
END-PARA まで(含めて)実行し
END-PARA の文末(ピリオド)で呼び元に戻る。
つまり「段落のレンジ実行」だ。
な)やっぱ俺すごいっすよね。
係)なんでそーなる!?
な)あ、でも、THRU ってわざわざ書かなくても、段落は順に実行されるように思ったり思わなかったり。
俺、カップヌードルは蓋しないんですけど、ほかの3分のカップ麺は蓋をどうするかって思ったり思わなかったりするんですよねー。
係)知らねーよ!
今の話のどこにカップ麺の話がつながる余地があったんだよ!
いいか!
COBOLの PERFORM 段落名 は、その段落の文末(ピリオド)まで実行したら必ず呼び元に戻る。
次の段落へ“勝手に落ちていく(フォールスルー)”ことはない。
だから複数段落を続けて走らせたいときにTHRU を使うわけだ。
昔はGO TO NEXT-PARAとかやって地獄になった…。読む人が死ぬやつだ。
な)へー、THRU はおしゃれ記法ってわけじゃなく、必要な用途があるのね。
係)そう。そもそもおしゃれ記述ってなんだよ。
な)え、だったら、NEXT-PARA の中に END-PERFORM があるから、END-PARAいらなくね?ってなりません?
係)なんでそうなるんだ?
END-PERFORMはループの終わりを示すだけだ。
段落の終わりじゃないし、PERFORMの呼び出し元に戻る合図ではない。
呼び出しから戻るのは、段落(END-PARA.)のピリオドでだ。
だからEND-PARA段落の文を実行して、その文末のピリオドで帰る。
な)あ、ちゃんと見たら、スタートのPERFORMがあった。
先に言ってくださいよー。
係)お前最初のPERFORMしかみてないんだろって。
な)係長のせいですからね!アイスか鈴カステラでいいですからね!
係)鈴カステラって…。
お前が“スタートのPERFORM”見落としてるのに、なんで俺のせいになるんだよ!絶対買わねーからな!
な)だって係長、字が小さいし、老眼入ってるでしょ?
だから「見落とす目線」で話してるんですよ!
係)俺が老眼でも、お前が文盲ならチャラにならねぇんだよ!!
な)ひど!これが現場のパワハラってやつっすか!?
段落名に残しておきますよ!?
係)残せよ。その段落名も見逃すんだろ?
な)正論やめましょうよー。
係)否定しろよ!
いいか、PERFORMってのは、COBOL界の「スタートの合図」なんだ。
「これから、ここからここまで実行するぞ」って宣言。
始まりと終わりをペアで見るのが基本。
END-PERFORMだけ見ても意味がわからん。
だから、最初のPERFORM見て、「あぁ、ループ型ね」って判断するんだ。
ちゃんと戻って照らし合わせる。
COBOLは「BEGIN〜END構造が明示的」だから、見比べるのが作法なんだ。
な)ってことは最初のPERFORMをみたらEND-PERFORMを探しておけば安心安全監視社会ですかね。
係)そう、いや監視社会とじゃどうでもいいんだが、そういうことだ。
——“PERFORMを見たら、END-PERFORMを探せ”。
それがCOBOL界の生存本能
な)生存本能!?大げさっすね!
宝くじ1万円当たって喜んでるぐらいの大げさですね。実際今までいくら注ぎ込んでんだって話なのに。
係)大げさじゃねーぞ。
お前な、現場でCOBOL読んでると、だいたいこうなるんだ。
「お、PERFORMあるな」
「…あれ?どこまで続いてんだ?」
「…どこで終わってんの?」
「……END-PERFORMねーじゃねーか!」
——で、魂が抜ける。
な)たしかに長いコードで探すのしんどそうっすね。
係)そう。COBOLはな、“見た目でブロックが閉じてるかわからない”ことが多い。
インデントが浅いからな。
だから、PERFORMを見つけた瞬間、頭の中で「このあとEND-PERFORMを絶対探す」ってスイッチ入れとくのが鉄則だ。
な)へー、なんか真に迫ってる感じがしますけど、なんかやらかした過去があったとか?
係)…
な)あー!あったんすね!
何やらかしたんすか! ニヤニヤ
ね!ね!係長!
係)うるせーっての!俺の過去をほじくるな!
なぜTHRUは危険か:保守で静かに壊れる“範囲指定”
係)いいかTHRUの話だが、乱用は非推奨だ。理由は3つある。
保守で段落が間に挟まると、THRU の範囲に余計な段落まで入って事故る。
“範囲指定”は静かに壊れやすい(後から入った人に伝わりづらい)。
代わりに1つの段落(またはSECTION)にまとめるか、必要な段落を個別に PERFORMした方が安全。
要は「読む力を残す」構成にしろってことだ。
さっきの見逃しの話ともつながるから覚えとけ!
な)で?
係)なにが?
な)何あったんすか?
係)なんもないっていってんだろ!!!
な) (じー)
END-PERFORMを書き忘れた夜:止まらなかった本番バッチ
係)……ま、まぁ、昔な。新人時代にやらかしたんだよ。
な)おお!きた!黒歴史回想きた!
係)客先の本番バッチでな、PERFORM UNTIL 書いて … END-PERFORM書き忘れた。
な)……まさか。
係)そう。止まらなかった。
な)うぉぉ!!無限ループ!?
係)夜中の2時に呼び出されて、「この処理、まだ回ってるんですけど」って電話。
ターミナル見たら、同じ行を一晩中DISPLAYし続けてたんだよ。
おむすび
な)あらー、新人時代とはいえ係長も失敗するんですねー。
やっぱり係長も人間だったんで、安心しました!
係長)どういうことだよ?
な)鬼か悪魔か天狗かジャージーデビルかと思ってたんで人間でよかったなと。
係)ジャージーデビル?
な)なんか鳥っぽい感じのUMAです。
係)あ、そ…。今日、なんか疲れた…
係長のワンポイント
PERFORM THRUは「段落名の範囲をまとめて実行する」便利だが危険な命令だ。
途中に段落が追加されると、意図しない処理まで静かに巻き込む。
動くかどうかではなく「後から読んで分かるか」が保守の分かれ道になる。
安全にしたいなら、1段落にまとめるか、個別にPERFORMするのが定石。THRUは“最短距離”、だが“最安全”ではない──現場では慎重に使え。

コメント