ILE-RPG(その2 サービスプログラム)
前ページ へ 次ページへ 目 次 へ


ILE−RPGの最大の特長はバインドと呼ばれるスタティック・リンク方式にあります。
この方式は、従来のダイナミックリンク方式に比べ、リンクの際のオーバーヘッドが軽減され、
処理効率が大幅に向上します。
このページでは、従来のRPG(RPG-V)との相違点を中心に、
ILE−RPG(RPG-W)について紹介します。





サービスプログラムの作成

ILEの体系では、いろいろなプログラムから共通に利用されるサブルーチンについては、
サービスプログラムとして作成することができます。この考えかたはRPG-Vにはありません。
サービスプログラムは、CRTPGMコマンドによってひとつのプログラムにコピーされて
組込まれるのではなく、情報のリンクが取られるだけです。
実行されるときは、従来のOPMモデルの制御の渡しかたではなく、そのリンク情報を利用して
制御がわたされるので、高効率で実行がされます。

注:OPM,Original Program Model

今ここでサービスプログラムとして、三角関数SIN,COS,TAN、ATANを用意し、それ(そのうちSIN,COS)を
利用する方法を紹介します。
サービスプログラムとなるソースはNOMAINで作成します。次のようになります。

 * 関数型の呼出しと関数プロシージャー                              
H NOMAIN                                                           
 *---------------------------------------------------------------  
 * プロトタイプの指定            ↓戻り                            
DCOS              PR             8F                                
D                                8F                                
 *                                                                 
DSIN              PR             8F                                
D                                8F                                
 *                                                                 
DTAN              PR             8F                                
D                                8F                                
 *                                                                 
DATAN             PR             8F                                
D                                8F                                
 *---------------------------------------------------------------  
PCOS              B                   EXPORT                       
 * 関数型の戻りを示す            ↓                                
DCOS              PI             8F                                
D  X                             8F                                
 *                                                                 
D T               S              8F                                
D Y               S              8F                                
D WK              S              8F                                
D N               S              7P 0                              
C*---------------------------------------------------------------  
C                   Z-ADD     001           Y                      
C                   Z-ADD     001           T                      
C                   Z-ADD     001           N                      
 * テーラー展開による計算                                          
C     001           DO        999           N                      
C                   EVAL      T = -T*X*X/((2*N)*(2*N-1))           
 * 絶対値を取得                                                    
C                   Z-ADD     T             WK                     
C     T             IFLT      0                                    
C     0             SUB       T             WK                     
C                   ENDIF                                          
 * 十分小さいければ繰り返しやめ                                    
C     WK            IFLE      0.1E-11                              
C                   LEAVE                                          
C                   ELSE                                           
C                   EVAL      Y = Y + T                           
C                   ENDIF                                         
C                   ENDDO                                         
 *----------------------------------------------------------------
C                   RETURN    Y                                   
PCOS              E                                               
 *----------------------------------------------------------------
PSIN              B                   EXPORT                      
 * 関数型の戻りを示す            ↓                               
DSIN              PI             8F                               
D  X                             8F                               
 *                                                                
D Y               S              8F                               
D W               S              8F                               
C*--------------------------------------------------------------- 
C                   EVAL      W = X -3.14159265/2.000000000000    
C                   EVAL      Y = COS(W)                          
C                   RETURN    Y                                   
PSIN              E                                               
 *----------------------------------------------------------------
PTAN              B                   EXPORT                      
 * 関数型の戻りを示す            ↓                                
DTAN              PI             8F                                
D X                              8F                                
D Y               S              8F                                
 *                                                                 
C                   EVAL      Y = SIN(X) / COS(X)                  
C                   RETURN    Y                                    
PTAN              E                                                
 *---------------------------------------------------------------- 
PATAN             B                   EXPORT                       
 * 関数型の戻りを示す            ↓                                
DATAN             PI             8F                                
D  X                             8F                                
 *                                                                 
D Y               S              8F                                
D T               S              8F                                
D S               S              8F                                
D N               S             10I 0                              
C                   EVAL      Y= X                                 
C                   EVAL      T= X                                 
C                   EVAL      N= 3                                 
C                   DO        *HIVAL                    
C                   EVAL      T= -T*X*X                 
C                   EVAL      S= T/N                    
 * 絶対値を取得                                         
C                   IF        %ABS(S) < 0.0000000001    
C                   LEAVE                               
C                   ENDIF                               
C                   EVAL      Y= Y+S                    
C                   EVAL      N= N+2                    
C                   ENDDO                               
C                   RETURN    Y                         
PATAN             E                                     

関数の名前はすべて、外部属性を持つようEXPORTパラメータをつけておきます。
パラメータの授受は全て、8桁のFすなわち倍精度浮動小数点数で行っています。

モジュールの作成

モジュール(名称はTRIとしています)はCRTRPGMODコマンドで行います。

CRTRPGMOD MODULE(WRKLIB/TRI) SRCFILE(WRKLIBLIB/QRPGLESRC)

バインド言語による定義

サービスプログラム作成のとき、バインド言語でEXPORT情報を記述しておきます。
これはサービスプログラム名と同じ名前でソースファイルQSRVSRCにタイプBNDで
作成しておきます。

STRPGMEXP PGMLVL(*CURRENT)
  EXPORT  SYMBOL('COS')
  EXPORT  SYMBOL('SIN')
  EXPORT  SYMBOL('TAN')
  EXPORT  SYMBOL('ATAN')
ENDPGMEXP

サービスプログラムの作成

サービスプログラムはコマンドCRTSRVPGMで作成します。

CRTSRVPGM SRVPGM(WRKLIB/TRI) MODULE(WRKLIB/TRI) EXPORT(*SRCFILE) SRCMBR(*SRVPGM)

これて準備が整いました。


呼出しプログラム

サービスプログラムを利用する側では、プロトタイプ定義を入れたプログラムをコーディング、モジュールを作成、
さらにCRTPGMコマンドでプログラムを作成のとき、サービスプログラムの利用を記述します。

この例では単純にSIN,COSを呼出しをして計算し印刷をしています。(TAN,ATANは呼出ししていません。)

 * 関数型の呼出しと関数プロシージャー                             
H DATEDIT(*YMD-)                                                  
FQPRINT    O    F  132        PRINTER                             
 *--------------------------------------------------------------- 
 * プロトタイプの指定            ↓戻り                           
DCOS              PR             8F                               
D                                8F                               
 *                                                                
DSIN              PR             8F                               
D                                8F                               
 *                                                                
DTAN              PR             8F                               
D                                8F                               
 *                                                                
DATAN             PR             8F                               
D                                8F                               
D  SX             S             16S15                               
D  CX             S             16S15                               
D  TX             S             16S15                               
 *                                                                  
D  X              S              8F                                 
 *---------------------------------------------------------------   
C     001           DO        015           N                 7 0   
C                   EVAL      X=  N / 10.0                          
C                   Z-ADD     X             XX               1615   
C                   EVAL      CX = COS(X)                           
C                   EVAL      SX = SIN(X)                           
C                   EVAL      TX = (COS(X)**2.0 + SIN(X)**2.0)**0.5 
C                   EXCEPT    DTL01                                 
C                   ENDDO                                           
C*                                                                  
C                   SETON                                        LR 
C                   RETURN                                          
OQPRINT    E            DTL01       1                               
O                       XX            K     18                      
O                       CX            K     36                      
O                       SX            K     54 
O                       TX            K     72 

バインド済みサービスプログラムを使用してのCRTPGMは次のようにします。

CRTPGM PGM(WRKLIB/TMAIN)  BNDSRVPGM(WRKLIB/TRI)

実行結果を参考に紹介します。
*...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+ 
 .100000000000000  .995004165277777  .099833418432918 1.000000000178064     
 .200000000000000  .980066577841269  .198669332554224 1.000000000349519     
 .299999999999999  .955336489125604  .295520208376081 1.000000000506739     
 .400000000000000  .921060994002850  .389418343961266 1.000000000643526     
 .500000000000000  .877582561889863  .479425540179230 1.000000000754661     
 .599999999999999  .825335614909687  .564642474876397 1.000000000836447     
 .699999999999999  .764842187284566  .644217688610498 1.000000000884446     
 .800000000000000  .696706709347668  .717356092150338 1.000000000897630     
 .900000000000000  .621609968270655  .783326910743251 1.000000000874005     
1.000000000000000  .540302305868092  .841470985777687 1.000000000816025     
1.100000000000000  .453596121425358  .891207360875346 1.000000000725264     
1.199999999999999  .362357754475794  .932039086617606 1.000000000605861     
1.300000000000000  .267498828624604  .963558185897909 1.000000000463203     
1.399999999999999  .169967142900307  .985449730293539 1.000000000300651     
1.500000000000000  .070737201667932  .997494986731004 1.000000000126648     






前ページへ 次ページへ 目 次 へ

(C)COPYRIGHT ISHIOKA KATUSUHIDE 2000,2001