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