COBOL初心者が悩むMOVE文と定義エリア|配列や定数の使い方入門

備忘録

はじめに

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と向き合う第一歩となる。

コメント