前ページへ64 ビットプログラムの開発 各国語対応次ページへ

第 7 章 移植可能なプログラムの作成

この章では、Server Express と他の環境の同等な開発システムとの間で、ソースレベルまたは中間コードレベルでの移植性を持つアプリケーションを開発するための指針を示します。「同等な開発システム」とは、主に Net Express、Mainframe Express、および Object COBOL Development Suite を意味します。なお、この章では Windows 95、Windows 98、および Windows NT に Windows という総称を使用します。

この章の内容を理解して活用するには、Windows と UNIX、およびこれらのオペレーティングシステム版の COBOL 開発システムに関する実務レベルの知識が必要です。

7.1 移植性の概要

Server Express システムには、ランタイムシステムのインタープリタで中間コードを処理してアプリケーションを実行する機能があります。特定の条件が満たされれば、中間コードは開発環境以外のマシンやオペレーティングシステムでも実行することが可能です。

中間コードに移植性があれば、付加価値再販業者 (VAR) や独立系ソフトウェアベンダ (ISV) が多様なレベルの市場ニーズに対応し、オープンシステム型ソリューションを開発、提供するための負担も軽減されます。

生成コードはマシンのネイティブコードであるため、その処理速度は通常、中間コードよりはるかに優れています。そのため、移植性以上にパフォーマンスが重要であれば、生成コードを使用すべきです。配布しやすさや移植性を重視するのであれば、中間コードを使用すべきです。また、Server Express や同等の COBOL システムでは、中間コードを特定のマシンやオペレーティングシステム用に最適化した生成コードに変換することも可能です。

7.2 INTLEVEL コンパイラ指令

INTLEVEL 指令を使用すると、移植性を持たせることができます。この章では、移植可能なアプリケーションを作成するための指針として、INTLEVEL 指令を最大限に活用するプログラミング手法を説明します。

INTLEVEL 指令の構文は次のとおりです。

[NO]INTLEVEL"integer"

integer には 2、4、5 のいずれかの値を指定します。INTLEVEL 指令の詳細については、『Server Express ユーザガイド』の『コンパイラへの指令』の章を参照してください。

次に、INTLEVEL コンパイラ指令を活用して移植可能なアプリケーションを作成する方法について説明します。

7.2.1 サポートされる開発環境

複数の開発システムに対応する中間コードを作成するには、INTLEVEL を 2 または 4 に設定します。

INTLEVEL"2" を指定すると、以下の旧バージョンの Micro Focus COBOL からの移植が可能となります。

INTLEVEL"4" を指定すると、Net Express と Server Express 間の移植性が得られます。具体的には、以下がサポートされます。

7.2.2 移植性のある中間コードの作成

『言語リファレンスで言及されているいずれかの環境で、INTLEVEL"2" コンパイラ指令を指定して作成した中間コードは、INTLEVEL"2" をサポートするあらゆる開発環境で使用できます。

開発システム間の移植性は、INTLEVEL 指令以外でも CBL_ ライブラリルーチンで制御できます。CBL_ ルーチンは、COBOL 言語へのシステムレベルの汎用拡張です。

この章で後述の移植性に関する留意事項と制限に従うと、Net Express、Mainframe Express、および Server Express の 3 種類の開発システムで同様に動作する中間コードを作成できます。

作成した中間コードは、Micro Focus COBOL システムによって、対応する環境で実行するためのネイティブコードに変換できます。

7.3 移植可能な構文

他の COBOL 開発システムとの移植性を持つアプリケーションを作成するには、たとえば、ファイル名のハードコーディングなど、特定環境に依存するコードを記述しないように注意すべきです。そのようなコードの大部分は、CBL_ ライブラリルーチンを利用すると回避できます。基本的に、Server Express で開発されたコードと、 Net Express および Mainframe Express で開発されたコードは、相互に移植性があります。ただし、次で説明する制限に留意する必要があります。

中間コードに移植性を持たせるために、ダイアレクト制御指令は必要ではありません。また、これらの指令を指定しても、構文チェック時に移植性のない構文が必ずしもフラグを立てられるとは限りません。

7.3.1 制限

7.3.2 Object COBOL Development Suite との移植性

Server Express で開発したアプリケーションをバージョン 4.1 以前の Object COBOL Development Suite (OCDS) に移植する場合は、ソースコードを INTLEVEL 指令と WARNINGS 指令を使用して、OCDS との移植性がない構文にフラグを付けることができます。ただし、移植性のないすべての構文にフラグが付けられるわけではため、この章では、OCDS への移植前に開発者自身でチェックおよび変更すべき構文についても説明します。

7.3.2.1 構文チェック

INTLEVEL"2" を指定してコンパイルすると、 OCDS 間で移植性のある中間コードを作成できます。ただし、Server Express の一部の構文は、 INTLEVEL"2" でコンパイルしても OCDS で動作しない可能性があります。WARNINGS"2" コンパイラ指令を使用すると、OCDS システムで問題になる可能性がある構文にフラグを付けることができます。

7.3.2.2 フラグが付けられた構文

Server Express で開発したコードを INTLEVEL"2" 指令と WARNINGS"2" 指令を指定してコンパイルすると、コード中の構文にフラグが付けられます。フラグの形式は、コンパイル情報や警告メッセージです。さらに、CHANGE-MESSAGE コンパイラ指令を指定して、これらのメッセージの重要度を重大なエラーに変更することも可能です。以下の構文にフラグを付けることができます。

7.3.2.3 フラグが付けられない構文

次の構文にはフラグが付けられません。開発者自身でプログラムをチェックし、必要に応じて変更してください。

7.3.2.4 オブジェクト指向プログラム

オブジェクト指向のクラスやプログラムを OCDS で使用するには、MFOO 指令が必要です。この指令を指定すると、Object COBOL の予約語がロードされます。Server Express では、Object COBOL の予約語はすべてデフォルトでロードされるため、MFOO 指令は無視されます。

Server Express で開発したオブジェクト指向のプログラムやクラスを COBOL for UNIX で再コンパイルする場合には、MFOO 指令を指定する必要があります。MFOO 指令は通常、$SET文でソースコード内に指定します。

さらに、次の点にも留意する必要があります。

7.3.2.5 LINKCOUNT コンパイラ指令


OCDS コンパイラがデータ項目に記憶スロットを割り当てる仕組みは、Server Express コンパイラのそれとは異なります。そのため、Server Express で問題なくコンパイルされ、正常に動作しているプログラムでも、OCDS で使用すると次のエラーが通知される場合があります。

0067 Please recompile using a larger value for the 
LINKCOUNT directive

このエラーが通知された場合には、エラーの原因となったプログラムの COBOL ソースコード内で、$SET 文を使用して LINKCOUNT 指令を指定してください。

7.3.2.6 デバッグと .idy ファイル

Server Express と OCDS では .idy ファイルの形式が異なります。そのため、Server Express で生成された .idy ファイルは OCDS では使用できません。

7.3.2.7 その他の指令

生成される中間コードは、上記以外にもいくつかの指令によって影響される可能性があります。移植性のある中間コードを生成する場合には、これらの指令のデフォルトの設定を使用すべきです。次の各指令をデフォルト以外の値に変更すると、これらの指令が有効な COBOL システムでは問題が発生する場合があります。

REENTRANT
P64
DIALECT"ISO2000"

7.4 その他の留意事項

Net Express、Mainframe Express、および Server Express の各環境に移植性があるアプリケーションを開発する際に留意すべき、その他のポイントについて説明します。

7.4.1 オペレーティングシステム固有の機能

オペレーティングシステムに固有の機能は、使用しないようにしてください。これらの機能が必要な場合は、COBOL システムライブラリルーチンの CBL_GET_OS_INFO を使用すると、アプリケーションにオペレーティングシステムを識別させることができます。

7.4.2 ユーザ属性バイト

ユーザ属性バイトは、Server Express、Net Express、および Mainframe Express の間で移植性が維持できなくなる最も大きな要因の 1 つです。したがって、できる限り使用を避け、表示属性を選択する手段として、代わりに移植可能な構文サブセットに含まれる言語拡張を使用します (『移植可能な構文』を参照)。画面に表示可能な属性は、プログラムが動作しているハードウェアに依存します。次の属性は、 COBOL 構文を使用して、いくつかの方法で指定できます。

BACKGROUND-COLOR
BLINK
FOREGROUND-COLOR
HIGHLIGHT
LOWLIGHT
NO-ECHO
REVERSE-VIDEO
SECURE
UNDERLINE

7.4.3 画面入出力

CBL_EXEC_RUN_UNIT ルーチンを使用して実行されるプログラムの画面入出力には、Windows および UNIX 環境間の移植性はありません。

Windows では、すべてのプログラムがビデオ画面マップに書き込むため、実行可能なプログラムはすべて、互いに画面入出力を認識しています。

UNIX では、すべてのプログラムが独自の画面マップを持ち、各プログラムは他のプログラムの画面入出力を関知しません。そのため、UNIX 上で CBL_EXEC_RUN_UNIT を使用して実行されるプログラムに画面入出力を使用すると、予期せぬ結果となる可能性があります。

7.4.4 大文字と小文字の識別

UNIX のファイルシステムでは大文字と小文字は区別されますが、Windows のファイルシステムでは区別されません。

UNIX 上で開発したアプリケーションを Windows に移植する際には、呼び出し対象のサブルーチンやデータファイルを大文字と小文字のみの違いで区別しないように注意すべきです。

Windows で開発したアプリケーションを UNIX に移植する際には、呼び出し対象の副プログラムやデータファイルの名前を、ファイルシステム上の該当する物理ファイルの名前と正確に合致させる必要があります。

中間コードのデフォルト拡張子は、Windows ではすべて大文字の .INT ですが、UNIX では小文字 (.int) です。そのため、Windows で開発した中間コードを UNIX に移植する際には、中間コードファイルの拡張子を変更する必要があります。Windows からカレントディレクトリに移動した各中間コードファイルの拡張子は、シェルスクリプトを使用して、 .int に一括変換できます。たとえば、Bourne シェル上では次のようなシェルスクリプトを使用します。

for i in *.INT 
do 
    mv $i `basename $i INT`int 
done 

同様に、区分化されたプログラムの各オーバーレイの拡張子は、Windows では .Inn、UNIX では .inn であるため、UNIX への移植時には、 I を小文字に変更する必要があります。

7.4.5 パス名

Windows では、ファイルのパス名を構成する各ディレクトリは円記号 (\) で区切られますが、UNIX の区切り文字はスラッシュ (/) です。ただし、COBOL プログラムでは Windows 上でもスラッシュが区切り文字として認識されるため、パス名の区切り文字にスラッシュを使用してください。

プログラム中にファイルのパス名が指定されている場合はもちろん、そのプログラムが動作しているすべてのマシン上に該当するディレクトリ構造が存在している必要があります。

Windows では a: などのドライブ名がパス名の一部として認識されますが、UNIX ではファイル名の一部として認識するため、UNIX に移植したプログラムではドライブ名を指定すべきではありません。

7.4.6 拡張文字セット

Net Express と Mainframe Express の一部の機能は PC 専用であり、該当する機能のほとんどは、 IBM PC 移植可能機特有の表示属性を利用します。

PC 専用機能の中で最も重要なのが IBM 拡張グラフィック文字セットです。Windows ではソースコード内に 8 ビットの表示文字を記述できますが、一部の UNIX システムでは、 7 ビット文字のみがサポートされているため、 vi などの UNIX エディタでソースを開くと、 8 ビットめが削除される場合があります。その他の UNIX システムは、ISO 8859-1 などさまざまな 8 ビット文字集合をサポートしています。

このように 8 ビット文字はオペレーティングシステムによって取り扱いが異なる場合があるため、アプリケーションを実際に使用するオペレーティングシステムとハードウェアが確定しない限り、拡張文字集合の文字の使用は避けるべきです。代わりに、汎用文字ルーチン、 CBL_GET_SCR_LINE_DRAW および CBL_GET_SCR_GRAPHICS を使用して、近似文字に変換し、あらゆる環境で描線や描画を行います。

7.4.7 Alt キーと Ctrl キー

ほとんどの UNIX 端末では、Alt キーと Ctrl キーは、他の有効なキーと同時に押されない限り認識されません。そのため、これらのキーは単独では使用しないでください。

Server Express ユーザガイド』の『Terminfo データベースおよび端末装置』の章で説明されている『コントロールキーと Alt キーのサポート』を参照してください。

7.4.8 未定義の戻り値

ゼロ除算や PICTURE 句に該当しないデータの使用など、一部の COBOL 処理で返される値は、『言語リファレンスで未定義 (undefined) と指定されています。これらの処理で実際に返された値を調べると、実行可能ファイルの形式やプログラムのコンパイルに使用された COBOL システムによって異なっています。

たとえば、中間コードプログラムがゼロ除算で返す値は、同じ処理で生成コードプログラムが返す値とは異なります。

そのため、プログラムの結果やロジックを、未定義の値を返すと指定された処理の結果に依存させるべきではありません。たとえば、 0 による除算で実際に返される値は予測不可能であるため、その結果を基になんらかの処理やプロシージャを実行する場合は、必ず ON SIZE ERROR 指定を使用すべきです。ON SIZE ERROR 指定の詳細については、『言語リファレンスを参照してください。

7.4.9 COMP-5 の使用

COMP-5 で定義されたデータ項目のバイトは、ホストマシンのマシンコードによる順序と同じです。これは、COMP-5 データ項目の内部表現は、プログラムが動作するコンピュータによって異なることを意味します。そのため、COMP-5 データ項目の再定義やファイルへの書き出しは避けるべきです。

7.4.10 $SET とジェネレータ指令

生成コードに影響を与える指令は、プログラムのソースコードに埋め込むべきではありません。このような指令は、プログラムを実行するマシンによっては認識されない可能性があります。

7.4.11 ROLLBACK 文

ROLLBACK 文を使用するアプリケーションは、Fileshare バージョン 2 環境内でのみ移植可能です。Fileshare バージョン 2 環境では、ROLLBACK 文によってすべてのレコードがロックされ、 UNIX 環境でのみ解放されます。CALLFH コンパイラ指令が指定されている場合は、Windows 環境でも同様です。

7.5 ファイルの移植性

Server Express、Net Express、および Mainframe Express の間では、基本的にすべてのファイルに移植性があります。ただし、次の点に留意してください。

ファイルハンドラの構成については、『ファイル操作』の『ファイルハンドラの構成』の章を参照してください。


Copyright © 2002 Micro Focus International Limited. All rights reserved.
本書、ならびに使用されている固有の商標および商品名は国際著作権法で保護されています。

前ページへ64 ビットプログラムの開発 国際化対応次ページへ