はじめに
COBOLのソースコードに触れたとき、妙な違和感を覚えたことはないだろうか。
「定数と書いてあるのに、なぜ値を変えているのか」
「MOVE文に謎のカッコがある」
「IX13ってなに?」
そんな素朴で鋭い問いかけが、COBOLという言語の奥深さを物語っている。
一見すると古典的で、型にはまった構文に見えるかもしれない。だが、そこには思いのほか人間的な“ゆらぎ”が潜んでいる。
今回は、以下の3つの観点からCOBOLの「わかりにくさ」を丁寧に解きほぐしていく。
- 定義エリアの初期値をMOVEで書き換える理由
- MOVE文に登場するカッコの正体
- IX数字の正体と使い道
初期値にMOVEするのはなぜ?
次のようなコードを目にしたことがあるかもしれない。
01 件数 PIC 9(01) VALUE '1'.
...
MOVE '3' TO 件数.
この記述から「VALUE ‘1’」は定数だと早合点してしまうのも無理はない。
だが、実際にはこれは「初期値」を意味しており、再代入を禁止する仕組みは存在しない。
COBOLでは「定数専用」の構文が提供されていないため、VALUE句は単に「最初に代入される値」に過ぎない。
プログラムが開始された瞬間、この値が変数にセットされる。それだけの話だ。
その後の処理でMOVE '3' TO 件数.
と記述すれば、普通に上書きされる。
実務的な設計のヒント
業務ロジック上「変わってはいけない値」を保持したい場合、次のような変数分離による設計が有効だ。
01 定数-件数 PIC 9(01) VALUE '1'.
01 処理用件数 PIC 9(01).
...
MOVE 定数-件数 TO 処理用件数.
こうすることで、定数らしき役割を持つ変数と、処理のための変数を明確に分離できる。
MOVE文のカッコとは?
次の記述を見て戸惑った経験があるかもしれない。
MOVE 件数(1) TO 件数-保存.
このカッコを見て「関数のような何か?」と連想してしまうかもしれないが、実態はテーブル(配列)の要素指定に過ぎない。
COBOLでは、同一フォーマットのデータを繰り返し扱うためにOCCURS
句を使ってテーブル構造を定義する。
具体例
01 件数.
05 件数-配列 PIC 9(01) OCCURS 10 TIMES.
このように定義されていれば、件数-配列(1)
から件数-配列(10)
までの10個のデータを扱える。
つまり、MOVE 件数-配列(1) TO 保存件数.
という記述は、「1番目の件数を保存先へ移す」処理となる。
COBOLでは、配列要素の参照にこのような形式が必須となる。
IX数字とは何か
IX13
という表記に出会ったとき、魔法の呪文のように感じた人もいるかもしれない。
実のところ、これはテーブル(配列)のインデックスを制御するための変数であり、COBOLでよく使われる命名パターンにすぎない。
01 IX13 PIC 9(02) COMP.
この変数に数値を入れることで、配列の何番目を処理するのかを指定する。
MOVE 1 TO IX13.
MOVE 件数-配列(IX13) TO 件数-保存.
このような記述により、「IX13番目の件数を保存先に移す」という処理が完成する。
COMP指定の意味
IX変数にはCOMP
(コンピューテーション、バイナリ格納)の指定が付けられることが多い。
これは、数値計算やループ処理でのパフォーマンスを重視しての選択だ。
処理速度やメモリ効率が重要視される現場では、このCOMP
指定が地味に効いてくる。
まとめ
COBOLの記述には、他言語の常識とは異なるルールや癖が存在する。
そのため、初心者にとっては「なぜ?」の連続になりやすい。
今回の要点を振り返っておく。
- VALUE句は初期値であり、定数のように扱われがちだが再代入は可能
- MOVE文のカッコは配列(テーブル)の要素指定を意味する
- IXは配列のインデックス操作用の変数で、COMP指定により処理効率を向上させる
COBOLは一見古めかしい言語に見えるかもしれない。
だが、だからこそ、仕様の裏側にある思想を読み解く楽しさがある。
思わぬところに“柔軟さ”が潜んでいる。
それを知ることが、COBOLと向き合う第一歩となる。
コメント