🧩今日の学び
・固定形式COBOLでは1〜6桁目が行番号、7桁目が制御文字という厳密な世界で成り立っている
・コメントや継続行の書き方は、パンチカード時代の「事故を防ぐための知恵」から生まれた文化
・不自由に見える制約こそが、COBOLの可読性と保守性を支えてきた設計思想である
なるお)係長?
なんか000100とかでてきましたけど、大丈夫ですか?
999に乗ってるんですか?もしかして機械の体になってます?
次は映画版ドラえもんに出てくる感じです?
係長)何の話だよ?
な)いや、だから000100とか000200とかって話ですよー?
係)なんでスリーナインのはなしになるんだよ。
な)ついに000100とか二進法でしか理解できなくなったのかと。ついに人間やめちゃったのかと。
係)それ危ない発言だからな…
000100とかは俺が無意識に使ってたな。
行番号とは何か:000100が意味している世界
係)あれは「行番号」だ。
な)行番号?Excelの行番号みたいなやつっすか?
係)方向性は合ってる。が、もっと古い。
昔の COBOL ではな、プログラムは 行番号付きで管理されてた。しかも 物理的なカードでだ。
だから、
000100
000200
みたいな数字が、コードの一部として存在してた。
な)ほえー、あれ?コメントに関係あるんす?
係)…直接はない。
しかし、さっきこういう話をしたろ?
● 旧式コメント(知識として)
* ここはコメント
行頭1桁目に *
カード時代の名残
今でも動くが、混在させると地獄
読めるけど 新規では使わないってことだ。
つまりはこういう形になるってことだ。
000100* ここしかコメント書けない
000200 PROCEDURE DIVISION.
旧式コメントはインデントもだめだぞ。きっとお前ならやるだろうが。
000100*←ここ(7桁目)にしか書けない。不自由。
000200 *←こうやってインデントするとエラーだ
な)俺が褒められたとこっすね!
係)そういうことだけは覚えてるんだな…って、褒めてないからな!
「ここにしか書けない」とか「行末コメントが嫌がられる」とかの話になる根っこが、そこにあるってわけだ。
な)係長が嫌われてるって話かと思ってました。
係)お前な…
今日はこれだけ覚えとけ。
- 昔は番号で行を管理していた
- その文化の名残が今の COBOL の書き方に残っている
だから古いコードを見たときに、なんだこれ!?ってならないようにってことだけだ。
な)はぁ…?
係)なんだよ?
な)いや、なんか係長っぽくないなと。
係)は?
な)え、だって係長って完璧主義だから、中途半端に説明終わることないじゃないっすか。
1から1億ぐらいまで、いらないことまで全部教えてくるでしょ?
係)「いらないことまで」ってなんだよ!
あーもう!わかったよ!
行番号は「プログラムの行につけられた番号」だ。
昔の COBOL はな、
- エディタがない
- Gitもない
- 画面編集?
という世界で動いてた。
では、プログラムは何で作ってたかというと、紙のカード(パンチカード)だ。
そのパンチカード世界のルールはこうだ。
- 1枚のカード = プログラムの1行
- カードは箱に入れて管理
- 落とすと…行順がぐちゃぐちゃ
そこで必要になったのが「並び順が分かる番号」。
つまり、それが 行番号なんだ。
だからこうなったってわけだ。
000100
000200
000300
パンチカード時代の現実:なぜ100ずつ増えるのか
な)なんでこんな変な数字になるんすか?
係)へんな数字じゃないからな。
「100ずつ増やして、途中に行を挿入できるようにするため」だ。
つまり、
000100
000150 ← あとから追加
000200
ということのためってわけだ。
な)ほへー。
え、やっぱりコメントとなんの関係があリますきんぐ?
係)ここまできて、お前も鈍いな…
な)に、鈍くないっすよ!
ここらへんにすき家があるっていうことがわかるぐらい感覚は鋭いですよ!
係)あっそ…
固定形式COBOLの核心:7桁目が世界を支配する
係)いいか、ここが今回の核心だ。
固定形式COBOLでは、
1〜6桁目:行番号
7桁目:制御文字
となっている。
この 7桁目 に、*を置くとその行はコメントとなる。
だからこうなる。
000100* ここはコメント
000200 MOVE A TO B
な)あーだから、
000100* ここしかコメント書けない
とか言っちゃったんすね。説明もなしに。
係)俺が悪者っぽく聞こえるが…そういうことだ。
だからこそ、文末コメントなんて概念自体が存在しなかった。
それが今に何を残したかというと
・コメントは1行まるごと
・コードの横にごちゃっと書かない
・コメントは理由を書くもの
という文化だ。
これが今のCOBOLに残ってるというわけだ。
な)てか、固定形式COBOLってなんなんすか?知らない言葉どんどん出してきてますけど…。いつもの知識ひけらかしですか?
係)わるかったよ!
… いつものってなんなんだよ!
ったく、固定形式(Fixed Form)COBOL とは、1行の「書ける場所」が桁で厳密に決まっている書き方だ。
1行が80桁と決まっていて、それぞれの桁に意味が割り振られている。
な)えーやっぱり神経質な七三分けなんすか!?
係)過去の人をよりひどい言い方すんな!
ざっくり言うとこんなところだ。
| 桁 | 意味 |
|---|---|
| 1〜6 | 行番号 |
| 7 | 制御文字 |
| 8〜72 | プログラム本文 |
| 73〜80 | 無視(カードの余白) |
な)行の途中から意味が変わるんすか?
係)変わる。勝手に書くと壊れる。
な)えー!なんでー!?
係)なんでじゃねーの!そうなってんだって話だ!
いいか、だから7桁目に何を書くかで、行の意味が決まる。
| 7桁目 | 意味 |
|---|---|
| 空白 | 普通のコード |
| * | コメント |
| – | 継続行(次のカードとつながる) |
だからこの意味がわかるだろ?
000100* ここしかコメント書けないんだよ
な)空白ってことは別になんも制御する必要はないですよってことすよね?
継続行ってなんすか?小難しく言うのが係長っぽいですけど。
係)なんか今日はやけに突っ込んでくるな…。
固定形式COBOLで言う「空白」は、7桁目に“何も特別な記号を書いていない状態”
つまり、スペースで一文字空いている状態ってことだ。
000100 GO TO
書き方としてはこうなるわけだな。
継続行は「この行、次の行に続いてますよ」って機械に伝える仕組みだ。
昔はな、1行(カード)に 72文字までしか書けなかったが、 文字列や条件が長いわけだ。
そこで、「この命令、次のカードまで続くよ」と伝える必要があった。
それをどうやって伝えたかというのが継続行だ。
つまり、7桁目に-を書く
うーん、例を見るのが早いな。
000100 MOVE "THIS IS A VERY LONG TEXT THAT DOES NOT FIT
000200- " ON ONE CARD" TO MESSAGE
な)000100のまま改行しちゃえばよかったんじゃないすかね。
係)そうするとインデントが崩れて読みづらくなるだろ?
な)あ、そか。
2行に分かれてるけど、1文扱いにして、機械にも人間にもわかるようにしたわけなんすね。
って、2行目なんでそんなに奥に追いやるんですか…?
係)ん?インデント位置そのものに意味はないぞ。
な)へ?
係)例えば、こう揃えるとだ
000100 MOVE "THIS IS A VERY LONG TEXT THAT DOES NOT FIT
000200- " ON ONE CARD" TO MESSAGE
意味があるように見えてしまうだろ。
ずらすことによって「ただの継続だな」と分かるってわけだ。
な)いつもの可読性ってやつっすか。
係)そうだ。2行目は役割として、新しい処理を書く行ではなく、文字列を閉じるためだけの行なわけだから、奥に追いやることで、
- 主役じゃない
- 付属物
- 補助的存在
というのを視覚的に表現している。
な)おれみたいなマイノリティーは追いやられていくんすね…
係)邪魔だからな。
な)あえ!?
係)固定形式はパンチカード時代の遺産だからな。
• 1行 = 1カード
• 継続行 = 例外的存在
となるから「続き」は一目で分かる必要があった。
だから暗黙的に、継続行は本文よりも“奥”に書くという文化ができたわけだ。
おむすび
な)へーなんかいろいろあるっすよね。
係)そうだな。
ま、理解するって話ではないし、慣れてしまえばいいだけだな。
な)やっぱり、長くなったっすね。
係)お前が軽く説明したら不満顔するからだろ!
な)軽くで済ませられることをいつまでも説明できるんすよね。
係)俺は軽くで済ませたかったんだって!
な)やっぱ係長すごいっすね!
係)………… え!?
係長のワンポイント
固定形式の行番号は、機械の都合じゃなく、人間の事故対策だった。
7桁目に意味を押し込めた結果、コメントは「行全体」で書く文化が生まれた。
だから COBOL では、横にベタ書きするコメントが嫌われる。
不自由さは制約であり、同時に読みやすさの設計思想でもある。
COBOLは古いんじゃない──理由を抱えたまま今に立っている。

コメント