掲載日 2009年12月
RPGⅢは発表当時のコンピューティング環境を前提に設計されていました。このため昨今のオープン化された環境ではWebSphere® ESBやHATSなどのソフトウェアを併用することでオープン化対応を実現していました。ところが、ILE-RPGを使用することでJava® など新世代のプログラミング言語と同様な開発をRPGだけで実現可能となります。
RPGは現代では使えない言語なのか?
昨今IBM iをはじめ多くのシステムの開発言語はJavaやPHP, VB.NETのような比較的新しいプログラミング言語が主流を占めています。これらの言語と従来のRPG(RPGⅢ)やCOBOL(OPM COBOL)を比較するといくつかの点で機能的な課題が考えられます。例えば以下のようなポイントです。
RPGⅢ(OPM COBOL)での課題
- 1つのプログラム内での複数言語対応、UNICODE対応が基本的に出来ない
- XMLサポートなど新しいテクノロジーへの対応に制約
- 静的プロシージャー呼び出しに対応していない
- 他言語と共通のエラー処理を定義できない
ところが、ILE-RPGを使用すると上記のようなRPGⅢの機能制約はすべて解消することができます。言語としての使用感はJavaなど新世代の言語と同等のプログラミングを可能とします。今回はILE-RPGの入門編としてILEの基本構成、用語について解説いたします。
【ILEとOPMの比較】
ILEにはバインド可能、活動化グループ、静的プロシージャー呼び出し可能、などの特徴があります。
| ILE | OPM | |
|---|---|---|
| プログラム形態 | プログラム、サービス・プログラム | プログラム |
| コンパイラー | コンパイルによりモジュール・オブジェクトを生成(直接実行不可) | コンパイルによりプログラムを生成 |
| プログラム生成 | コンパイル、バインド | コンパイル |
| プログラム実行 | 活動化グループ | 各言語ごとの実行単位 |
| 他のプログラムの呼び出し | 動的プログラム呼び出し、静的プロシージャー呼び出し | 動的プログラム呼び出し |
| 複数言語 | 複数言語の混在に対応 | 単一言語の使用にフォーカス |
| エラー処理 | 共通エラー処理、言語固有エラー処理 | 言語固有エラー処理 |
ILEのプログラム構造
ILEにはILE RPG, ILE COBOL, ILE CL, ILE C, ILE C++などが含まれます。これら全ての言語に共通してILEには以下の特徴があります。
- ILEのプログラムは1つまたは複数のモジュールから構成される
- ILEのモジュールは1つまたは複数のプロシージャーから構成される

モジュール
- モジュール - オブジェクトタイプ *MODULE
- ILEオブジェクトの基本
- モジュール単体では実行不可能なオブジェクト
- 1つ以上のプロシージャーとデータ項目より構成される
- モジュール内のプロシージャーとデータ項目には他のILEプログラムから直接アクセスが可能
- ILEプログラムでは上記の例のように、異なる複数のプログラミング言語を1つのプログラム中に含めることが可能
また下記のように1つのモジュールを複数のプログラム間で共用も可能なため、再利用性、保守性も向上させることができます。

プロシージャー
モジュールの中に定義されている特定の処理を実行する自己完結型の一連の高水準言語ステートメン。
プロシージャーベースの言語の特徴として以下があります。
- ローカル変数の使用
- プロシージャーが呼び出される毎に作成される自動変数
- プログラム間でデータを共有するための外部変数の使用
- 複数のエントリーポイントを持つことができる(サービス・プログラム)
- モジュールのバインディングによる呼び出しオーバーヘッドの低減(静的プロシージャー呼び出し)
サービス・プログラム
- ILEプログラムまたはサービス・プログラムから直接アクセスされる実行可能なプロシージャーとデータ項目の集まり
- オブジェクトタイプ *SRVPGM
- アプリケーションから頻繁に呼び出される共通機能として使用される
- 1つ以上のモジュール、他のサービス・プログラムから構成される
- モジュールのPEPは無視される
- 動的プログラム呼び出しによるサービス・プログラムの実行はできません

バインド・ディレクトリー
- モジュールまたはサービス・プログラムのリストを提供するオブジェクト
- オブジェクトタイプ *BNDDIR
- ディレクトリーの項目にモジュールやサービス・プログラムの名前を指定します。必要なモジュールやサービス・プログラムを参照するために使用します
- ただし、実際のオブジェクトが存在するかはチェックしません
- 特定の機能や目的を持つモジュール、サービス・プログラムをパッケージ化できます。よって個々のモジュールを指定せずに特定の機能を使用可能とします
- 例えば税率など複数プログラム間で共通に利用可能な数値計算用のバインド・ディレクトリーを用意する
プログラムおよびプロシージャーの呼び出し
方法1:動的プログラム呼び出し
- ILEまたはOPMプログラムを呼び出し可能
- サービス・プログラムを呼び出すことはできません
方法2: 静的プロシージャー呼び出し
- ILEプロシージャーを呼び出し
- 同一モジュール内のプロシージャー呼び出し
- 同一ILEプログラムまたはサービス・プログラム内にある別モジュールのプロシージャーを呼び出し
- 他のILEサービス・プログラム内のプロシージャーを呼び出し
活動化グループ
活動化とは
- ILEプログラムまたはサービス・プログラムを実行可能にするプロセス
- ILEプログラムが呼び出されるとシステムにより活動化される(必要な静的データの割振、サービス・プログラムへのバインディング)
活動化グループとは
- ILEプログラムまたはサービス・プログラムは活動化グループ内で活動化されます
- 活動化グループにはプログラムの実行に必要なリソースが含まれる
- リソースは活動化グループごとに分離されています
- CRTPGM, CRTSRVPGMコマンドのACTGRPパラメーターで指定

ILEプログラムの作成
ソース・コードからモジュールを作成CRTxxxMODコマンド
- CRTRPGMODコマンド
- CRTCBLMODコマンド
- CRTCLMODコマンドなど
モジュールやサービス・プログラムをバインドしてプログラムを作成CRTPGMコマンド
- CRTPGMコマンドで入り口モジュールを作成します
モジュールやサービス・プログラムをバインドしてサービス・プログラムを作成CRTSRVPGMコマンド
- CRTSRVPGMコマンドでサービス・プログラムを作成します
- このときバインディングの指定も行います
- MODULE パラメーター
- BNDSRVPGMパラメーター
- BNDDIR BNDSRVPGMパラメーター
ILEプログラムの作成例
Step1:CRTRPGMODコマンド等でモジュールを作成
Step2:CRTPGMコマンドで入り口モジュールを作成
Step3:CRTSRVPGMコマンドでサービスプログラムを作成します(必要な場合)
プログラムTEST

バインド・ディレクトリー BNDDIR01
ディレクトリー項目 SRV02, SRV03
- CRTPGM PGM(TESTLIB/TEST) + ― プログラム名はTEST
- MODULE(MOD01 MOD02)+ ― モジュールMOD01,MOD02を組み込み
- ENTMOD(MOD01)+ ― プログラムの入り口モジュールはMOD01
- BNDSRVPGM(TESTLIB1/SRV01)+ ― サービス・プログラムSRV01を組み込む
- BNDDIR(TESTLIB1/BNDDIR01)― バインド・ディレクトリーBNDDIR01を組み込み
次回以降でILE-RPGのプログラミング、機能の詳細についてご紹介する予定です。
IBM、IBMロゴ、ibm.com、WebSphereは、世界の多くの国で登録されたInternational Business Machines Corporationの商標です。他の製品名およびサービス名等は、それぞれIBMまたは各社の商標である場合があります。現時点でのIBMの商標リストについては、www.ibm.com/legal/copytrade.shtml(US)をご覧ください。
JavaおよびすべてのJava関連の商標およびロゴは Sun Microsystems, Inc.の米国およびその他の国における商標です。