【COBOL 書き1-8-3】オーバーフローと想像力!999+1の恐怖

🧩今日の学び
・COBOLでは桁数(PIC)を超えるとオーバーフローが発生し、結果が静かに壊れることがある
・なるおの気づきの通り、計算結果を入れる「箱のサイズ」を事前に想像することが重要
・変数サイズはただの箱ではなく、異常データからシステムを守る防波堤になる

係長)さて

なるお)なんすか…

係)なんだよ?

な)だって、「さて」とか言ったらだいたい文句じゃないすか…

係)文句言うな!ありがたい助言だろ!

な)ありがたいってのは、吉野家とすき家どっちがいい?つって、牛丼を持ってきてくれる上司ですよ…。

係)なんでお前に牛丼くわせなきゃならないんだよ…

な)だったら、マックのポテトでも。

係)大して変わらないだろ!

な)最低でもウイダーinゼリーのブドウ糖のやつで。

係)もう糖分10年ぐらい取らなくても死なねーだろうよ…

な)いやいやいやいや。

そんな無味乾燥な世界生きる意味あります?

係)もううるせ!

昨日のお前が書いたコードだ。

📝 COBOL cal.cob
01 X PIC 9(3).
01 TOTAL PIC 9(3) VALUE 0.
01 Y PIC X.

な)あー初期値の要否を完璧に見抜き、変数のダイエットと自身のダイエットを同時に達成した俺の100点満点のコードじゃないっすか。

係)全然お前自身のダイエットは成功してないからな。

正しいコードでも「思想」が足りない

いいか、構造としては100点だ。

だが、お前にはまだ「思想」が足りない。このままだと実務では一瞬でクビになるぞ。

な)なんでですか? こぼるんもご機嫌で、生徒たちの校則違反を取り締まってますよ!

係)それ嫌われるだけだろ…。

いいか、割り算をやったときのこと思い出してみろ。 「10 ÷ 3」をやるとき、お前はどうした?

な)えーと、「余り」が出るから REMAINDER を使ったり、小数点になるから V とかおしゃれに使ってみたり?

係)お前のおしゃれ感がわからんが…、それは計算した結果が「どうなるか」を想定(想像)したからこそ、正しい箱を用意できたわけだ。

な)まぁ、スキル「千里眼」が発動しちゃいますからね。パッシブですよ?

係)…。

だったら、この足し算機でも想定してみろ。

入力する数字 X の箱は PIC 9(3) だ。つまり最大で「999」まで入力できる。

999+1で何が起きるか想像できるか

であれば、その「999」を入力して、次にもう一回「1」を入力して足し算したら、合計の TOTAL はいくつになる?

な)えーと、999 + 1 = 1000 っすね。

係)そうだな?

な)そりゃそうですけど…??

………… あ …、TOTAL ってPIC 9(3) だから……3桁っすか?

係)そうだ。結果は「1000」の4桁になるのに、お前が用意した箱は「3桁」しかない。

これを入れるとどうなると思う?

な)え…溢れる…?あの日の淡い思い出が溢れ出してもう戻らないってやつすか?

係)なにがあったんだよ!

桁あふれ(オーバーフロー)は静かに壊れる

いいか!

オーバーフローっていうんだが、COBOLの場合、はみ出た上の桁(この場合は千の位の「1」)が切り捨てられて、結果が「000」になってしまうぞ。環境によるがな。

最悪の場合はプログラムが異常終了(アベンド)して死ぬぞ。これも環境によるがな。

な)え!1000円が0円になったら、うちぐらいの会社は一瞬で潰れちゃうじゃないっすか!

係)ま、まぁ、意味はそうなんだけどな…、お前、うちの会社も馬鹿にしてんだろ…

だ、だからだ!金融システムなんかでこれをやったら、損害賠償ものの大事故だ。だから、合計値を入れる箱は、足し込む元の箱よりも大きく設計しておかなきゃならない。

な)だったら、TOTALの箱はもっと大きくしておけばいいわけでしょ?

係長がPIC 9(3)とかちまいの書くからちまいほうがいいのかなと思ったんすけど、01 TOTAL PIC 9(100) ぐらいにしておけば、この宇宙も飲み込んで、隣り合う宇宙まで侵食できますね!

係)ちまくて悪かったな…。

むやみやたらに箱をデカくすればいいってもんじゃないぞ。

「何桁になるかわからないから、とりあえずデカくしておく」というのは三流の考え方だ。

な)えーなんでですか?大は小を兼ねるんだから、極大も極小を兼ねるでしょ?三流はその程度なんですよ。極三流はそれをも凌ぎますけど。

係)ほんとうるさい、三流にはかわりないだろ!

このシステムは1回の入力の最大値はいくつか。
最大で何回くらい足し算が行われるのか。

業務の仕様を理解し、「どんなに多くてもこの桁数には収まるだろう」という限界値を想定する。 それがプログラマーの思想だ。

なんども言ってるが、無駄にデカい箱(変数)を何万個も作ったら、メモリを圧迫してシステム全体が激重になるんだよ。特に昔のCOBOL時代はメモリが超高価だったから、1桁の無駄すら許されなかったんだよ!

な)あー、いつのものやつっすね…

変数サイズは「防波堤」である

係まぁ、今はマシンの性能も上がってるし、昔ほどうるさくはないが、もう一つ決定的な理由がある。

変数のサイズは「異常なデータからシステムを守る防波堤」になるんだよ。

な)また、大げさに言う…

係)だったら、お前が腹減って、注文システムで牛丼を注文しようとしている。

な)ふむふむ

係)今日の腹の減りぐらいだったら、5個ぐらいかなとか思ってるだろ、どうせ?

な)ふむふ…む??

係)でも、お前がついに狂いだして、100万個買う!とか言って入力したらどうなる?

な)…幸せ?

係)あのな、牛丼1つ500円として、お前5億払えんのか?

な)は!?

係)お前が狂っただけならいつも通りだが、もし、キーボードの上に猫が乗って「9999999」って入力されたらどうする? そのまま計算されてしまうぞ?

な)幸せが逃げていきますね…

係)プログラムは動いて当たり前。プロの仕事は「将来起こりうる事故を想像し、未然に防ぐ設計をすること」でもある。

実際は、業務に応じて決めるものだが、今回は練習だからな、とりあえず TOTALPIC 9(5) くらいに、太らせておけ。

な)あい…ンズアンドトルペ。

係)(いらっ)

おむすび

な)いやーでも、オーバーフロー怖いっすね…。俺も食べすぎには気をつけます。びしっと気をつけますよー。

オーバーフローの申し子とは俺のことですから。

係)オーバーフローさせてどうすんだよ!

な)でも、オーバーフローのほうがかっこよさげじゃないです?

係)それ字面だけだからな…

な)えーでも、合コンでオーバーフローして、人気者になるってのが、この世の理じゃないっす?

係)難しい言葉使えばもてるわけじゃねーだろ。

な)いやー、理の上に立つ俺に隙なんて無いのが大きな問題っすよね…困ったものです。

係)お前合コン呼ばれないだろ?

な)え!?

係長のワンポイント

正しく動くコードは、まだ半分だ。
想定外が来たときに壊れない設計が、もう半分だ。
桁あふれはエラーを出さず、静かに結果を壊す。
だから変数サイズは「ただの箱」じゃなく、防波堤になる。
COBOLは計算する言語じゃない──事故を防ぐ設計の言語だ。

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

この記事を書いた人

コメント

コメントする

CAPTCHA