RPG III プログラムのコンパイルで
CRTRPGPGM PGM(QTROBJ/PGM106) SRCFILE(QTRSRC/QRPGSRC) OPTION(*SRCDBG)
GENOPT(*LIST *XREF *ATR) AUT(*ALL)
のように GENOPT(*LIST *XREF *ATR) を指定してコンパイルしてみると
コンパイル・リストの最後のほうに次のような MI (=MachineInterface)の
リストが生成される。
[ PGM106: コンパイル・リスト ]
00193 0005 000018 2132 009E 0471 CPYBWP .DMPPGMP,.ACTPTR /*LOC PROGRAM*/ 00194 0006 00001E 10B2 0483 000E CPYBLA .CALLSW,*ON 00195 0007 000024 1042 046E 2003 CPYNV .FACELVL,3 /*INTERFACE LVL*/ 00196 0008 00002A 1022 0498 00AB SETIP .CALLERR,.ERRDMP /*GO TO IF ERR*/ 00197 0009 000030 0283 009A 0496 0000 CALLX .DMPCALL,.DMPLIST,* 00198 000A 000038 1C46 4000 047A 23CA CMPNV(B) .RLSTATS,970/EQ(.ERA) 04C6 00199 000B 000042 1C46 C000 047A 2000 CMPNV(B) .RLSTATS,0/NEQ(.ERRDMP) 00AB 00200 000C 00004C 10B2 0483 000F CPYBLA .CALLSW,*OFF /*END OF DUMP*/ /*QSYSDMPA*/ 00201 00202 000D 000052 1011 00AE B .DMPRTN 00203 .ERRDMP: /*FAILURE IN CALLING DUMP* 00204 000E 000056 30B2 0483 000F CPYBLA .CALLSW,*OFF /*RESET ERR SW*/ ; 00205 000F 00005C 10B2 007B 007A CPYBLA .PGMPROR,.PGMERST /*SAVE PRIOR STATUS*/ ; 00206 0010 000062 10B2 007A 00AC CPYBLA .PGMERST,C'00299' /*DUMP FAILED*/ ; 00207 0011 000068 10B2 049A 20D7 CPYBLA .TYPERR,'P' ; 00208 0012 00006E 10B2 049B 007A CPYBLA .SAVPSTS,.PGMERST ; 00209 0013 000074 1CC2 4000 0006 000E CMPBLA(B) .DUMPSW,*ON/EQ(.ERR) /*TERMINATION DUMP*/ ; 04C5 00210 0014 00007E 1CC2 4000 00AD 000E CMPBLA(B) .TERRSW,*ON/EQ(.ERR) /*IF ERRSW ALREADY, END*/ ; 04C5 00211 0015 000088 1011 00C5 B .ERX ; 00212 DCL DD .TERRSW CHAR(1) INIT('0') ; 00213 DCL INSPTR .DMPRTN /*QSYS3*/ ; 00214 DCL CON .MSK0001 CHAR(017) INIT(X'03B1400303B2AAB36103AAAAB36103AAAA') ; 00215 DCL CON .MSK0002 CHAR(023) INIT( X'03B1400303B2B06B03B2B2B2B06B03B2B2AAAF40036003') /* SHTANK 9500 */ ; 00216 DCL CON .MSK0003 CHAR(018) INIT(
[解説]
リスト中で BRK ‘2700 ‘ のように BRK xxxx と表現されているのは元のRPGのソース・ステート・メント番号を
表している。
このリストの最上段の
10B2 0483 000E は CPYBLA .CALLSW,*ON という MIを表している。
つまり 10B2 が MI の CPYBLA という演算命令であり 0483 が CALLSW というオペランド(パラメータ)
のことである。
BRK XXXX というRPGのステートメントを見れば RPGの演算命令がどのようなMIに置換えられたのかがほかる。
これを解析すればMIから元のRPGソースを生成することができる。
これがデコンパイルと呼ばれるリバース・エンジニアリングりの理屈である。
RPG III の場合はコンパイルの結果がどのようにMI命令に置き換わるのかがコンパイル・リストで
示されているので根気よく解析すればデコンパイラーを作ることができる。
しかしILE-RPGの場合はIBMはこの機能を取り去ってしまったのでデコンパイラーは
容易にはできなくなってしまった。
コンパイルというのはMIという中間言語に変換することである。
ILE-RPGの場合もMIを解析すればデコンパイラーを作ることは不可能ではないが
労力の割りには得るものは少ない。
昔は米国のソフトウェア・ハウスが RPG IIIのデコンパイラーを開発して
それを輸入した日本国内のソリューション・プロパイターが高額な値段で
デコンパイルを請け負っていたがこれはソースを失って弱っているユーザーから
法外な値段を要求するという倫理的に感心できないビジネスである。
何でも金を取ればいいってものではないと心証が良くない会社であった。