🧩今日の学び
・MOVE/ADDとSETでは「目的地の位置」が逆になる理由を構文レベルで理解する回。
・係長の“英語っぽさ優先”という一言で、COBOLの歴史的背景が一気に腑に落ちる。
・次回は「英語読めるつもりの人間が最も転ぶ構文」をさらに深掘りしていく。
今日のコード
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.
係長)あとはやったことばかりだからな、読めるんじゃないのか?
なるお)ま、全部わかりますよ!当然っす。パーフェクト超人っす!
係長)なんでキン肉マンなんだよ…
SETだけ目的地が逆?ここが混乱ポイントの本丸
な)…あれ?こないだ右が主体って言いましたよね?
SET CT-IX TO 1
これ違いません?
CT-IXに1を入れておくってことでしょ?
絶対右っていったのにー!!またたぬきですか!?たぬきの里すか!?そこら中、泥舟だらけですよ!沈みゆく人生ですよ!
係)一人で沈んでろよ…。しかし、なんか今日鋭いな…誰だお前?
な)かわいい部下ですよ!
係)結論から言うが「右が目的地」って覚え方は MOVE と ADD に限った話だ。SET は逆。
な)かわいい…
MOVE/ADD/SET:目的地の法則を整理する
係)整理しとくぞ。
MOVE A TO B → B = A(TO の右が目的地)
ADD A TO B → B = B + A(TO の右が目的地)
ADD A TO B GIVING C → C = A + B(Bは変わらない)
SET CT-IX TO 1 → CT-IX = 1(TO の左が目的地)※SETは例外
SET CT-IX UP BY 1 → CT-IX = CT-IX + 1(インデックスのインクリメント)
SET EOF-YES TO TRUE → 88条件名を真にする(裏の実体に対応値が入る)
つまり、お前が言う
SET CT-IX TO 1
はCT-IXに1を入れるで正解。
MOVE/ADDみたいに「右が目的地」ルールをSETにまで適用しようとするとコケる。
本当の覚え方は「TOの直後が目的地」だけど、SETは文法が「SET 目的地 TO 値」だからTOの左が目的地になるってわけだ。
な)えーもう記憶定着してしまっちゃいましたよー。
体育座りがたいく座りになるぐらい定着しちゃってますって。
でも体躯座りだと、なんかかっこいいっすよね!
係)どうでもいい。
な)ええ!?
係)このループ全体の流れはこうなる。
SET CT-IX TO 1 … 走査開始位置を1に。COBOLの表は1始まりだ。
PERFORM UNTIL CT-IX > 50 … 50件の国テーブルを上から順に見る。
ヒットしたら
- 既存エントリなら CT-COUNT(CT-IX) を加算、CT-SUM-GROSS(CT-IX) に合計を足す → EXIT PERFORM(見つかったので探索終了)。
- 空きスロット(SPACES)なら国コードをCT-COUNTRY(CT-IX) に入れて同様に更新 → EXIT PERFORM。
見つからなければ SET CT-IX UP BY 1 で次へ。
50超えたら終了。
な)でもなんで、右と左別々にするんすかねー。揃えないとか空気読めないさん。Feel N2!
係)N2ってなんだよ。
な)え、だって空気で一番窒素の割合高いっすよね。
なぜ揃えない?COBOL構文に残る“歴史の泥”
係)俺も新人のころ、まったく同じこと思ったよ。
な)やっぱ窒素感じてました!?
係)やっぱってなんだよ!なんで窒素感じるんだよ!
そうじゃなくて、なんで揃えねぇんだってことだよ!
これには“歴史の泥”ってやつがある。
COBOLの命令って、英語っぽく読むのが基本思想なんだ。
ほら、これらもこう読めるように作られてる
MOVE A TO B → Move A to B.(AをBへ移動しろ)
ADD A TO B → Add A to B.(AをBに足せ)
SET X TO 1 → Set X to 1.(Xを1に設定しろ)
つまり「TOの右が目的地」なんじゃなくて、文として自然に読める順番で設計されてるんだよ。
英語的に読めば「目的地がどっちか」はちゃんと通る。
ただ、ADD と MOVE は「動作語 → 値 → TO → 対象」だけど、SET は「動作語 → 対象 → TO → 値」って構文になってる。
SET は「状態を設定する」から、先に対象が来る方が自然って考えだったらしい。
な)やっぱ読めないさん…
係)COBOLの設計者はな、プログラマじゃなくて会計士とか事務屋だったんだ。
「読みやすく」ってのが正義で、「統一感」よりも「英語としての通りやすさ」が優先。
だからこそ、今でも読めるけど、書くと面倒っていうこの絶妙なバランスが生まれたんだよ。
お前がなんとなく読めてるってのもそのおかげではあるな。
な)結局、空気読んでるんだか、読んでないんだか。
係)ま、COBOLってのは「ルールの不統一を“英語っぽさ”で正当化した唯一の言語」だからな。
MOVE と ADD は右目的地、SET は左目的地、PERFORM はどっちでもない。
――統一感ゼロ。でも文章としては読める。
な)え、つまりCOBOLって、人間には優しくて、機械には厳しいってことすかね?
係)逆だ。機械には優しくて、人間が苦しむんだよ。
だって機械はどっちが目的地か迷わねぇ。構文が違うだけでちゃんとルールがある。
困るのは「なんとなく英語読める気がする人間」だけだ。
おむすび
な)それ…俺のこといってます…?
いや、でも俺英語はべっらべらのぺらっぺらですよ!
アメリカ人の中に入ったら、もう現地の人と見分けできないっすよ!HAHAHAとか言っちゃいますし!
係)そりゃ、お前より30cm大きい奴らに囲まれたら見えなくなるわ。
な)は!?
係)いいか、COBOLはお前みたいな“わかった気になる人間”を一番試してくる。
「英語っぽいけど英語じゃない」「変数っぽいけど段落」――全部が罠だ。
な)ペラペラな俺は試され続けるんすね⋯
係)試してもなんの手応えがないけどな。
糠どころか、水に釘だな。
な)最近悪口の度合いが強くないです…?
係長のワンポイント
SET は MOVE や ADD と違い「TO の左側が目的地」になる例外構文だ。
英語で読むと “Set X to 1” だから X を設定対象として先に置く設計になっている。
MOVE/ADD と同じ感覚で読むと必ず転ぶので、「SET は対象→TO→値」と体に覚えさせろ。
インデックス操作(UP BY / DOWN BY)は SET が正規ルートで、加算命令とは別物だ。
COBOLは“英語っぽさ優先・統一感後回し”だから、まず文の形で覚えるのが正解だ。

コメント