🧩今日の学び
・ピリオドは単なる句読点ではなく、処理範囲を終了させる「文の終端スイッチ」である
・END-IFやEND-PERFORMは構造を閉じるだけであり、処理自体はピリオドが来るまで継続する
・COBOLは改行では止まらず「どこまでが1文か」で動くため、意図しない処理範囲に注意が必要
なるお)ん〜、む〜、もーん
係長)なんだよ、腹痛いならさっさとトイレ行ってこいよ。アイスばっか食ってるから腹下るんだよ。
な)ちがわい!
係)おっ!?
な)そうじゃなくて、なんでここはピリオドが入って、ここはピリオドはいらないんだって話を考えてんですよ!
係)おお…お前が食べ物以外のことでむーむー言ってないとか、どんどん単細胞生物から抜け出してきてるな…
な)どういうこと!?
って、いいんすよ、得意の人権侵害発言なんて!今日も人権侵害の申し立てをしておけばいいだけなんで。
係)してねーだろ!って、「今日も」ってなんだよ…
な)だからいいんですって!
なぜここにピリオドが無いのか
な)これ、完璧なうっとりコードだったはずなんすけどー
1IDENTIFICATION DIVISION. 2PROGRAM-ID. CALC-SUM. 3 4DATA DIVISION. 5WORKING-STORAGE SECTION. 6 701 X PIC 9(3) VALUE 0. 801 TOTAL PIC 9(5) VALUE 0. 901 Y PIC X(3). 10 11PROCEDURE DIVISION. 12 13PERFORM UNTIL Y = "=" 14 15 DISPLAY "IRERO" 16 ACCEPT Y 17 18 IF Y = "=" 19 CONTINUE 20 ELSE 21 IF FUNCTION TEST-NUMVAL(Y) = 0 22 MOVE FUNCTION NUMVAL(Y) TO X 23 ADD X TO TOTAL 24 ELSE 25 DISPLAY "ERROR ZANEN ENTER SUJI!!" 26 END-IF 27 END-IF 28 29END-PERFORM 30 31DISPLAY TOTAL. 32STOP RUN.
で、この部分
DISPLAY "IRERO"
ACCEPT Y
ピリオドないなーって思ったわけですよ。
動いたから合ってる?と思ったけど、ここはつながってるわけじゃないからピリオドいるなーと思ったわけで。
とか考えだしたら、ムッキムキになってきて。
係)なんだよムッキムキって。お前の体型はダラダラだろ?
な)今日ひどすぎ!
COBOLは「文」と「構造」で動いている
係)だったら見ていくか。
まず、COBOLには2つの考え方がある。
「文で区切る古いCOBOL」と「構造で読む今のCOBOL」だ。
な)は?
係)だからな、今の知識だけで昔のCOBOLを見ると、「ここで終わりだ」と思った場所が、実は終わってないことがある。
それが一番危ないぞ。
な)なんか入れたほうがわかりやすいような気がしますけど…
係)それやるとループが終了する可能性もあるからな、お前はここ終わり終わり!って短絡的に文を終わらせて、ぐちゃぐちゃにするタイプだから気をつけておけよ。気をつけておけよ。
な)なんで二回言うんすか…そもそも気をつけるも何も…
係)だから気をつけろって。
な)三回いう必要ないから!
だったら、係長はなにを思ってピリオドつけてんすか!
係)感覚だな。
な)技術者かよ…
係)技術者だよ…
慣れていけって話だよ。
な)じゃあじゃあ、END-IFやEND-PERFORMとかはどうなんす?最後のEND−PERFORMがこの塊の終わりっぽいから、ここだー!って筆に墨汁を吸い込ませて、点をつけたら半紙破けますよ?
係)紙を無駄にすんなよ…
END-IFでは終わらない、PERFORMはまだ続いている
でも、ま、こっちは考え方は正しいな。
PERFORMという1つの文の塊が終わったんだから、最後のEND-PERFORMにピリオドを入れるということはな。
そして、END-IFでは、親のPERFORM文が終わってないんだから、IFが終わったとしてもIFが終わっただけでPERFORMはおわってないんだから、ピリオドはいらん、というわけだな。 ピリオド付けるとそこで全部終わるって考え方をしておけばよいな。
な)はー。
つまり、宇宙という単位で考えたとき、ちっぽけなEND-PERFORMは、宇宙の一連の流れの終了とはならないから、ピリオドはいらないってことになりますね。
係)ならねーよ!なんで宇宙単位の話にするんだよ!
な)いつの間にかスピリチュアルな話になったのかなと。
係)どこからどうなったら、スピリチュアルな話になったんだよ…。
な)つまりは、ピリオドは強制終了みたいなもんすかね。
係)わかってて脱線させるんじゃねーよ!
ピリオドは「強制終了」のスイッチ
係)つまり、ピリオドは単に句読点というわけではないということだな。
な)でもでもー最後のEND-PERFORMにピリオドなくてもよくよくないです?
係)お前自分でここだーってピリオド入れてんだから、ここにピリオドが必要だってわかってんだろ…
な)いや、だって、ここにピリオドなくても影響なさそうじゃないっす?
PROCEDURE DIVISION.
PERFORM UNTIL Y = "="
DISPLAY "IRERO"
ACCEPT Y
IF Y IS NUMERIC
ELSE
END-IF
END-PERFORM. ←ここ
DISPLAY TOTAL.
STOP RUN.
こぼるんだってこういう空気は読める子なはずですよ!
係)だからお前はなに目線なんだよ…
係)もう結論でいくぞ。
外側END-PERFORMにピリオドがなくても動く場合は多い。でも、付けるのが正解(実務的に)。はい以上。
な)ちょっとーめんどくさくならないでくださいよ!課長に係長が働かないって匿名メール送りますよ!
係)匿名って係員お前しかいねーだろ…
な)係長の評判下げるのも大変なんですから!
係)下げてんじゃねーよ!
いいか!
END-PERFORM DISPLAY TOTAL.
これでも、DISPLAYのピリオドで全体終了とはなるだろうな。
ピリオドがないと処理はどこまでも続く
係)しかし、ピリオドがないと意図しない範囲まで巻き込む可能性はあるってことだ。
PERFORM UNTIL Y = "="
処理
END-PERFORM
DISPLAY TOTAL
DISPLAY "END".
↓これが
PERFORM ~ DISPLAY TOTAL DISPLAY "END"
と判断される
なんども言うが、COBOLは改行では終わらない。ピリオドが来るまで、終わらない。
最後のEND-PERFORMだけでは 「ここで終わり」が確定していないってことだ。
それに他の者が見ても、ここで終わりっていう区切りが確認できるだろ?
な)俺が終わりっつったら終わりだからって、劇場版ジャイアン理論すね…俺のモノは俺のもの、地球にあるモノは俺のものでしたっけ?
係)どんだけ強欲なんだよ!
じゃ、これやってみろ。
DISPLAY "A" DISPLAY "B" DISPLAY "C".
な)は?
係)うまく形にして、実行してみろっていってんだよ!さっさとやれ!
な)ほんとジャイアン以上、七つの大罪以下だよなぁ…
係)なに?
な)いえいえ…
(次回へ続く)
係長のワンポイント
ピリオドは句読点じゃない、処理範囲の終端スイッチだ。END-IF や END-PERFORM は構造を閉じるだけで、処理はまだ続いている。
COBOLは改行では止まらず、ピリオドが来るまで実行範囲が伸びる。
だから1つのピリオドで、想定外の処理まで巻き込むことがある。
COBOLは見た目ではなく、“どこまでが1文か”で動く言語だ。


コメント