はじめに
本記事は、IBM iの標準のコマンド「CVTRPGSRC」について、RiSING活動を通して調査した内容をまとめたものです。
CVTRPGSRCについて
IBM iにおいて、RPG IIIのソースコードをRPG IVへ変換するコマンドです。
実行方法
・FROMFILR:変換するRPGソースのライブラリとファイル名を指定します。
・FROMMBR:変換するソースメンバーを指定します。
・TOFILE(*LIBL/QRPGLESRC):変換後の出力ライブラリとファイル名を指定します。
・TOMBR(*FROMMBR):変換後のソースのメンバー名を指定します。
CVTRPGSRC FROMFILE(TSTLIB/QRPGSRC) FROMMBR(*ALL) TOFILE(TSTLIB/QRPGLESRC) LOGFILE(TSTLIB/QRNCVTLG)
コンバート実行時にはログファイルを作成しておくことで、ログの出力が可能になります。
以下がログファイルを作成するときのコマンドです。
CPYF FROMFILE(QRPGLE/QARNCVTLG) TOFILE(TSTLIB/QRNCVTLG) MBROPT(*REPLACE) CRTFILE(*YES)
注意点
今回行った検証ではコンバート時にエラーになる事象は存在しませんでした。
検証にてコンバートしたプログラムのコンパイル時に発生したコンパイルエラーなどは以下にまとめています。
シフト文字を含むソース
RPG IIIでは直接シフトコードの値をセットすることなどができますが、RPG IVではX'OE'などのヘキサ16進数は可能だが、直接値をセットする等はエラーになります。

外部ファイル(/COPYまたは/INCLUDE)の入っているもの
RPG IIIのソース内にコピー句(/COPYなど)がある場合、読込先のコピー句メンバーもRPG IVにコンバートしておく必要があります。
コピー句のメンバーを先にコンバートしておくのが確実です。
変数がRPG IVの予約語とかぶっているソース
RPG IVでは、組み込み関数や新しい日付型などが追加されたため、RPG III時代にはすかえていたものがシステム予約語として使えなくなっている場合があります。
エラー発生時にはコンパイルエラーとなった変数を別の変数名にリネームする必要があります。
コンパイル時配列を使用しているソース
RPG IIIのソースファイルとRPG IVのソースファイルではレコード長が異なるため、変換時に配列データの位置がずれてしまったり、途切れたりすることがあります。
エラー発生時には変換後のソース確認し、位置がずれている場合は手動での修正を行う必要があります。
ネストが深い、または巨大なソース
RPG IVでは様々な制限(変数の数、配列のサイズなど)が大幅に拡張されていますが、一部のメモリ割り当てルールなどは厳格になっています。何万行もあるソースなどの場合、コンパイル時にメモリ不足やロジックの警告が出ることがあります。
古い命令コードを使用しているソース
RPG IIIには存在したが、RPG IV以降では意味が変わってしまった命令があります。RPG IIIにはFREEという命令(データエリアを開放する命令)がありましたが、RPG IVでは宣言構文と衝突するため、書き換えが必要になる場合があります。

