◇はじめに
本記事は、VSCodeの拡張機能「RPGLE Free」について、RiSING活動を通して調査した内容をまとめたものです。
◇RPGLE Freeとは
RPGLE Freeは、VSCode上でRPG IVからFF RPGへの変換を支援するツールとして提供されている拡張機能の1つです。
◇導入手順
◇実行方法
◇変換特性にともなう注意点
RPGLE Freeは自動変換ツールですが、実際には想定された固定形式の記述パターンに基づく条件式による置換を実施しています。そのため、FF RPGでサポートされていない命令文や、機械的な変換が困難な記述については、望ましくない変換結果となる場合があります。
ここでは、本拡張機能の変換特性に起因して発生する代表的なコンパイルエラーの事例を紹介します。
1.PLISTおよびKLISTの消滅バグ
FF RPGでは、PLISTおよびKLISTはサポートされておらず、DCL-PRおよび%KDS()による記述が必要です。しかし、本拡張機能ではPLIST/PARMおよびKLIST/KFLDに対してDCL-PRおよび%KDS()の追記はされず、削除処理のみが実施されるため、変換後のソースはコンパイルエラーとなります。
C*=========================================================================
C* PARAMETER LIST
C*=========================================================================
C *ENTRY PLIST
C PARM P@AAAA 5
C PARM P@BBBB 5
C*=========================================================================
C* KEY LIST
C*=========================================================================
C K@KEY1 KLIST
C KFLD K@AAAA 5
C KFLD K@BBBB 5
C*=========================================================================
//=========================================================================
// PARAMETER LIST
//=========================================================================
//=========================================================================
// KEY LIST
//=========================================================================
//=========================================================================
2.MOVE系命令の変換未対応
FF RPGでは、MOVE/MOVELなどのMOVE系命令がサポートされておらず、算術演算式の直接記述やEVALを利用する必要があります。しかし、本拡張機能はMOVE系命令の変換に対応していないため、該当命令はRPG IV形式のまま残り、コンパイルエラーとなります。
3.GOTO/TAGの変換未対応
FF RPGでは、GOTO/TAGはサポートされておらず、LEAVE/ITER/RETURNなどを利用した構造への変換が必要です。しかし、本拡張機能ではGOTO/TAGからLEAVE/ITER/RETURNを利用した構造への自動変換が困難なため、該当命令はRPG IV形式のまま残り、コンパイルエラーとなります。
4.DOからFORへの変換バグ
FF RPGでは、DOはサポートされておらず、DOU/DOWまたはFORを利用した記述が必要です。そのため、本拡張機能ではDOをFORへ変換する処理が実施されます。しかし、変換処理上の不具合により、本来FOR/ENDFORとなるべき箇所がFOR/ENDDOへ誤変換され、コンパイルエラーとなります。
C 1 DO W@RRN1 II
C EXSR #GET01
C EXSR #SET01
C END
For II = 1 to W@RRN1;
EXSR #GET01;
EXSR #SET01;
ENDDO;
5.SETLL/SETGT/CHAINのインジケータ変換バグ
FF RPGでは、SETLL/SETGT/CHAINなどの命令内におけるインジケータ操作がサポートされておらず、%FOUND/%ERRORなどの組み込み関数を利用した記述が必要です。そのため、本拡張機能では元のRPG IV記述を基にインジケータ操作を変換します。しかし、変換処理上の不具合により、本来は異なるインジケータへの操作命令に変換されるべき処理が、同一インジケータに対する複数の操作命令へ誤変換され、コンパイルエラーもしくは意図しない動作の原因となります。
C K@EMPE SETLL RSGEMP 919293
SETLL K@EMPE RSGEMP;
*in91 = (%found() = *Off);
*in91 = %error();
*in91 = %equal();
6.MVRの変換未対応
FF RPGでは、ADD/SUB/MULT/DIV/MVR/SQRTなどの算術演算命令はサポートされておらず、算術演算式の直接記述やEVAL/%REM()/%SQRT()を利用する必要があります。しかし、本拡張機能ではMVRに対する変換処理が未対応なため、MVRのみがRPG IV形式のまま残り、コンパイルエラーとなります。
C NUMA ADD NUMB RESULT
C NUMA SUB NUMB RESULT
C NUMA MULT NUMB RESULT
C NUMA DIV NUMB RESULT
C MVR RESULT
C SQRT NUMC RESULT
RESULT = NUMA + NUMB;
RESULT = NUMA - NUMB;
RESULT = NUMA * NUMB;
RESULT = NUMA / NUMB;
C MVR RESULT
RESULT = %SQRT(NUMC);
7.RPG IVでサポートされていない命令の変換未対応
そもそもRPG IV自体でもサポートされていない命令は、本拡張機能においても変換対象として定義されていません。そのため、FREE/DEBUGなどのRPG III由来の記述については変換処理が行われず、元の記述のまま残るためコンパイルエラーとなります。
◇まとめ
本記事では、VSCodeの拡張機能「RPGLE Free」をモダナイズにおける有用性および利便性の観点から調査を行いました。
調査の結果、RPGLE Freeはいくつかの制約や変換上の課題があるものの、RPG IVからFF RPGへの変換作業を支援するツールとしては十分に価値があることが分かりました。
一方で、変換処理はあらかじめ想定された条件式に基づいて実施されるため、全ての記述を正しく変換できるわけではなく、一部の命令や複雑な処理については変換漏れや誤変換が発生する場合があります。
そのため、本拡張機能を利用した変換は、変換特性を十分に理解したうえで、変換後のソースコードに対する内容確認と修正作業および追加の変換作業を実施することが前提となります。
しかし、変換処理のルールや変換結果の傾向が条件式によって決まっていることから、事前に注意すべきポイントを把握しておけば、変換後の確認作業や修正作業を効率的に進めることも可能だと考えられます。
少ない手順で全てが不具合なく変換され動作するような完璧なツールではありませんが、FF RPGへの変換作業における出発点を素早く用意できる実用的な支援ツールとして、モダナイズの効率化に役立つと考えられます。

