【COBOL 読み1-19】水に釘の人生〜MOVEやSETの違い

🧩今日の学び
・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は“英語っぽさ優先・統一感後回し”だから、まず文の形で覚えるのが正解だ。

― 目次(読みシリーズ)へ戻る ―

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

この記事を書いた人

コメント

コメントする

目次