RPG

425. コンパイル・リストで見るRPG III と MI

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のデコンパイラーを開発して
それを輸入した日本国内のソリューション・プロパイターが高額な値段で
デコンパイルを請け負っていたがこれはソースを失って弱っているユーザーから
法外な値段を要求するという倫理的に感心できないビジネスである。
何でも金を取ればいいってものではないと心証が良くない会社であった。