はじめに
メインフレームのオープン化に伴い、アセンブラで書かれていた資産を COBOL に変換する作業に携わる中で、言語仕様の“当たり前”の違いが想定外の不具合につながる場面を経験した。
今回はその中でも、「配列の添え字」と「変数の部分参照が 1 から始まる」という COBOL の特徴が、アセンブラや C 言語経験者にとってどれほど落とし穴になりやすいかを、実際の疎通確認試験での事例を交えて紹介したい。
COBOL の添え字・部分参照は 1 始まり
COBOL 言語では、配列(OCCURS)の添え字や文字列の部分参照の開始位置が1 から数えるという仕様になっている。
これは COBOL を主戦場としてきた人には当然の前提だが、アセンブラや C 言語で開発してきた人間にとっては強い違和感がある。違いは次のようになる。
頭では理解していても、無意識に「0 始まり」で考えてしまうのが経験者の性だ。
疎通確認試験で発覚した問題
実際の疎通確認試験において、入力ファイルの項目に「キー開始位置」が存在していた。この値はアセンブラ時代の仕様を踏襲しており、0 が設定されるケースがある設計だった。
COBOL プログラム側でこの値をそのまま部分参照の開始位置として使用したところ、
キー開始位置 = 0 → COBOL では参照範囲外
キー開始位置 ≥ 1 → 一見、正常動作しているように見える
特に厄介なのは、0 以外の値ではエラーにならず、正しく動いているように見える点だ。
原因と対策
原因は単純で、
アセンブラ(あるいは C)的な「0 始まり」の発想
COBOL の「1 始まり」の部分参照仕様
が噛み合っていなかったことにある。
対策としては、入力項目の「キー開始位置」に+1してから部分参照に使用するよう修正した。
水平展開の重要性
この修正を行ったあと、「同様の箇所が他にも存在するのではないか」という観点で水平展開を実施した。
結果として、開始位置・オフセット・長さ指定といった項目を使った処理が複数箇所見つかり、同様の修正を施すことになった。
まとめ
アセンブラから COBOL への変換においては、ロジックの変換や文法の置き換え以上に、「数え方の前提」そのものが違うことを強く意識する必要がある。
特に添え字や部分参照の開始位置は、0 始まりか?1 始まりか?を明示的に疑うクセを付けないと、今回のような見えにくい不具合を生みやすい。
「COBOL は人間寄り、C は機械寄り」。この違いを理解した上でコードを読むことが、メインフレーム資産のオープン化を成功させるための重要なポイントだと感じた。