iMagazine最新号(2009年 No.10)の「今すぐ役立つIBM i 技術6本」の中で、「RPGはここまで進化した!」という記事があります。記事では近年のILE-RPGの新機能を紹介していますが、全部はさすがに書ききれません。
ILE-RPG自体の機能拡張については記事中に参照先が記載されているので、ここで多少Tips的な部分を補足しておきます。
.
では、小ネタをいくつか。
型変換は最小に
ILE-RPGでは様々なデータ・タイプが利用できます。数値型だけでも従来のパック/ゾーン十進数に加え、2進、浮動小数点、整数が追加されています。EVALやフリーフォーマットの計算式の中ではこれらを意識せず混在して使用できます。もちろん、例えばパック十進数を整数型の変数に代入すると内部では暗黙的に型の変換が行なわるます。これは非常に便利な機能であると同時に、型変換のオーバーヘッドが発生する事を意味する事に注意してください。
通常の業務処理では、ほとんどの数値をパック十進数でコーディングするでしょう。また、数千回程度の型変換ではほとんど目に見えるパフォーマンスの影響はありません。しかし、数百万回のループを行なうような処理では、ループの内部での型変換の回数を最小にするとパフォーマンスが向上するでしょう。
演算途中の精度
従来のRPGでは1演算命令は1行を必要とし、その度に有効桁で切り捨てが行なわれていました。ILE-RPGでEVALや/FREEを利用して1行に複数の演算子を使用する場合は、他の言語同様に中間結果の精度を考慮する必要があります。下記の例のように、単純に計算式を書き直すと従来と異なる結果となる場合があります。この問題を回避するには%INT組み込み関数を使用するなどの配慮が必要になります。下記のソースはそのような例を示します。
0001.00 Dint S 10I 0 INZ(5)
0002.00 Dresult1 S LIKE(int)
0003.00 Dresult2 S LIKE(int)
0004.00 Dresult2_char S 52
0005.00 *
0006.00 /FREE
0007.00 result1 = int / 2 * 10;
0008.00 DSPLY (%EDITC(result1 : 'J'));
0009.00 /END-FREE
0010.00 *
0011.00 C int DIV 2 result2
0012.00 C MULT 10 result2
0013.00 C EVAL result2_char = %EDITC(result2 : 'J')
0014.00 C result2_char DSPLY
0015.00 C EVAL *INLR = *ON
> CRTBNDRPG PGM(EX5)
> CALL PGM(EX5)
DSPLY 25
DSPLY 20
ACTGRPの指定
ILE-RPGの機能を活用したプログラムでは、CRTBNDRPG/CRTPGMコマンドでDFTACTGRP (省略時の活動化グループ )パラメーターに*NOを指定する必要があります。この場合、ACTGRP(活動化グループ)を指定しますが、この値に*CALLERを指定すると、*NEWを指定した場合よりパフォーマンスが大きく向上します。特に、外部より頻繁に呼び出されるプログラム(CGIプログラムなど)は*CALLERの利用を考慮すべきでしょう。 なお、活動化グループの詳細については、マニュアル「ILE 概念」を参照してください。
しかしILE-RPGはIBM i でしか利用できないため、他のプラットフォームしか使ったことの無い方々にはなじみが無く、とっつきにくいかもしれません。また、昔からRPGを使っている方々も、プログラムの品質や効率を向上させるために最新機能を理解&活用しているかは疑問です。
最近IBM i のGUI化に関する興味深い記事を読みましたが、新しい機能を前向きに利用して価値を高めていきたい物です。
ここに書かれている内容は私の所属する会社、組織とは関係ありません。 内容を誰かが保証する物ではありません。
この記事にはトラックバック・コメントがありません。
コメントは投稿者の責任においてなされるものであり,サイト管理者は責任を負いません。