RPG コピーブックとプログラムをどのように区別すればよいか、ファイルを調べる方法を教えてください。
たとえば、c では、ファイルに main があれば、それをプログラムとして使用できることがわかります。
前もって感謝します。
それは興味深い質問です...通常はかなり明白です。
簡単な答えは、コピーブックにはさまざまな種類の仕様が含まれないということだと思います. RPG IV プログラムは、H、F、D、I、C、O、および P 仕様、またはそれらの自由形式の同等物を持つことができます。(指定タイプは、固定形式ソースの列 6 の文字によって決まります)。順序は重要であり、タイプを混在させることはできません。仕様が 1 種類しかないソースを見ている場合、それはおそらくコピーブックとして設計されています。実行コードは C (計算) および/または P (手順) 仕様に含まれているため、C または P 仕様のないソースはコピーブックです。通常、コピーブックに C 仕様または P 仕様を含めることは悪い習慣ですが、RPG ではそれが許可されており、私はそれが行われているのを見てきました。しかし、繰り返しになりますが、コピーブックにあるのは C または P 仕様だけです。
編集 たとえば、F & D 仕様のコピーブックを作成できますが、それを含めることができる唯一の場所は、プログラムの F 仕様の最後で、D 仕様の前です。 コンパイラ ディレクティブ/IF DEFINED
を使用して、コピーブックのどの部分をどこに含めるかを制御するコピーブックを作成できます。
EDIT2 IBM は、バージョン 7.1 以降で F & D 仕様を混在させる機能を追加したことがわかりました。F & D 仕様のみのソース メンバーはコピーブックになります。短い答えは、定義 (H、F、D、I、O) 仕様と実行可能 (C & P) 仕様の両方を持つソース メンバーは、コンパイルされるように設計されています。 .
より長い答えは、RPG プログラムにも「メイン」があります。当初、唯一のオプションは、現在「サイクルメイン」として知られているものでした。すなわち。「メイン」プロシージャーは、RPG プログラムに組み込まれる暗黙的に生成された「サイクル」コードです。
その後、RPG IV と ILE が登場しました。IBM は、制御仕様キーワード を追加しましたNOMAIN
。
H NOMAIN
//or in freeform
ctl-opt nomain;
これにより、「メイン」プロシージャのない実行不可能なモジュールが作成されました。「サイクル」のためにコンパイラによって通常生成されるコードは除外されます。結果の *MODULE オブジェクトは、メイン プロシージャを提供する別の *MODULE を使用して *PGM オブジェクトにバインドする必要があります。
または、0 個以上の他の *MODULE オブジェクトと結合して *SRVPGM オブジェクトにすることもできます。*SRVPGM は単なる手続きの集まりです。Windows DLL のようなものと考えてください。
その後、IBM は「リニア・メイン」RPG IV プログラムを使用するオプションを追加しました。
H MAIN(MYMAIN)
// or freeform
ctl-opt main(MYMAIN);
したがって、主な手順は、指定した手順です。生成された「サイクル」コードは、実行可能ファイルから除外されます。
したがって、NOMAIN
またはMAIN
キーワードのいずれかが存在することは、ソース メンバーがコンパイルされるように設計されていることを示します。ソースが他にもあると仮定します。それらのいずれかを含む「標準オプション」インクルードファイルがある可能性があります。
これら 2 つのキーワードがない場合は、サイクル メインまたはインクルード ファイルのいずれかを扱っていることを示します。
サイクルのメイン プログラムで、パラメーターを入力として受け取る場合は、入力パラメーター リストを表示できます。
//Fixed format, old school RPG III, IV
C *ENTRY PLIST
C PARM LCMPNO 2
C PARM LNTACT 1
// fixed format, RPG IV using a "Procedure Interface (PI) to replace *ENTRY PLIST
D CheckDate PI
D lDateIs 4a
// free format RPG IV
dcl-pi CheckDate;
lDateIs char(4);
end-pi;
PI を代わりに使用する「サイクル メイン」プログラムと線形メインのソースの主な違いは*ENTRY PLIST
、線形メイン プロシージャが明示的なプロシージャ定義に囲まれていることです。
// linear main
h main(CHECKDATE)
p CheckDate b
d CheckDate PI
d lDateIs 4a
//do something
*INLR = *ON
return;
p CheckDate e
//cycle main with PI
d lDateIs 4a
//do something
*INLR = *ON
return;
7.1 以降 (2013 年からの自由形式 PTF を使用) では、F 仕様と D 仕様を (固定形式コードであっても) 混在させることができます。
imports
RPGのコピーブックは、現代のプログラミング言語にかなり近い