ILE-RPG 株式会社中部システム
ILEのアーキテクチャー ILE( 統合言語化環境)とは、コンピュータ言語間の垣根を越えて、お互いをサービスとして、扱うための開発&実行環境です。 ILEの対応言語 ・ RPG-IV 、 ILE-CL 、 ILE-COBOL 、 C 、 C++… 。
OPM の世界・全体図 RDBMS Web CSV? Text? CALL RPG-III CL ----  IBM i  ---- ftp P-com CSV? Text? Pc Command ? ? ?
ILE の世界・全体図 RDBMS Java Web   XML CALLP SOAP REST   XML RPG-IV CLLE C C++ ----  IBM i  ---- CALLP %XML XML-SAX XML-INTO ちなみに... RDBMS 名はご存知ですか?
RPG -Ⅳ の特徴その1 第1ステップは、プログラムでは無くモジュール OPM ( RPG400 )では、 CRTRPGPGM で作成されたオブジェクトをプログラムと呼んでいます。しかし ILE では、プログラム作成にあたって 2ステップ が必要です。 まず1ステップ目は、「 CRTRPGMOD 」です。作成されたオブジェクトは、 モジュール と呼ばれます。 次に2ステップ目は「  CRTPGM 」です。この時、1ステップ目で作成された、 モジュール を指定します。追加のモジュールを指定しても構いません。ここで作成されたオブジェクトがプログラムにあたります。 バインド とも言います。 この2つのコマンドを同時に行うのが「 CRTBNDRPG 」です。
RPG -Ⅳ オブジェクト図 モジュール A モジュールB CRTRPGMOD CRTBNDRPG CRTPGM サービス プログラム ・ QRPGSRC ・ QRPGLESRC メンバーB メンバーA プログラム A A プログラム B B プログラム C A B
RPG -Ⅳ の特徴その2 スタティック(静的)リンク OPM ( RPG400 )では、「 CALL 」で外部プログラムを呼び出す事が出来 ます。これは、 ダイナミック(動的)リンク による呼び出しです。知ってい ましたか?では、 スタティックリンク とは何でしょう? メリット ・  ダイナミックに比べてオーバーヘッドが無いため、実効速度が速い。 デメリット ・  プログラム名では、元のモジュールが判別しにくい。 (DSPPGM や DSPPGMREF で見ればわかるが...) ・  モジュールの変更は、リバインドしない限り反映されない。 ・  上記理由より、改変の可能性が無い処理にしか、静的リンクは使いづらい。    DLL ってご存知ですか?  そうです。コンパイル時のリンクという事です。先程、「 CRTPGM 」で  モジュールが、追加出来ると言ったのを覚えていますか?これはまさ  に スタティックリンク なのです。
静的リンクに対する見解 スタティック(静的)リンクは使うべき?   スタティックリンクは、高速であり、魅力的です。しかし、昨今の“ IBM  i”の処理能力を考えれば、高速性を追求する処理以外は、 ダイナミックリンクで十分 だと考えます。何故なら、 OPM のダイナミックリンクと ILE のダイナミックリンクでは、 圧倒的に ILE のパフォーマンスの方が優れている からです。   私は、むしろ スタティックリンク を使うことによる、 デメリット の方が、開発生産性の妨げになるのでは?と思います。   では、本当にただのダイナミックリンク( CALL )だけでいいのでしょうか?その答えは「N o 」です。後述する “サービスプログラム” を新たなダイナミックリンクの位置づけとして、学ぶ必要があるからです。でもそのお話は、またの機会に...。
ILE のパワーを検証 ILE の処理能力やいかに?    ILE の動的リンクが「 速い 」と言うが、どれだけ速いか?   テストしてみましょう。<ILESRC/QRPGSRC( SPRXXX )>    テスト内容: 1047 バイトのレコードを 1 万件追加&更新     SPR100 ( OPM 単体): 2前後秒     SPR100LE ( ILE 単体): 2前後秒     SPR000 ( OPM 外部コール): 30前後秒     SPR000LE ( ILE サービス PGM 外部コール): 2秒前後    ※単体同士の処理は、変わらないが、外部呼出しに     おいては、 OPM の処理能力を遥かに上回る 。     逆に外部呼出しと単体処理性能に差が見られない     という事は、サービスを切り出しても、システム全体の     パフォーマンスには影響しないという事が考えられるのでは     ないでしょうか?
RPG-IV のコーディング例 H DATEDIT(*YMD) H**************************************************************** H**  PROGRAM-ID : SPR000LE  LANGUAGE : RPG-IV  ** H**  AUTHOR  : CSC  WRITTEN  : 09/04/01  Y.USHIDA  ** H**  UPDATE  : ##/##/##  ########  ** H**  PROGRAM DESCRIPTION  ** H**  スピードテスト  ** H**************************************************************** F* < テストデータ > D*-----<< メインプロシージャ・プロトタイプ定義 >>-----* D*-----<< サブプロシージャ・プロトタイプ定義 >>-----* DEX_LOOP  PR D P@KBN  1A  VALUE D P@DATE  8S 0 D P@TIME  6S 0 D P@IX  9S 0 C*-?-----------------------------------------------------------------* D WDATE8  S  8S 0 D WTIME6  S  6S 0 D W@MAX  S  9S 0 D IX  S  LIKE(W@MAX) C*-?-----------------------------------------------------------------* C*-?--------<<  FREE FORMAT  >>-------* C*-?-----------------------------------------------------------------* /FREE W@MAX  = 10000  ; WDATE8 = %DEC(%DATE() : *ISO ) ;  // 8 桁日付 WTIME6 = %DEC(%TIME() ) ;  // 6 時間 // レコード追加 FOR IX  = 1 TO W@MAX ; EX_LOOP('A':WDATE8:WTIME6:IX) ; ENDFOR ; // レコード更新 FOR IX  = 1 TO W@MAX ; EX_LOOP('U':WDATE8:WTIME6:IX) ; ENDFOR ; *INLR = *ON ; RETURN  ; /END-FREE  H NOMAIN FSPA00F  UF A E  K DISK DEX_LOOP  PR D P@KBN  1A  VALUE D P@DATE  8S 0 D P@TIME  6S 0 D P@IX  9S 0 PEX_LOOP  B  EXPORT DEX_LOOP  PI D P@KBN  1A  VALUE D P@DATE  8S 0 D P@TIME  6S 0 D P@IX  9S 0 D SPAKEY  DS  LIKEREC(SPA00FR : *KEY) /FREE IF P@KBN = 'A'  ; // レコード追加 CLEAR SPA00FR  ; SPA001 = 'RPGILEA' ; SPA002 = P@DATE  ; SPA003 = P@TIME  ; SPA004 = P@IX  ; SPA005 = %DEC(%DATE() : *ISO ) ;  // 8 桁日付 SPA006 = %DEC(%TIME() ) ;  // 6 時間 SPA011 = *ALL'*'  ; WRITE SPA00FR  ; ENDIF  ; IF P@KBN = 'U'  ;  // レコード更新 SPAKEY.SPA001 = 'RPGILEA' ; SPAKEY.SPA002 = P@DATE  ; SPAKEY.SPA003 = P@TIME  ; SPAKEY.SPA004 = P@IX  ; CHAIN %KDS(SPAKEY) SPA00FR; IF NOT %FOUND  ; RETURN  ; ENDIF  ; IF %REM( P@IX : 2 ) = 0 ; SPA005 = %DEC(%DATE() : *ISO ) ;  // 8 桁日付 SPA006 = %DEC(%TIME() ) ;  // 6 時間 SPA011 = *ALL'-'  ; ENDIF  ; UPDATE SPA00FR  ; ENDIF  ; RETURN  ; /END-FREE P  E
RPG-IV とIIIを比較 ------------------------  前   略  ------------------------------ C  MOVE *BLANK  POEDDT C  MOVE *BLANK  POYOBI C  MOVE *BLANK  PORTCD C* 処理 C  Z-ADD*ZERO  #SYMD C  MOVE PIDATE  WDAT  60 C  MOVE WDAT  #SYMD C  PIFLG  IFEQ '1'  >--+ C  EXSR @DYCHK  | C  END  <--+ C  PIFLG  IFEQ '2'  >--+ C  EXSR @DYCHK  | C  EXSR @YOBI  | C  END  <--+ C  PIFLG  IFEQ '3'  >--+ C  EXSR @PLAS C  EXSR @DYCHK  | C  EXSR @YOBI  | C  END  <--+ C* C  SETON  LR C  RETRN C**************************************************************** C**  @DYCHK:  日付チェック  ** C**************************************************************** C* C  @DYCHK  BEGSR C* 西暦セット C  #Y  IFGE 40  >--+ C  MOVEL19  #SYMD  | C  ELSE  + C  MOVEL20  #SYMD  | C  END  <--+ C  MOVEL#SYMD  PODATE  | C* うるう年と平年の検索(2月の末日セット) C  #YY  DIV  4  WYS  20 ------------------------  後   略  ------------------------------ RPG-III = 170 ステップ C*-?-----------------------------------------------------------------* C*-?--------<<  FREE FORMAT  >>-------* C*-?-----------------------------------------------------------------* /FREE // 日付チェック TARGET = 090402 ; TEST(DE) *YMD TARGET ; IF %ERROR() ; RETURN FALSE ; ELSE  ; RETURN TRUE  ; ENDIF ; // 6桁->8桁変換 RETURN  %DEC(%DATE(TARGET : *MDY) :*ISO) ; // 日付増分 RETURN %DEC(%DATE(TARGET:*MDY) + %DAYS(90) : *ISO ) ; // 曜日の算出(数値の場合) RETURN WEEK(%REM(%DIFF(%DATE(TARGET:*YMD) :D'1899-12-30':*DAYS):7)); RETURN  ; /END-FREE RPG-IV = 20 ステップ ※ 末日求める処理は無い 日付サブルーチンの III と IV のメインコードの比較
RPG -Ⅳ の特徴その3 サービスプログラム(バインディングソース)   (C関数呼び出し、Javaクラス呼び出し、 etc ...) 活動化グループ D仕様書    (データ構造体、可変長フィールド、 etc ...) プロトタイプ・プロシージャ   (メインプロシージャ、サブプロシージャ) 自由形式構文(フリーフォーマット) BIF(Bild In Function)  Webに対するCGIになれる(Webサービス・SOA)
RPG -Ⅳ を選ぶ理由 1.強力な言語環境を備えている   ( XML などの外部連携・他言語呼び出し機能、 BIF 等) 2.最適化された処理能力を備えている    (活動化グループ) 3. RPG-III は10年後必ず存在すると言い切れるか?    (必ずなくなるとも言い切れないが、あるとも言い切れない) 4. IBM の RPG 開発は、バージョン IV しかしていない   (特に自由形式構文に偏っている) 5. CVTRPGSRC 使えば、 III と IV を容易に比較できる   (新たに覚えるとしたら一番覚えやすくないですか?) 6.この先 RPG-IV 限定のジョブが有った場合に取り逃がす可能性
    お わ り ご静聴ありがとうございました。

ILE-RPG Study 001

  • 1.
  • 2.
  • 3.
    OPM の世界・全体図 RDBMSWeb CSV? Text? CALL RPG-III CL ---- IBM i ---- ftp P-com CSV? Text? Pc Command ? ? ?
  • 4.
    ILE の世界・全体図 RDBMSJava Web   XML CALLP SOAP REST   XML RPG-IV CLLE C C++ ---- IBM i ---- CALLP %XML XML-SAX XML-INTO ちなみに... RDBMS 名はご存知ですか?
  • 5.
    RPG -Ⅳ の特徴その1第1ステップは、プログラムでは無くモジュール OPM ( RPG400 )では、 CRTRPGPGM で作成されたオブジェクトをプログラムと呼んでいます。しかし ILE では、プログラム作成にあたって 2ステップ が必要です。 まず1ステップ目は、「 CRTRPGMOD 」です。作成されたオブジェクトは、 モジュール と呼ばれます。 次に2ステップ目は「 CRTPGM 」です。この時、1ステップ目で作成された、 モジュール を指定します。追加のモジュールを指定しても構いません。ここで作成されたオブジェクトがプログラムにあたります。 バインド とも言います。 この2つのコマンドを同時に行うのが「 CRTBNDRPG 」です。
  • 6.
    RPG -Ⅳ オブジェクト図モジュール A モジュールB CRTRPGMOD CRTBNDRPG CRTPGM サービス プログラム ・ QRPGSRC ・ QRPGLESRC メンバーB メンバーA プログラム A A プログラム B B プログラム C A B
  • 7.
    RPG -Ⅳ の特徴その2スタティック(静的)リンク OPM ( RPG400 )では、「 CALL 」で外部プログラムを呼び出す事が出来 ます。これは、 ダイナミック(動的)リンク による呼び出しです。知ってい ましたか?では、 スタティックリンク とは何でしょう? メリット ・ ダイナミックに比べてオーバーヘッドが無いため、実効速度が速い。 デメリット ・ プログラム名では、元のモジュールが判別しにくい。 (DSPPGM や DSPPGMREF で見ればわかるが...) ・ モジュールの変更は、リバインドしない限り反映されない。 ・ 上記理由より、改変の可能性が無い処理にしか、静的リンクは使いづらい。    DLL ってご存知ですか?  そうです。コンパイル時のリンクという事です。先程、「 CRTPGM 」で  モジュールが、追加出来ると言ったのを覚えていますか?これはまさ  に スタティックリンク なのです。
  • 8.
    静的リンクに対する見解 スタティック(静的)リンクは使うべき?   スタティックリンクは、高速であり、魅力的です。しかし、昨今の“IBM  i”の処理能力を考えれば、高速性を追求する処理以外は、 ダイナミックリンクで十分 だと考えます。何故なら、 OPM のダイナミックリンクと ILE のダイナミックリンクでは、 圧倒的に ILE のパフォーマンスの方が優れている からです。   私は、むしろ スタティックリンク を使うことによる、 デメリット の方が、開発生産性の妨げになるのでは?と思います。   では、本当にただのダイナミックリンク( CALL )だけでいいのでしょうか?その答えは「N o 」です。後述する “サービスプログラム” を新たなダイナミックリンクの位置づけとして、学ぶ必要があるからです。でもそのお話は、またの機会に...。
  • 9.
    ILE のパワーを検証 ILEの処理能力やいかに?    ILE の動的リンクが「 速い 」と言うが、どれだけ速いか?   テストしてみましょう。<ILESRC/QRPGSRC( SPRXXX )>    テスト内容: 1047 バイトのレコードを 1 万件追加&更新    SPR100 ( OPM 単体): 2前後秒    SPR100LE ( ILE 単体): 2前後秒    SPR000 ( OPM 外部コール): 30前後秒    SPR000LE ( ILE サービス PGM 外部コール): 2秒前後    ※単体同士の処理は、変わらないが、外部呼出しに     おいては、 OPM の処理能力を遥かに上回る 。     逆に外部呼出しと単体処理性能に差が見られない     という事は、サービスを切り出しても、システム全体の     パフォーマンスには影響しないという事が考えられるのでは     ないでしょうか?
  • 10.
    RPG-IV のコーディング例 HDATEDIT(*YMD) H**************************************************************** H** PROGRAM-ID : SPR000LE LANGUAGE : RPG-IV ** H** AUTHOR : CSC WRITTEN : 09/04/01 Y.USHIDA ** H** UPDATE : ##/##/## ######## ** H** PROGRAM DESCRIPTION ** H** スピードテスト ** H**************************************************************** F* < テストデータ > D*-----<< メインプロシージャ・プロトタイプ定義 >>-----* D*-----<< サブプロシージャ・プロトタイプ定義 >>-----* DEX_LOOP PR D P@KBN 1A VALUE D P@DATE 8S 0 D P@TIME 6S 0 D P@IX 9S 0 C*-?-----------------------------------------------------------------* D WDATE8 S 8S 0 D WTIME6 S 6S 0 D W@MAX S 9S 0 D IX S LIKE(W@MAX) C*-?-----------------------------------------------------------------* C*-?--------<< FREE FORMAT >>-------* C*-?-----------------------------------------------------------------* /FREE W@MAX = 10000 ; WDATE8 = %DEC(%DATE() : *ISO ) ; // 8 桁日付 WTIME6 = %DEC(%TIME() ) ; // 6 時間 // レコード追加 FOR IX = 1 TO W@MAX ; EX_LOOP('A':WDATE8:WTIME6:IX) ; ENDFOR ; // レコード更新 FOR IX = 1 TO W@MAX ; EX_LOOP('U':WDATE8:WTIME6:IX) ; ENDFOR ; *INLR = *ON ; RETURN ; /END-FREE H NOMAIN FSPA00F UF A E K DISK DEX_LOOP PR D P@KBN 1A VALUE D P@DATE 8S 0 D P@TIME 6S 0 D P@IX 9S 0 PEX_LOOP B EXPORT DEX_LOOP PI D P@KBN 1A VALUE D P@DATE 8S 0 D P@TIME 6S 0 D P@IX 9S 0 D SPAKEY DS LIKEREC(SPA00FR : *KEY) /FREE IF P@KBN = 'A' ; // レコード追加 CLEAR SPA00FR ; SPA001 = 'RPGILEA' ; SPA002 = P@DATE ; SPA003 = P@TIME ; SPA004 = P@IX ; SPA005 = %DEC(%DATE() : *ISO ) ; // 8 桁日付 SPA006 = %DEC(%TIME() ) ; // 6 時間 SPA011 = *ALL'*' ; WRITE SPA00FR ; ENDIF ; IF P@KBN = 'U' ; // レコード更新 SPAKEY.SPA001 = 'RPGILEA' ; SPAKEY.SPA002 = P@DATE ; SPAKEY.SPA003 = P@TIME ; SPAKEY.SPA004 = P@IX ; CHAIN %KDS(SPAKEY) SPA00FR; IF NOT %FOUND ; RETURN ; ENDIF ; IF %REM( P@IX : 2 ) = 0 ; SPA005 = %DEC(%DATE() : *ISO ) ; // 8 桁日付 SPA006 = %DEC(%TIME() ) ; // 6 時間 SPA011 = *ALL'-' ; ENDIF ; UPDATE SPA00FR ; ENDIF ; RETURN ; /END-FREE P E
  • 11.
    RPG-IV とIIIを比較 ------------------------ 前   略 ------------------------------ C MOVE *BLANK POEDDT C MOVE *BLANK POYOBI C MOVE *BLANK PORTCD C* 処理 C Z-ADD*ZERO #SYMD C MOVE PIDATE WDAT 60 C MOVE WDAT #SYMD C PIFLG IFEQ '1' >--+ C EXSR @DYCHK | C END <--+ C PIFLG IFEQ '2' >--+ C EXSR @DYCHK | C EXSR @YOBI | C END <--+ C PIFLG IFEQ '3' >--+ C EXSR @PLAS C EXSR @DYCHK | C EXSR @YOBI | C END <--+ C* C SETON LR C RETRN C**************************************************************** C** @DYCHK: 日付チェック ** C**************************************************************** C* C @DYCHK BEGSR C* 西暦セット C #Y IFGE 40 >--+ C MOVEL19 #SYMD | C ELSE + C MOVEL20 #SYMD | C END <--+ C MOVEL#SYMD PODATE | C* うるう年と平年の検索(2月の末日セット) C #YY DIV 4 WYS 20 ------------------------ 後   略 ------------------------------ RPG-III = 170 ステップ C*-?-----------------------------------------------------------------* C*-?--------<< FREE FORMAT >>-------* C*-?-----------------------------------------------------------------* /FREE // 日付チェック TARGET = 090402 ; TEST(DE) *YMD TARGET ; IF %ERROR() ; RETURN FALSE ; ELSE ; RETURN TRUE ; ENDIF ; // 6桁->8桁変換 RETURN %DEC(%DATE(TARGET : *MDY) :*ISO) ; // 日付増分 RETURN %DEC(%DATE(TARGET:*MDY) + %DAYS(90) : *ISO ) ; // 曜日の算出(数値の場合) RETURN WEEK(%REM(%DIFF(%DATE(TARGET:*YMD) :D'1899-12-30':*DAYS):7)); RETURN ; /END-FREE RPG-IV = 20 ステップ ※ 末日求める処理は無い 日付サブルーチンの III と IV のメインコードの比較
  • 12.
    RPG -Ⅳ の特徴その3サービスプログラム(バインディングソース)   (C関数呼び出し、Javaクラス呼び出し、 etc ...) 活動化グループ D仕様書    (データ構造体、可変長フィールド、 etc ...) プロトタイプ・プロシージャ   (メインプロシージャ、サブプロシージャ) 自由形式構文(フリーフォーマット) BIF(Bild In Function) Webに対するCGIになれる(Webサービス・SOA)
  • 13.
    RPG -Ⅳ を選ぶ理由1.強力な言語環境を備えている   ( XML などの外部連携・他言語呼び出し機能、 BIF 等) 2.最適化された処理能力を備えている    (活動化グループ) 3. RPG-III は10年後必ず存在すると言い切れるか?    (必ずなくなるとも言い切れないが、あるとも言い切れない) 4. IBM の RPG 開発は、バージョン IV しかしていない   (特に自由形式構文に偏っている) 5. CVTRPGSRC 使えば、 III と IV を容易に比較できる   (新たに覚えるとしたら一番覚えやすくないですか?) 6.この先 RPG-IV 限定のジョブが有った場合に取り逃がす可能性
  • 14.