お問い合わせ

ホーム > COBOLのはなし > COBOLプログラムにおける64bitと32bitの相違

COBOLプログラムにおける64bitと32bitの相違

上野 浩一(日立製作所 サービスプラットフォーム事業本部)

1. はじめに

最近、お客さまから、プラットフォームの変更やOSのバージョンアップなどで64bitアーキテクチャに移行するので、この機会にCOBOLアプリケーションも64bitに移行することを検討したい、というお話を聞く機会が増えてきました。
同じソースプログラムでも、稼働環境が32bitアーキテクチャと64bitアーキテクチャとでは異なる部分が出てきます。例えば、C言語では、long型、int型などの変数の領域サイズが異なることがあります。その点、COBOLでは、数字項目、英数字項目、日本語項目などの領域サイズは基本的に変わりませんので、多くの場合、ソースプログラムの変更なしに、どちらのアーキテクチャでも動作します。
しかし、COBOLでも、次のような種類のデータ項目は領域サイズが変わります。

32bitアーキテクチャを前提に作られたCOBOLアプリケーションを64bit化する場合に考えるべき点について、上に列挙したものからいくつか紹介します。

2. 64bitアプリケーションの特徴

CPUが一度に扱う情報量が32bitから64bitになるというだけでなく、メモリの番地指定も64bitにできるので、アクセス可能なメモリ空間の大きさが莫大になります。
COBOLアプリケーションを64bit化すれば、OSが提供する広大なメモリ空間が利用可能になります。大規模なシステムでも、プログラムとデータを必要なだけメモリ上に載せて処理できる可能性が増えることになります。

3. COBOLプログラムの64bit化

既存のCOBOLプログラムを、いわゆる64bit版のCOBOLコンパイラで再コンパイルすると、64bitアーキテクチャに対応した実行可能モジュールを生成できます。しかし、アーキテクチャの違いに伴う言語仕様の違いはどうしても存在します。そのような違いに当たる部分は見直して適切に変更しないと、期待した動作になりません。
ここでは、日立のCOBOLコンパイラを例に、64bit化した場合に実行結果に影響する主な違いと対策方法を説明します。

(1) アドレス系データを表現するデータ項目

64bit版のCOBOLコンパイラではアドレス系データ項目のサイズが8バイトに拡張されています(32bit版は4バイト)。また、SYNCHRONIZED句を指定すると8バイト境界に寄せて配置されます。
COBOLの国際規格には、アドレス系データ項目としてデータポインタ(USAGE POINTER)がありますが、国際規格仕様の範囲では、以降に説明している定義や操作ができないようになっています。
ここでは、日立の拡張仕様にあるアドレスデータ項目(USAGE ADDRESS)を使って説明します。他の実装のアドレス系データ項目でも、同様の注意が必要になる可能性があります。

<影響する例1>

アドレスデータ項目や指標データ項目などのアドレス系データ項目をREDEFINES句で再定義して利用した場合、再定義する項目のサイズに影響があります。

<対策方法>

4バイトで再定義していたのを8バイトで再定義するように変更します。

<元のコーディング例 (32bit)>
     01 DATA1 SYNC. 
     02 A PIC S9(9) COMP.
     02 P USAGE ADDRESS.
01 DATA2 REDEFINES DATA1. 
     02 Z1 PIC X(8).

SYNCHRONIZED句を指定している場合、8バイト境界に配置され、隙間にパディングが挿入されます。パディングの大きさも含めてサイズの違いを見直します。アドレスデータ項目も、8バイトを占めます。

<対策したコーディング例 (64bit)>
01 DATA1 SYNC.                    パディング
     02 A PIC S9(9) COMP.
     02 P USAGE ADDRESS.
01 DATA2 REDEFINES DATA1.          8バイト
     02 Z1 PIC X(16).

<影響する例2>

集団項目の中にアドレス系データ項目があると、その後ろの項目の位置がずれます。ずれることになるデータ項目の領域を、バイト位置で指定している処理は影響を受けます。また、集団項目のサイズが変わります。

<対策方法>
  • アドレス系データ項目を含む集団項目を指定して、そのアドレス系データ項目より後ろを部分参照する処理の開始位置の指定を、ずれを考慮して変更します。
  • アドレス系データ項目を含む集団項目を転記しているときはデータ項目同士の対応を保つように、転記先のデータ項目の定義を変更します。
<元のコーディング例 (32bit)>
01 DATA1. 
     02 P USAGE ADDRESS.
     02 Z1 PIC X(8).
     ・
     ・
DATA1(9:4)
      DATA1(9:4) 
<対策したコーディング例 (64bit)>
01 DATA1. 
     02 P USAGE ADDRESS.
     02 Z1 PIC X(8).
     ・
     ・
DATA1(13:4)
      DATA1(13:4) 

(2) 長さを返す組み込み関数の戻り値

<影響する例>

64bit版のCOBOLコンパイラでは、データ項目の長さを返す組み込み関数LENGTHの返却値は、8バイトの2進項目になります(32bit版は4バイトの2進項目)。

<対策方法>

LENGTH関数の返却値を代入しているデータ項目が4バイトの2進項目の場合、そのデータ項目の定義を8バイトの2進項目に変更します。

ここまで、COBOLプログラムを64bit化するときのアドレス関係の考慮点を述べてきました。これで全てではなく、そのほかにも、例えば、64bit版でのサポート機能の違いや、関連するミドルウェアの64bit版サポート状況なども確認する必要があります。

4. プログラム改修時の影響範囲調査

実際にCOBOLプログラムを改修しようとすれば、事前に修正箇所洗い出しのための調査が必要となります。修正箇所の洗い出しは、アドレス系データ項目の例であれば、対象となるデータ項目を再定義しているデータ項目や、対象となるデータ項目を含む集団項目の名前を、ソースプログラム上で検索して追っていく作業になります。
汎用の検索機能を使う場合、検索キーワードを指定して、検索機能(エディタでの検索やgrepコマンドなど)で使用箇所(定義場所、転記先など)を抽出します。しかし、抽出結果には検索キーワードを含むコメント行や目的以外のデータ項目も含まれてしまうので、1行ずつ確認して目的の行を探し出すという煩雑な作業を伴うことになります。
一方、各社から提供されている修正箇所の影響範囲を調査・分析するツールなどを使用する方法もあります。こうしたツールの利用は、開発・保守での洗い出し調査の負荷を抑えるだけでなく、修正ミスや修正漏れを防ぐのにも役立ちます。
一つのデータ項目を起点に、変数間の値の転記、プログラム間での受け渡しなど、影響の波及する範囲を追跡できるツールを提供しているCOBOL製品もあります。

5. むすび

メインフレームからオープン環境への移行や、オープン環境同士での異なるプラットフォームへの移行は、プログラム全体を見直して再コンパイルする機会であり、COBOLプログラムの64bit化を検討する良いタイミングでもあります。アプリケーションを64bitアーキテクチャに移行する際には、本稿で述べた点も検討してください。

以上