🧩今日の学び
・SUBSCRIPTは「何番目か」を数える人間の算数、INDEXは「今どこか」を指す機械の位置情報
・MOVEできるのは数値、SETでしか動かせないのがINDEXという違いが事故を防ぐ鍵
・SEARCHがINDEXを要求する理由は「探す=位置を進める」というCOBOLの思想にある
係長)ふぅ……。
なるお)遅いっすよ、何してたんすか。トイレ長すぎでしょ。
んじゃ進めますか?
係)ん? うん、んー、んじゃSEARCHいくか。
な)は?
次はINDEXとSUBSCRIPT(添字)って言ってたじゃないすか?
係)あ、そうだったな。INDEXやってたんだったな。
な)……じゃなくて!
係長がさっきまで鼻息荒く興奮して、「次はこれだー!」って言ってたんじゃないっすか!
なんで気抜けてるんすか!?
係)便所で個室に入ったら、ふと気が抜けてな…。
「何に必死になってたんだ?」ってな…。
な)いやいやいやいや!
あんなに興奮してたくせに! 鼻息フンフンうるさかったくせに!何言っちゃってんすか!
係)わるかったよ…。そんなにうるさく言わなくても聞こえてるって。
な)もしかして、トイレでこっそりキャバ嬢にLINEでも送ってたんすか?
フラれて落ち込んでるんすか?
係)だから、キャバクラ行ってないっての!
……それじゃ、INDEX と SUBSCRIPT いくぞ。
な)むー。
係)いいから始めるぞ。
INDEXとSUBSCRIPTは、ここで区別しておかないと、SEARCHで必ずモヤモヤするからな。
な)ってことは、やっぱり大事だったんじゃないっすか! なんでやる気なくすんすか!
係)俺だってやる気なくなるときぐらいあるわ。人間だもの。
な)しっかりしてくださいよー。「みつを」ぶらなくていいですから!
係長なら、
「あいつなら追い込みかけてもいいだろう?にんげんだもの。」
ぐらいでしょ!
係)なんで追い込みかけるんだよ!
INDEXとSUBSCRIPT:似ているが、世界が違う
係)いいか、INDEX(指標)とSUBSCRIPT(添字)は、似てるけど別物だ。
役割も、性格も、事故り方も違う。
な)見りゃ全然違うのわかりますって。
なんか係長、まだ気抜けてるんじゃないっすか? 初恋の人にでも連絡します?告白します?
係)なんでするんだよ!
な)「ご本人登場」もありますよ?
係)あるわけねーだろ!
はぁ…(ため息)。
いいか、表にまとめるとこうだ。
| 項目 | INDEX (指標) | SUBSCRIPT (添字) |
| 正体 | 内部ポインタ (場所) | 数値 (データ) |
| 宣言 | INDEXED BY | PIC 9 etc. |
| 操作 | SET | MOVE / ADD |
| 速度 | 速い | 普通 (計算が入る) |
| 向き | 機械向け | 人間向け |
SUBSCRIPTとは何か:人間が理解できる「算数の添字」
まずは人間寄りのやつ、SUBSCRIPT(添字) だ。
01 I PIC 9(2).
01 ITEM.
05 ITEM-REC OCCURS 5 TIMES.
10 ITEM-ID PIC X(3).
...
MOVE 1 TO I
DISPLAY ITEM-ID(I)
係)これが SUBSCRIPT だ。
Iはただの数値変数。- 「I番目」を表示しろ、という命令。
- 人間が理解しやすい(算数と同じ)。
な)ほー? 普通っすね。
係)そして、特徴はこうだ。
- 毎回「先頭からI番目はどこだ?」と計算される。
- 範囲チェック(5回しか枠がないのに6を入れる等)は人任せ。
- 大量ループだと(理論上は)遅い。
な)ほほー?
INDEXの正体:数値ではなく「場所」を指す指標
係)次にINDEX(指標) だ。
01 ITEM.
05 ITEM-REC OCCURS 5 TIMES
INDEXED BY IDX.
10 ITEM-ID PIC X(3).
...
SET IDX TO 1
DISPLAY ITEM-ID(IDX)
これが INDEX だ。
IDXは数値じゃない。- メモリ上の「場所」を指している。
- 機械(CPU)寄りの存在。
な)へー?
係)だから事故る。
な)いやいや、ちょっと待ってくださいよ。
さっきからINDEXとかSUBSCRIPTとか言ってますけど…
SUBSCRIPTっていう命令、コードに出てこないじゃないっすか?
INDEXED BYは書いてあるけど、SUBSCRIPTED BYなんて無いっすよね?
結局なんなんすか? 概念の話っすか?
係)……それだ。
な)はぁ? 何言っちゃってんすか?
それともついに逝っちゃいました?
係)逝ってねーよ!!
今お前が正解を言ったんだよ!
な)今日係長おかしいっすよ…?
係)だから「概念」だって言ったんだ。
COBOLにはSUBSCRIPTという予約語はない。
「数値変数を使って配列(OCCURS)にアクセスする方法」 を、便宜上SUBSCRIPT(添字)と呼んでいるだけだ。
な)あ、そういうこと?
「添字(そえじ)」っていうあだ名ってことっすか。
だったらそう言ってくださいよ! 回りくどいからわんこにしか相手されないんすよ!
係)うるせーな!
な)でも、係長のわんこ、かわいーじゃないっすか!
係)お、おう。(ちょっと嬉しい)
な)まったく!
係)いや、その…
な)んで、INDEXって、なんでMOVE 1 TO IDXがダメなんすか?
係)えっと、なんだ、お前が急にマジメにくると調子狂うな…。
よし、いいか、もう一度INDEXの復習だ。
IDXは数値を入れる箱じゃないからだ。
MOVE→ 値を代入するSET→ 状態(位置)を変更する
SET IDX UP BY 1
だからこれは「1を足せ」ではなく、「次の要素へ移動しろ」という命令になる。
計算じゃなく、移動ということだ。
な)ほむー
係)「INDEXは人間に計算させるな」がCOBOLの思想というわけだ。
比較コードを見るとこうなる。
SUBSCRIPT版(人間向け:算数)
MOVE 1 TO I
PERFORM UNTIL I > 5
DISPLAY ITEM-ID(I)
ADD 1 TO I
END-PERFORM
INDEX版(機械向け:移動)
SET IDX TO 1
PERFORM UNTIL IDX > 5
DISPLAY ITEM-ID(IDX)
SET IDX UP BY 1
END-PERFORM
このように見た目は似てるが、世界観が違う。
SUBSCRIPTは算数で、INDEXは移動命令だ。
使い分けの結論:読むコードか、探すコードか
な)どう使い分けるんすか?
係)答えは
読ませたいコード → SUBSCRIPT(添字)
速度・SEARCH・SEARCH ALL → INDEX(指標)
特にこれだ。
SEARCHSEARCH ALL
これらを使うときは、INDEXが必須 だ。
そもそも INDEXED BY で定義してないと SEARCH文は書けない。
な)あ、だからSEARCHの前にINDEXやるべきだったんすね。
係)…そうだ。
な)だったら、最初からそう言ってくださいよ。
SEARCH言ってたのに、いきなりINDEXになったり、SUBSCRIPT言ったり。
全然興奮するもんじゃなくて、通常の道順だっただけじゃないっすか。
係)う、うるさい!
まだ終わってないんだよ!
いいか、覚え方はこれでいい。
SUBSCRIPT は 「何ページ目?(数字)」
INDEX は 「しおりはどこ?(場所)」
この感覚がズレなければ、もう大事故は起きないぞ。
おむすび
な)……
係)なんだよ?
な)…これ夢じゃないっすよね?
係)はぁ? なんでだよ。
な)だって係長がこんなに腑抜けになるとは思わなかったので…大丈夫っすか?
係)腑抜けって…いや、すまん。ちょっと疲れてただけだ。
な)係長はしっかりしてもらわないと困りますよ!
俺まだ学んでいる最中なんですから!係長だけが頼りなんですからね! 頼みますよ!
でも、やっぱりキャバクラ行かないとだめな体質になっちゃってたんすね。一緒に行きましょ! お金は出してくださいね!
係)だから行ってないっての! しつけーな!
係長のワンポイント
SUBSCRIPTは「何番目か」を数える、人間の算数だ。INDEXは「今どこを指しているか」を示す、機械の視点だ。
だからINDEXはMOVEできず、SETでしか動かせない。SEARCHがINDEXを要求するのは、「探す=場所を進める」処理だからだ。
数だと思った瞬間に事故る──INDEXは位置だ。

コメント