2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

◇はじめに

本記事は、「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に着目した調査結果としてご参照ください。

◇導入方法

  1. IBM Bob公式サイトからプランを選択し、[今すぐ購入]をクリック
  2. 「IBM Bob i 向けプレミアムパッケージ」のユーザーを+1に設定し、[チェックアウトへ進む]をクリック
    RiSING_PP4i_01.jpg
  3. 画面の案内に従って購入手続きを完了
  4. IBM Bobの設定画面またはサブスクリプション管理画面に追加されていることが確認できれば導入完了

◇検証手順

  1. IBM Bobで下記のフォルダを開く
  2. Developerモードを選択し、自動読み取りを許可せずプロンプトを実行
  3. FF RPGファイルが作成されたら、IBM Bobを新しいタスクへ切り替える
  4. Agent/Planモードを選択し、自動読み取りを許可せずプロンプトを実行
  5. FF RPGファイルが作成されたら、両者をIFSへアップロードしてコンパイル
  6. コンパイルエラーの内容を比較
フォルダ構造
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構文として解釈できない定義が生成されたため、コンパイルエラーが発生しました。

RSG0020S.RPGLE
     FRSG0010D  CF   E             WORKSTN
     F                                     SFILE(SFL01:RRN1)
     FRSGEMP    IF   E           K DISK
RSG0030S.RPGLE
DCL-F RSG0010D  CF   E           WORKSTN SFILE(SFL01 : RRN1);  ※キーワードは認識されない。キーワードは無視されます。
DCL-F RSGEMP    IF   E           K DISK;  ※キーワードは認識されない。キーワードは無視されます。
RSG0040S.RPGLE
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の構文要件を満たしていないため、コンパイルエラーが発生しました。

RSG0021S.RPGLE
     C     D@EMPE        CHAIN     RSGEMP                             91
RSG0031S.RPGLE
CHAIN RSGEMP D@EMPE;  ※指定された演算命令で演算項目2オペランドが正しくない。
IF NOT %FOUND(RSGEMP);
RSG0041S.RPGLE
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自体が生成されておらず、呼び出し先が未定義となっているため、コンパイルエラーが発生しました。

RSG0020S.RPGLE
     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
RSG0030S.RPGLE
BEGSR #CAL01;
  CALLP RSG0031S(P@MODE : P@EMPE);
ENDSR;
~~~~~
DCL-PR RSG0031S EXTPGM('RSG0031S');  ※メイン・プロシージャーのステートメント・タイプの順序が正しくない。
  MODE CHAR(3);  ※ENDSR演算命令の後の演算命令の指定が正しくない。指定は無視されます。
  EMPE CHAR(5);  ※ENDSR演算命令の後の演算命令の指定が正しくない。指定は無視されます。
END-PR;  ※メイン・プロシージャーのステートメント・タイプの順序が正しくない。
RSG0040S.RPGLE
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に起因するコンパイルエラーが発生しました。

仕様書_01.md
6.2 ファイル仕様(F仕様 → DCL-F)

RSG0020S の場合:
Dcl-F RSG0010D WORKSTN SFile(SFL01:RRN1);
Dcl-F RSGEMP   DISK    Usage(*Input) Keyed;
RSG0050S.RPGLE
DCL-F RSG0010D WORKSTN SFILE(SFL01:RRN1);
DCL-F RSGEMP   DISK    USAGE(*INPUT) KEYED;
RSG0060S.RPGLE
Dcl-F RSG0010D WORKSTN SFile(SFL01:RRN1);  ※EVAL演算命令には割り当て演算子が必要である。
Dcl-F RSGEMP   DISK    Usage(*Input) Keyed;  ※EVAL演算命令には割り当て演算子が必要である。

2.2)ファイル定義エラー

Developerモードが生成した仕様書には、DCL-FのUSAGEキーワードにおける指定内容に誤りが含まれていました。そのため、双方が仕様書の内容に従ってコード生成を実施した結果、仕様書内の誤記を踏襲され、コンパイルエラーが発生しました。

仕様書_01.md
6.2 ファイル仕様(F仕様 → DCL-F)
~~~~~
RSG0021S の場合:
Dcl-F RSG0011D WORKSTN;
Dcl-F RSGEMP   DISK    Usage(*Update : *Add) Keyed;
RSG0051S.RPGLE
DCL-F RSGEMP   DISK    USAGE(*UPDATE : *ADD) KEYED;  ※USAGEキーワードのパラメーターは*INPUT,*OUTPUT,*UPDATE,または*DELETEでなければならない。
RSG0061S.RPGLE(大文字へ修正)
DCL-F RSGEMP   DISK    USAGE(*UPDATE : *ADD) KEYED;  ※USAGEキーワードのパラメーターは*INPUT,*OUTPUT,*UPDATE,または*DELETEでなければならない。

2.3)EXSR欠落によるエラー

Developerモードが生成した仕様書では、EXSRのFF RPG形式への変換例を示す際に、EXSR自体の記述が欠落していました。そのため、双方が仕様書の内容に従ってコード生成を実施した結果、EXSRの記述がされず、コンパイルエラーが発生しました。

仕様書_01.md
6.5 処理記述(Cスペック → フリーフォーム)

| OPM/固定形式 | FFRPG対応 |
|------------|-----------|
| `EXSR #INIT` | `#INIT();` |
RSG0050S.RPGLE
#INIT();  ※名前または標識が定義されていない。
RSG0060S.RPGLE
#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の配置漏れやコメント記述方法の誤りにより、多数の構文エラーが発生しました。また、本来はコメントのはずだった記述が、コンパイラに命令として解釈できる形式で出力されていたため、さらなるエラーの要因となりました。

RSG0010S.RPGLE
     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
RSG0070S.RPGLE
**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);
RSG0080S.RPGLE
      *-------------------------------------------------------------------------
      *         FUNCTION   : 社員マスタの検討
      *         PGM-ID     : RSG0080S
      *         DDS-ID     : RSG0010D
      *         DATE       :     /  /   (          )
      *         UPDATE     :     /  /
      *         AUTHOR     : RISING
      *-------------------------------------------------------------------------
      * ファイル宣言
      *-------------------------------------------------------------------------
       DCL-F RSG0010D WORKSTN SFILE(SFL01 : RRN1);
       DCL-F RSGEMP KEYED USAGE(*INPUT);
RSG0080S.RPGLE(**FREE追記)
**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に対するラベル定義が残存していたため、コンパイルエラーが発生しました。

RSG0010S.RPGLE
     C     @TG01         TAG
RSG0070S.RPGLE
// === SCREEN 1 LOOP (@TG01) ===
RSG0080S.RPGLE(**FREE追記)
       @TG01 :  ※EVAL演算命令には割り当て演算子が必要である。

3.3)配列データの記述エラー

FF RPGではDCL-SでDIM/CTDATAなどキーワードを指定することで配列を定義し、ソースコード末尾のデータ領域に**/**CTDATAで配列データ定義を区別します。しかし、双方の変換結果において配列データ定義の区別に使用される**が多用されることで、コンパイラが配列データ定義が配列定義以上に存在すると解釈し、コンパイルエラーが発生しました。

RSG0011S.RPGLE
     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は既に存在しています。
~~~~~
RSG0071S.RPGLE
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は既に存在しています。
~~~~~  ※ソース・レコードは存在しているが,配列またはテーブルの定義が見つからない。
RSG0081S.RPGLE(**FREE追記)
       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環境で同様の検証を行えば、関連プログラムなどを参照しながら解析できることから、今回よりも高い変換精度が得られる可能性も考えられます。

2
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?