RPG

475. RPG III のここが問題(3)

久しぶりにRPG IIIを記述するとILE-RPGに比べて
問題点が様々浮かび上がってくる。
その中でも最大の問題は
_

 

書いた本人にしかわからない

ということである。
書いた本人しかわからないのであれば
書いた本人が辞めてしまったり忘れてしまったのであれば
意味不明なプログラムが残るだけで保守ができなくなってしまう。
それではなぜこのような問題が発生するのだろうか?

(1)IBMは誰にでも書けるやさしい言語にした

IBM はAS/400(実はその前のS/38)を開発当初、誰にでも容易に記述できるように
できるだけとっつきやすいやさしい開発言語としたことである。
IBM はAS/400とその前のSYSTEM/3 のRPG2 でも
RPG(=Report Programming Generator)はソフトウェアハウスに依頼しなくても
ユーザー自身が学習して独力で開発できる言語を目指していた。
そのために以下に述べるように言語体系にしたのである。
_

(2)固定記述式

RPG IIIはコードを記述する場所が決められている固定記述式の言語である。
RPG IIIの前のRPG2では各仕様書に鉛筆で記述するというコーディング手法であった。
RPG III はその前の RPG2 から始まっているのである。
そのためインデント(=段落)を記述することができないので
演算命令の構造化表現ができずに見た目にわかりにくいものとなってしまっていた。

(3)フィールド名は6桁

ILE-RPGではフィールド名は10桁まで拡張されたがRPG IIIで使えるフィールド名は
6桁までである。
このため表現力が限られてしまうため意味を読取ることが困難になる。
( RPGでは10桁まで拡張されたがDDSではまだ6桁までしか使えない)
これに加えてフィールド名に特殊文字¥や @ を付加する企業もあって
余計に表現力は低下する。
特に文字 ¥ は特殊文字というより通貨記号であるのでPCに変換すると
¥は文字 $ に変換されてしまう。
今はIBM iの中だけで完結する時代ではないので文字¥ をフィールド名の中に
使うことは絶対に避けるべきである。

(4) 配列指標がカンマ区切り

RPG III の配列の記述はカンマ区切りで SCR,4 のように表現するが
これは他の言語ではあまり見られない表現でわかりにくい。
ILE-RPG であれば SCR(4) のようなカッコで配列指標を表現するので
非常に直観的でわかりやすくなっている。

(5) END だけでは識別できない

_

IF-ENDのENDは DO-END のENDも同じEND命令しか使えないので
固定記述式に加えてこいくら構造化表現をしようとしても
同じENDが重なってしまうとどの命令に対するENDであるか識別できない。
ILE-RPGでは ENDIF と ENDDO は明確に区別されているので
わかりやすくなっている。
–>実はRPG IIIでも ENDxxは途中から使用できるように改善された。

(6) ひとつの命令しか実行できない

RPG |||の場合の演算命令は

項目1 演算命令 項目2 結果

の形式であり一行の記述ではひとつの演算しか行うことができない。

[ RPG IIIの演算命令 ]

0005.00      E                    AUT     1   1 32                 
0006.00      I            DS                                       
0007.00      I                                        1  10 PGM    
0008.00      I                                       11  20 OBJLIB 
0009.00      I                                       21  30 SRCF   
0010.00      C                     MOVEL'CRTRPG ' CMD   128        
0011.00      C                     CAT  OBJLIB:1  CMD              
0012.00      C                     CAT  '/':0     CMD              
0013.00      C                     CAT  PGM:0     CMD              
0014.00      C                     MOVEL'SRCFILE' SRCF#  10        
0015.00      C                     CAT  SRCF#:0   CMD              
0016.00      C                     CAT  '/':0     CMD              
0017.00      C                     CAT  SRCF:0    CMD              
0018.00      C                     CAT  AUT,1:0   CMD              
0019.00      C                     SETON                     LR    
0020.00      C                     RETRN                           
0021.00 ** AUT                                                     
0022.00 AUT(*ALL)                                                  

[解説]

このRPG IIIの演算を読んでどのような処理を行っているのか
理解できるだろうか?
RPG IIIでは一回の演算命令行でひとつの演算命令しか実行
できないのでこのように冗長な記述になってしまう。

頭の中で演算結果を組み立てていかなければ理解できない。
理解するのには相当根気が要るはずである。
同じ結果が欲しい場合でもいろいろな書き方ができてしまう。
これが書いた人しかわからなくなる最大の理由である。
これをILE-RPGで書くと次のようになる。

[ILE-RPGの演算命令]

0006.00 D CMD             S            128A                             
0007.00 D PGM             S             10A                             
0008.00 D OBJLIB          S             10A                             
0009.00 D SRCF            C                   CONST('QRPGLESRC/QTRSRC') 
0010.00 D AUT             C                   CONST('AUT(*ALL)')        
0011.00                                                                 
0012.00  /FREE                                                          
0013.00     CMD ='CRTRPG ' + %TRIMR(OBJLIB) + '/' + %TRIMR(PGM) + ' ' + 
0014.00            SRCF + ' ' + AUT;                                    
0015.00     *INLR = *ON;                                                
0016.00  /END-FREE                                                      

[解説]

ILE-RPGは見ただけでCMD = …で文字列を結合している様子がすぐに理解できる。
あなたが今、初めてILE-RPGを見たのだとしても理解できるはずである。
RPG IIIで CATという演算命令はわからない人はいるかもしれないが
ILE-RPG の + という記号の意味がわからないという人はいない。

このようにILE-RPGではフリー・フォーマットを使って極めて直感的な記述ができる。
これはコーディングしていもRPGはもちろんC言語やBACIC, C++< Javaに比べても 快適で記述が容易であり第三者が見ても直ちに理解することができる。 書いた本人しかわからないRPG IIIと比べれば違いは顕著である。 これほど進化している開発言語は他にはない。 ILE-RPGに比べればひとつの命令しか書けないRPG IIIは非常にわかりにくいソースと なってしまう。

(7) 動いてしまう

\

これはRPG IIIに限った話ではないのかも知れないが
すべての変数の初期設定はI5/OSがユーザーの代わりに行ってくれる。
Microsoft のC++やVC++,C# では未初期化の変数には 0xc0c0…という値が
初期設定されてしまってたちまち実行エラーとなる。
Javaではポインタという概念を取ってしまったのだが
そのおかげで不便になっただけではなくポインタ・エラーはJavaでも
しっかり発生する。

間違ったSFLの書き方をしている人は実に多いのだが
誤った書き方をしていてもRPGの場合はアベンドすることなく
動いてしまう。他のオープン系の言語ではほんのわずかな
誤りでも許されずにアベンドしてしまうことが多い。

動いてしまうのはRPG IIIに限らないのであるがRPGは適当に書いても動いてしまうので
他のオープン系のJavaなどの他の言語でも同じようなものだろうと考えて
オープン系に移行するユーザーがいるがこれは自分の会社を潰しにかかっているのと
同じである。米国の経営はトップダウン方式なのでトップの意向ひとつで
パッケージに移行しやすいが日本の経営はボトムアップ方式で社員皆の意見を
積み上げていく方式なので複雑な独自のシステムが必要でこれはIBMに
おあつらえ向きである。最近聴くのはオープン系移行で何十億円も投資して
5~10年経っても未だに完成していないいう話をあちこちで聞くことが多い。

IBM iがあまりにも簡単なので他のシステムでも同じように動くのだろうと
思い込んで移行するとこのようにとんでもない目に会ってしまう。