◇はじめに
本記事は、「PP4i」を活用したRPG IVからFF RPGへの変換について、IBM i RiSINGを通して調査した内容をまとめたものです。
◇IBM Bob Premium Package for i(PP4i)とは
PP4iは、IBM BobにIBM i 向けの開発支援機能を追加するための専用拡張パッケージです。
pp4iの導入により以下のような機能が追加されます。
- SSHを用いたIBM i への直接接続
- DeveloperモードとDatabaseモード
- IBM i 向けのスキルやワークフロー
- RAGによるIBM i 公式ドキュメントの参照
機能の詳細についてはIBM Bob公式ドキュメントをご参照ください。
◇本記事の注意点
本記事は、調査環境の都合により、SSHおよびMCPを用いたIBM i との直接接続は行わずに検証を実施しています。そのため、類似資産を参照して解析や自動コンパイル後の自己修正など、PP4iで回答精度や変換精度の向上を図るための一部の機能が活用できていません。したがって、本記事の検証結果は、実運用環境における評価結果として解釈することは適切とは言えません。
本記事に記載する内容は、あくまでPP4iの導入によって追加されるIBM i 向けロジックおよびRAGに着目した調査結果としてご参照ください。
◇導入方法
- IBM Bob公式サイトからプランを選択し、[今すぐ購入]をクリック
- 「IBM Bob i 向けプレミアムパッケージ」のユーザーを+1に設定し、[チェックアウトへ進む]をクリック
- 画面の案内に従って購入手続きを完了
- IBM Bobの設定画面またはサブスクリプション管理画面に追加されていることが確認できれば導入完了
◇検証手順
- IBM Bobで下記のフォルダを開く
- Developerモードを選択し、自動読み取りを許可せずプロンプトを実行
- FF RPGファイルが作成されたら、IBM Bobを新しいタスクへ切り替える
- Agent/Planモードを選択し、自動読み取りを許可せずプロンプトを実行
- FF RPGファイルが作成されたら、両者をIFSへアップロードしてコンパイル
- コンパイルエラーの内容を比較
RISINGLIB/
├─ QDDSSRC/
│ └─ RSGEMP.PF
├─ QDSPSRC/
│ ├─ RSG0010D.DSPF ※RSG0010S/RSG0020Sで共通の画面ファイル
│ └─ RSG0011D.DSPF ※RSG0011S/RSG0021Sで共通の画面ファイル
├─ QRPGFFSRC/
├─ QRPGLESRC/
│ ├─ RSG0020S.RPGLE ※本検証の対象プログラム
│ └─ RSG0021S.RPGLE ※本検証の対象プログラム
└─ QRPGSRC/
├─ RSG0010S.RPG ※RSG0020S.RPGLEのCVTRPGSRC実行前の元プログラム
└─ RSG0011S.RPG ※RSG0021S.RPGLEのCVTRPGSRC実行前の元プログラム
◇検証
ここでは、各検証で利用したプロンプトと、発生した一部のコンパイルエラーの比較結果を紹介します。
1.RPG IVから直接FF RPGへ変換
使用プロンプト(Developer/Agent)
QRPGLESRCのRSG0020SとRSG0021Sを参照して、FF RPG形式のRSG0030S(RSG0040S)とRSG0031S> (RSG0041S)をQRPGFFSRCに作成してください。
ただし、以下の事柄は全て禁止事項です。必ず注意して作成してください。
1.QRPGSRCの参照
2.FF RPG形式でサポートされていない命令
3.小文字による記述
1.1)ファイル定義エラー
F仕様書からDCL-F定義へ変換が確認できたことから、FF RPG形式への変換処理自体実施されていることが確認できました。しかし、RPG IV形式の記述が一部残存しており、DCL-F構文として解釈できない定義が生成されたため、コンパイルエラーが発生しました。
FRSG0010D CF E WORKSTN
F SFILE(SFL01:RRN1)
FRSGEMP IF E K DISK
DCL-F RSG0010D CF E WORKSTN SFILE(SFL01 : RRN1); ※キーワードは認識されない。キーワードは無視されます。
DCL-F RSGEMP IF E K DISK; ※キーワードは認識されない。キーワードは無視されます。
DCL-F RSG0040D CF E WORKSTN SFILE(SFL01:RRN1); ※キーワードは認識されない。キーワードは無視されます。
DCL-F RSGEMP IF E KEYED; ※キーワードは認識されない。キーワードは無視されます。
1.2)CHAIN/SETLL/SETGTの構文エラー
CHAINおよびインジケータ操作については、FF RPG形式への変換処理が確認できました。しかし、双方の変換結果においてCHAIN/SETLL/SETGTの演算項目の順序が逆転しており、FF RPGの構文要件を満たしていないため、コンパイルエラーが発生しました。
C D@EMPE CHAIN RSGEMP 91
CHAIN RSGEMP D@EMPE; ※指定された演算命令で演算項目2オペランドが正しくない。
IF NOT %FOUND(RSGEMP);
CHAIN(N) RSGEMP D@EMPE; ※指定された演算命令で演算項目2オペランドが正しくない。
IF NOT %FOUND;
1.3)パラメータ定義エラー
FF RPGではCALL/PARMサポートがされておらず、CALLPへ変換されていることから、FF RPG形式への変換方針としては妥当であることが確認できました。しかし、DeveloperモードではDCL-PRがプログラム末尾に配置されており、FF RPGにおける記述順序の規則を満たしていなかったため、コンパイルエラーが発生しました。また、AgentモードではDCL-PR自体が生成されておらず、呼び出し先が未定義となっているため、コンパイルエラーが発生しました。
C MOVEL *BLANK P@MODE 3
C MOVEL *BLANK P@EMPE 5
~~~~~
C #CAL01 BEGSR
C CALL 'RSG0021S'
C PARM P@MODE
C PARM P@EMPE
C ENDSR
BEGSR #CAL01;
CALLP RSG0031S(P@MODE : P@EMPE);
ENDSR;
~~~~~
DCL-PR RSG0031S EXTPGM('RSG0031S'); ※メイン・プロシージャーのステートメント・タイプの順序が正しくない。
MODE CHAR(3); ※ENDSR演算命令の後の演算命令の指定が正しくない。指定は無視されます。
EMPE CHAR(5); ※ENDSR演算命令の後の演算命令の指定が正しくない。指定は無視されます。
END-PR; ※メイン・プロシージャーのステートメント・タイプの順序が正しくない。
DCL-S P@MODE CHAR(3);
DCL-S P@EMPE CHAR(5);
~~~~~
BEGSR #CAL01;
CALLP RSG0041S(P@MODE : P@EMPE); ※名前または標識が定義されていない。
ENDSR;
2.RPG IVから仕様書作成を経由してFF RPGへ変換(1)
使用プロンプト1(Developer)
QRPGLESRCのRSG0020SとRSG0021Sを参照して、仕様書_01.mdを作成してください。
ただし、その仕様書を参照してFF RPG形式のプログラムを作成するため、その点を考慮した仕様書にしてください。
使用プロンプト2(Developer/Agent)
仕様書_01.mdを参照して、FF RPG形式のRSG0050S(RSG0060S)とRSG0051S(RSG0061S)をQRPGFFSRCに作成してください。
ただし、以下の事柄は全て禁止事項です。必ず注意して作成してください。
1.QRPGSRC、QRPGLESRC、QRPGFFSRCの参照
2.FF RPG形式でサポートされていない命令
3.小文字による記述
2.1)小文字記述によるCCSIDエラー
本検証では、調査環境のCCSIDの制約により、小文字による記述を禁止事項としています。しかし、仕様書生成段階では小文字の使用を禁止していないため、Agentモードでは仕様書中の小文字記述をそのまま利用してコード生成を実施、その結果、CCSIDに起因するコンパイルエラーが発生しました。
6.2 ファイル仕様(F仕様 → DCL-F)
RSG0020S の場合:
Dcl-F RSG0010D WORKSTN SFile(SFL01:RRN1);
Dcl-F RSGEMP DISK Usage(*Input) Keyed;
DCL-F RSG0010D WORKSTN SFILE(SFL01:RRN1);
DCL-F RSGEMP DISK USAGE(*INPUT) KEYED;
Dcl-F RSG0010D WORKSTN SFile(SFL01:RRN1); ※EVAL演算命令には割り当て演算子が必要である。
Dcl-F RSGEMP DISK Usage(*Input) Keyed; ※EVAL演算命令には割り当て演算子が必要である。
2.2)ファイル定義エラー
Developerモードが生成した仕様書には、DCL-FのUSAGEキーワードにおける指定内容に誤りが含まれていました。そのため、双方が仕様書の内容に従ってコード生成を実施した結果、仕様書内の誤記を踏襲され、コンパイルエラーが発生しました。
6.2 ファイル仕様(F仕様 → DCL-F)
~~~~~
RSG0021S の場合:
Dcl-F RSG0011D WORKSTN;
Dcl-F RSGEMP DISK Usage(*Update : *Add) Keyed;
DCL-F RSGEMP DISK USAGE(*UPDATE : *ADD) KEYED; ※USAGEキーワードのパラメーターは*INPUT,*OUTPUT,*UPDATE,または*DELETEでなければならない。
DCL-F RSGEMP DISK USAGE(*UPDATE : *ADD) KEYED; ※USAGEキーワードのパラメーターは*INPUT,*OUTPUT,*UPDATE,または*DELETEでなければならない。
2.3)EXSR欠落によるエラー
Developerモードが生成した仕様書では、EXSRのFF RPG形式への変換例を示す際に、EXSR自体の記述が欠落していました。そのため、双方が仕様書の内容に従ってコード生成を実施した結果、EXSRの記述がされず、コンパイルエラーが発生しました。
6.5 処理記述(Cスペック → フリーフォーム)
| OPM/固定形式 | FFRPG対応 |
|------------|-----------|
| `EXSR #INIT` | `#INIT();` |
#INIT(); ※名前または標識が定義されていない。
#INIT(); ※名前または標識が定義されていない。
3.RPG IVから仕様書作成を経由してFF RPGへ変換(2)
使用プロンプト1(Plan)
QRPGLESRCのRSG0020SとRSG0021Sを参照して、仕様書_02.mdを作成してください。
ただし、その仕様書を参照してFF RPG形式のプログラムを作成するため、その点を考慮した仕様書にしてください。
使用プロンプト2(Developer/Agent)
仕様書_02.mdを参照して、FF RPG形式のRSG0070S(RSG0080S)とRSG0071S(RSG0081S)をQRPGFFSRCに作成してください。
ただし、以下の事柄は全て禁止事項です。必ず注意して作成してください。
1.QRPGSRC、QRPGLESRC、QRPGFFSRC、仕様書_01.mdの参照
2.FF RPG形式でサポートされていない命令
3.小文字による記述
3.1)**FREE欠落によるエラーとコメント記述エラー
双方の変換結果において、仕様書の内容に基づいて命令記述の多くがFF RPG形式へ変換されていることが確認できました。しかし、Agentモードでは**FREEの配置漏れやコメント記述方法の誤りにより、多数の構文エラーが発生しました。また、本来はコメントのはずだった記述が、コンパイラに命令として解釈できる形式で出力されていたため、さらなるエラーの要因となりました。
H*=========================================================================
H*プログラム名 : RSG0010S
H*プログラム記述:社員マスタの検討
H*作成者 : RISING
H*作成日 : / /
H*更新者 :
H*更新日 : XXXX/XX/XX
H*パラメーター :
H*=========================================================================
H DATEDIT(*YMD/)
F*=========================================================================
FRSG0010D CF E WORKSTN
F SFILE(SFL01:RRN1)
FRSGEMP IF E K DISK
**FREE
// =========================================================================
// * PROGRAM : RSG0070S
// * FUNCTION : SHAIIN MASUTA NO KENTOU
// * DATE : / / (RISING)
// * UPDATE : / /
// =========================================================================
CTL-OPT DFTACTGRP(*NO) ACTGRP(*CALLER);
CTL-OPT OPTION(*SRCSTMT : *NODEBUGIO);
// =========================================================================
// * FILE DECLARATION
// =========================================================================
DCL-F RSG0010D WORKSTN SFILE(SFL01 : RRN1);
DCL-F RSGEMP KEYED USAGE(*INPUT);
*-------------------------------------------------------------------------
* FUNCTION : 社員マスタの検討
* PGM-ID : RSG0080S
* DDS-ID : RSG0010D
* DATE : / / ( )
* UPDATE : / /
* AUTHOR : RISING
*-------------------------------------------------------------------------
* ファイル宣言
*-------------------------------------------------------------------------
DCL-F RSG0010D WORKSTN SFILE(SFL01 : RRN1);
DCL-F RSGEMP KEYED USAGE(*INPUT);
**FREE
*------------------------------------------------------------------------- ※この項目はEVAL命令の左側の項目としては無効である。
* FUNCTION : 社員マスタの検討
* PGM-ID : RSG0080S
* DDS-ID : RSG0010D
* DATE : / / ( )
* UPDATE : / /
* AUTHOR : RISING ※名前または標識が定義されていない。
*-------------------------------------------------------------------------
* ファイル宣言
*-------------------------------------------------------------------------
DCL-F RSG0010D WORKSTN SFILE(SFL01 : RRN1);
DCL-F RSGEMP KEYED USAGE(*INPUT); ※メイン・プロシージャーのステートメント・タイプの順序が正しくない。
3.2)TAGの名残によるエラー
FF RPGではGOTO/TAGはサポートされていないため、LEAVE/ITER/RETURNを利用した構造への変換が必要です。したがって、双方ともDOWを利用した構造へ変換を試みていましたが、AgentモードはTAGに対するラベル定義が残存していたため、コンパイルエラーが発生しました。
C @TG01 TAG
// === SCREEN 1 LOOP (@TG01) ===
@TG01 : ※EVAL演算命令には割り当て演算子が必要である。
3.3)配列データの記述エラー
FF RPGではDCL-SでDIM/CTDATAなどキーワードを指定することで配列を定義し、ソースコード末尾のデータ領域に**/**CTDATAで配列データ定義を区別します。しかし、双方の変換結果において配列データ定義の区別に使用される**が多用されることで、コンパイラが配列データ定義が配列定義以上に存在すると解釈し、コンパイルエラーが発生しました。
D TIT S 40 DIM(3) CTDATA PERRCD(1)
D GUI S 78 DIM(2) CTDATA PERRCD(1)
D MSG S 78 DIM(10) CTDATA PERRCD(1)
~~~~~
** TIT (タイトル ) **
社員マスタの追加
社員マスタの変更
社員マスタの表示
** GUI (ガイダンス) **
F3=終了 F12=取消
F3=終了 F5=処理 F12=取消
** MSG (メッセージ) **
*社員Cを入力してください。
*この社員Cは既に存在しています。
~~~~~
DCL-S TIT CHAR(40) DIM(3) CTDATA PERRCD(1);
DCL-S GUI CHAR(78) DIM(2) CTDATA PERRCD(1);
DCL-S MSG CHAR(78) DIM(7) CTDATA PERRCD(1);
~~~~~
** TIT
** 社員マスタ追加
** 社員マスタ変更
** 社員マスタ表示
** GUI
** F3=終了 F5=処理 F12=取消
** F3=終了 F12=取消
** MSG
** 社員Cを入力してください。
** この社員Cは既に存在しています。
~~~~~ ※ソース・レコードは存在しているが,配列またはテーブルの定義が見つからない。
DCL-S TIT CHAR(40) DIM(3) CTDATA PERRCD(1);
DCL-S GUI CHAR(78) DIM(3) CTDATA PERRCD(1);
DCL-S MSG CHAR(78) DIM(7) CTDATA PERRCD(1);
~~~~~
*========================================================================= ※この項目はEVAL命令の左側の項目としては無効である。
** TIT
*=========================================================================
** GUI
*=========================================================================
** MSG
*=========================================================================
**
** TIT
社員マスタの保守(追加)
社員マスタの保守(変更)
社員マスタの保守(表示)
** GUI
F3=終了 F5=処理 F12=取消
F3=終了 F5=処理 F12=取消
F3=終了 F12=取消
** MSG
社員Cを入力してください。
この社員Cは既に存在しています。
~~~~~ ※ソース・レコードは存在しているが,配列またはテーブルの定義が見つからない。
◇まとめ
本記事では、「PP4i」導入よって追加されるIBM i 向けロジックおよびRAG機能に着目し、RPG IVから FF RPGへの変換精度について検証しました。
検証の結果、PP4iを利用したDeveloperモードでは、DCL-PRの生成などAgentモードでは一度も生成されなかった変換が確認でき、IBM BobのRPG言語に対する理解が向上していることがうかがえました。
一方で、FF RPGの構文規則を満たさないコードや仕様書に起因する誤りも見られ、本検証ではコンパイル成功まで直接到達できるような変換結果は得られませんでした。
ただし、本検証はSSHやMCPによるIBM iとの直接接続を利用していないため、PP4i本来の機能を十分に活用した変換結果ではありません。
そのため、長年開発が実施されてきたIBM i環境で同様の検証を行えば、関連プログラムなどを参照しながら解析できることから、今回よりも高い変換精度が得られる可能性も考えられます。