🧩今日の学び
・固定長の“空欄=スペース”の正体と、昭和設計が安全だった理由を理解
・なるおの「可変長って何すか?」から導入し、係長が丁寧にメモリ事情を解説
・次回は「固定長をどう扱うとバグが起こるか」に踏み込んで学ぶ流れへ
今日のコード
UPDATE-COUNTRY-SUM.
IF F-COUNTRY-A = SPACES
MOVE "??" TO F-COUNTRY-A(1:2)
END-IF
SET CT-IX TO 1
PERFORM UNTIL CT-IX > 50
IF CT-COUNTRY(CT-IX) = F-COUNTRY-A(1:2)
ADD 1 TO CT-COUNT(CT-IX)
ADD N-LINE-GROSS TO CT-SUM-GROSS(CT-IX)
EXIT PERFORM
ELSE
IF CT-COUNTRY(CT-IX) = SPACES
MOVE F-COUNTRY-A(1:2) TO CT-COUNTRY(CT-IX)
ADD 1 TO CT-COUNT(CT-IX)
ADD N-LINE-GROSS TO CT-SUM-GROSS(CT-IX)
EXIT PERFORM
END-IF
END-IF
SET CT-IX UP BY 1
END-PERFORM.
UPDATE-COUNTRY-SUM.
なるお)とりあえず、ラベルがあって、
IF F-COUNTRY-A = SPACES
MOVE "??" TO F-COUNTRY-A(1:2)
END-IF
IF文なので、F-COUNTRY-A の中がスペースだったら、次いこう!ってやつよね。
空欄とスペースは同じ?固定長の箱の正体
な)あれ?空欄じゃなくてスペースなのかな。空欄でも同じ意味かな?
係長)いい洞察だ。
COBOLでは「空欄」と「スペース」って、ほぼ同義に扱われるけど、ちょっとだけ違うんだ。
な)え、違うんすか!?
係)まぁ理屈でいえば、空欄は「何も入ってない」、スペースは「スペースが入ってるということだ。
でもCOBOLの「文字列」ってのは、固定長(長さが決まってる)なんだよ。
たとえば、
01 F-COUNTRY-A PIC X(10).
って定義したら、10文字分の箱が必ずある。
で、「何も入ってない状態」ってのは、実際には10個のスペースが入ってる状態なんだ。
な)えー!勝手にスペース入れてるって、余計なお世話すぎないっすか?
あれ?箱だから空欄にならないから、スペースが入っているっていう感じすか?
スペースだと箱は埋まらないから、昭和の空気が詰まっているとかでいいですよね。
こないだあったんですよ!買っときますか!
係)お前ほんと、例え話のクセが強いな…。
でもまぁ、方向性は間違ってないな。
「箱が空だからスペースで埋まってる」っていうより、「箱は常に満タン。空欄に見えても、実際はスペースで満たされてる」って感じなんだ。
な)うわ、勝手に詰めてくるタイプっすね。
入れときました!ってやつ。甘皮剥いときました!ですね。
バブルですねー。…バブルってなんです?
係)知らねーなら使うなよ…
な)いやー、物知りだってことは示していきたいので(テレテレ)
無駄じゃない?固定長設計の“昭和のやさしさ”
係)でもな、COBOLって、まさにそういう昭和の親方気質なんだよ。
「箱はスカスカじゃ縁起が悪い」「どうせ使うかもしれねぇから入れとけ」っていう。
な)なるほど…気を利かせてバグを生むタイプってやつですかねー。
係)あのなー、これは安全のためでもあるんだよ。
なぜかってと可変長(変動サイズ)の文字列が無いから、長さを固定しておかないと
「どこまでがデータでどこからがゴミか」わからなくなる。
な)なるほどー。
じゃあCOBOLさんは「親切に詰めてる」というより「トラブル起こさないように全部確定させてる」ってことすね。
てか可変長ってなんすか?
知ってて当たり前みたいな顔はいけないんすよ。
俺の知らなさっぷりを舐めちゃいかんですよ!
係)知らないのはいいが、知らない自慢すんな。
いいか、まず COBOL のデータって基本的に「固定長」なんだ。
つまり、どんなデータでもあらかじめ決められた長さぶん確保される。
01 F-NAME PIC X(10).
って書いたら、これは「10文字の箱」を必ず確保する。
中身が “TARO” でも “TARO “(6つスペース)でも、10文字ぶんの領域が存在する。
な)うわー…効率悪そうっすね。
係)そう、だけど “安全” なんだ。
古いマシンは今みたいにメモリが潤沢じゃないから「データのサイズが毎回違う」ってなると、処理がめちゃくちゃ面倒になる。
一方で、可変長(variable length)ってのは、「必要なぶんだけ箱を使う」やり方だ。
PythonとかJavaScriptがそうだな。
「TARO」って入れたら4文字ぶんだけ確保してくれる。
な)あーなるほど。
「COBOL=無駄多いけど安心設計」
「Python=スマートだけど油断すると落ちる」
って感じっすかね。
係)そうだな。
な)でもTAROってとこが一番昭和っぽいですけど…ぷぷ!
係)わ、悪かったな、昭和で!
な)あ、でも、「古いマシンは今みたいにメモリが潤沢じゃないから「データのサイズが毎回違う」ってなると、処理がめちゃくちゃ面倒になる。」
こういってましたけど、どういうことです?
係)COBOLが生まれたころ(昭和30〜40年代)ってのはな、メモリが数キロバイト単位しかなかったんだ。
「可変長で好きなだけ確保」なんてしたら、他の処理に割り当てるメモリがなくなって即クラッシュだ。
だから当時は1バイトでも無駄にしないように、全部「固定長」にして、「この箱には絶対10文字」「この箱には必ず8桁」ってサイズを最初から決め打ちしておく必要があった。
可変長が難しい理由:長さ探索のコスト
な)でもっすよ?
可変長は決まっていないだけだから、メモリを占有しないじゃなんですか?
逆に固定長で余分な領域確保してる方がメモリが無駄なような気がしますが…
係)おっ、鋭いとこ突いてきたな。
確かに、理屈だけ聞くと可変長の方がメモリ節約できそうに見えるよな。
必要なぶんだけ確保して、使わなきゃ取っとかない。
今の感覚ならそれが正解だ。
な)でしょー、誰も気が付かないとは!俺ってすごい!?
I’m No.1!
係)落ち着け、天才。
問題はな、「じゃあどうやって“必要なぶん”を機械に教えるか」ってことなんだ。
な)え?「このデータ4文字だよ」って言えばよくないっすか?
係)それを誰が、どのタイミングで、どこに書くのかが問題なんだよ。
可変長を扱うには、データの先頭に「長さ情報」を付けたり、間に「区切りコード」を入れたりして、毎回『ここまでが1件』って探さなきゃいけない。
な)あー…つまり読み取るたびに「ここまで?ここまで?どこまで?」って確認する感じですか。
係)そう。どこまでは余計だ。
COBOLが動いてた1960〜70年代のメインフレームは、そんなことを1件ずつ確認してたら処理が終わらなかった。
だから「全部10文字固定です!」ってしておけば、先頭から10バイト進めば次のデータ!って一瞬で読み取れる。
な)あーなるほど…「無駄に見えて、実は最速のショートカット」ってことっすね。
係)そういうこった。
当時のマシンは「速さのために、あえて無駄を許す」設計をしてたんだ。
おむすび
な)無駄を許したり許さなかったり、ロマンスですねー
係)どこらへんがだよ。
な)え?係長の白髪あたりですか?
係)なんで疑問形なんだよ。
自分の言ったことに責任持て!
まったくもって、どうでもいい話だからな。口閉じてていいからな。口縫い付けてもいいからな。
な)人権無視すぎ!!
係長のワンポイント
固定長は「箱が常に満タン」で、空欄に見えても実体はスペースだ。
可変長は“長さ情報”や“区切り探索”が必要で、昔の機械には重すぎた。
固定長は無駄に見えて、実は最速でトラブルも少ない安全設計。
1960年代は「速さのためにあえて無駄を許す」時代だった。
まずこの固定長思想を腹に落とすと、COBOLの見え方が一気に変わる。

コメント