🧩今日の学び
・SUBSCRIPTは「数」そのものではなく、OCCURS配列で“何番目を使うか”を数値で指定している状態の名前
・INDEX/SUBSCRIPTはいずれも命令ではなく、配列参照を読む側が頭の中で分類するための概念
・COBOLは書けるかより、「この参照は何の概念か」を読んで判別できるかで理解が決まる
なるお)って、ちょっと待ってー!
係長)なんだ?
なるお)勝手に締めようとしないでくださいよ?
つまりですけど、INDEXとかSUBSCRIPTとかがあるわけじゃないんすね。
INDEXもSUBSCRIPTも「命令」ではない
係)その理解でいいぞ。
な)え、マジっすか。
係)もっとはっきり言うとだ
INDEXという命令は無いSUBSCRIPTという命令も無い
あるのは
INDEXという仕組み(概念)SUBSCRIPTという指定方法(概念)
COBOLはな、概念に名前を付けて語る文化が強い言語だ。
なるお)ふむう?
係)実際のコードで見たほうが早いな。
見た目は同じ、意味が違う:SUBSCRIPT参照とINDEX参照
SUBSCRIPTの場合
ITEM-ID(I)
(I)← これが SUBSCRIPTIはただの数値変数
INDEXの場合
ITEM-ID(IDX)
(IDX)← 見た目は同じ- でも
IDXはINDEXED BYで宣言された索引
な)概念なんかいらないんじゃないんすか?
係)残した理由は歴史と設計思想だ。
- 命令を増やすと文法が壊れる
- でも用途は分けたい
だからCOBOLは、「見た目は同じ、意味は違う」という選択をしたと。
な)それ意味あります?
係)当時は最善だった。今見ると地雷原とも言えるが…。
INDEX / SUBSCRIPT は“役割名”であって、コードに書く単語じゃない
書くのはSET / MOVE / ADD /( )
そして、読むときに
- 「これは
INDEX参照だな」 - 「これは
SUBSCRIPT参照だな」
と頭の中で分類するんだ。
な)だったら、「このコードはINDEXを使ってます」って言うのは、「INDEXED BYで宣言した索引を参照に使ってます」ってことになると。
係)それでいいな。
な)ふむふむ。もうちっと教えて下さい。
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)
ということは、さっきのこのコードの中の (2)、(3)、(I)、それぞれがSUBSCRIPTなんすかね?
SUBSCRIPTの正体:OCCURS配列の「何番目か」を数値で指定すること
係)その理解でほぼ合ってるな。
あとは最後の一段だけ、言葉をきれいに整えよう。
SUBSCRIPT =「OCCURS配列の“何番目か”を、数値で指定すること」
- 使うのは
- 数値変数(PIC 9)
- 数値リテラル(1, 2, 3 など)
- それ以上でも以下でもない
さっきのコードでこの中での SUBSCRIPTはどれかっていうと。これだな。
ITEM-ID(I)
(I) ← これがSUBSCRIPT。
Iは数値変数で、「I番目のITEM-IDを参照する」という意味だ。
(2) や (3) はこう書いたらSUBSCRIPT。
DISPLAY ITEM-ID(2)
DISPLAY ITEM-ID(3)
計算できるもの =SUBSCRIPTと考えても、実務ではほぼ困らないな。
な)なんでも(I)とかだったらSUBSCRIPTって考えてもいいわけすか?
なぜOCCURSがないとSUBSCRIPTは存在しないのか
係)あー、そういうことか。言い方が悪かったな。
SUBSCRIPTは「OCCURSがあるときだけ」の話だ。
それ以外の場面では、そもそもSUBSCRIPTという概念は出てこない
な)あ、そうなんすか!
係)そうそう。
SUBSCRIPT(添字)って言葉の正体はこれだ。
「同じ項目が複数並んでいる中の、どれを使うか指定する方法」
この「複数並んでいる」を作るのがOCCURSだ。
OCCURSがないとどうなるかというとだ…
01 ITEM-ID PIC X(3).
DISPLAY ITEM-ID
係)これだと、要素は1個しかないから、何番目か聞く意味がないし、( )はそもそも書けないからな、SUBSCRIPTの出番はない。
OCCURSがあって初めて意味が生まれるんだ。
05 ITEM-REC OCCURS 5 TIMES.
10 ITEM-ID PIC X(3).
こうなることで、初めてこう指定ができるわけだ。
ITEM-ID(1)
ITEM-ID(I)
ITEM-ID(IDX)
つまり、「何番目を使うか」問題が発生した瞬間に、SUBSCRIPT/INDEXという概念が生まれるってわけだ。
だから用語としてもこうなる。
| 状況 | 呼び名 |
|---|---|
| OCCURSなし | ただの項目参照 |
| OCCURSあり + 数値指定 | SUBSCRIPT参照 |
| OCCURSあり + INDEX指定 | INDEX参照 |
つまり、OCCURSが「番号付きの並び」を生み、SUBSCRIPTは 番号で答え、INDEXは 場所で答えるという関係だ。
違う言い方すれば、番号を生むのが OCCURS、 番号を使うのがSUBSCRIPT、番号を意識しないのがINDEXということだ。
な)ふむふむ、SUBSCRIPTって「数値」じゃなくて、「数値で指定してる状態」の名前なんすね。
係)いい理解だな。
そして、他の文脈でSUBSCRIPTが出てこない理由だが、COBOLはな、
- MOVE
- ADD
- IF
- EVALUATE
こういう命令ではSUBSCRIPTなんて言葉を一切使わない。
なぜなら、「添字」は配列参照の話でしかないからだ。
SUBSCRIPTは、命令ではないし、型でもないし、変数でもない。
OCCURS配列を参照する“やり方の名前”ということだ。
な)だから「SUBSCRIPTは結局何?」といっちゃうと余計難しくなっちゃったと。
係長の説明が悪かったわけじゃなく。
係)説明が悪くて、悪かったな!
実体がない概念だから説明が難しいんだよ!
INDEXとSUBSCRIPT:添字違い
な)あれ?さっきからSUBSCRIPT・添字と言ったり、SUBSCRIPTだけ言ったり、添字言ったりしてますが、どれが正解なんす?
係)まさか気づくとはな…。
いいか、 SUBSCRIPT=添字だから、 日本語で「添字」って言って良し。だが、使い分けの“空気”はあるぞ。
な)えー、じゃあ最初から「添字」って言えばよかったじゃないすか!
係)それはそうなんだが、それをやると、8割の人が別の地雷を踏む。
まず、COBOLの公式文書、IBMマニュアル、技術英語の会話などではSUBSCRIPT が正式だ。
「添字」はあくまで日本語訳だ。
しかし、INDEXも添字と訳されることが多い…、ここが最大の事故ポイントとなる。
な)ぐはー日本語の不自由なとこ出たー!
係)だから現場では、
- 技術的に正確に話すとき →
SUBSCRIPT/INDEX - 初学者に雰囲気を伝えるとき → 添字
って使い分けたりする。
な)へー「添字」単体で使うと勘違いされる可能性ありなんすね。
係)そうだな。意味は合ってるけど、精度が足りない言葉とも言えるな。
なので、
・SUBSCRIPT(数値の添字)
・INDEX(索引)
と言い分けると分かりやすくなるな。
な)なるペソ〜。
おむすび
係)まとめるぞ!
OCCURSがなければ、SUBSCRIPTは存在しない。
配列が生まれた瞬間に、「どれ?」と聞く必要が出てきて、それをSUBSCRIPTと呼ぶ。
な)なんとなく…って感じです。
係)ま、やっていけばわかってくるだろ。
な)そすね。
その時時で、あと10回ぐらい説明してもらえたら!
係)疲れるから、もうやだ。
な)係長としての気構えがなってないっすよ!
係)うるせ!
次、このまま行くぞ!OCCURS DEPENDING ONとSUBSCRIPT / INDEXの地獄コンボだ!!
な)え!?SEARCHは?
係)うるせーな!いいんだよそんなのは!
な)ええ、また!?
係長のワンポイント
SUBSCRIPTは「数」じゃない、何番目を使うかという状態の名前だ。INDEXも同じく、命令ではなく「位置を示す役割名」にすぎない。
どちらもOCCURS があって初めて意味を持つ。
見た目が同じ( ) でも、中身が数か索引かで世界は変わる。
COBOLは書くより、読んで“分類できるか”で理解が決まる。

コメント