Ver.
オープンソース協議会 2016年 第一回 勉強会
OS のバージョンと PTF
・V7R1
- テクノロジー・リフレッシュ(SF99707)11
- DB2 グループ (SF99071)Level 38
- SI51904:5770WDS Compiler ILE RPGⅣ
- SI58136:5770WDS Compiler ILE RPGⅣ
・V7R2
- テクノロジー・リフレッシュ(SF99717)3
- DB2 グループ(SF99072)Level 9
- SI58137: 5770WDS Compiler ILE RPGⅣ
開発環境
・RDi(Rational Developer for i)v9.5
- Eclipse ベースの IBM i 専用の開発環境
- コード補完、コンパイル、デバッグ、5250、etc ...
・5250 SEU
- 拡張はないが、F13→構文検査:N で利用可能
・テキストエディター
- 豊富なエディターが利用可能
- ファイルの CCSID は 5035 へ要変換(CPYとか)
・Orion:5733OPS OPTION 8
- Web版の Eclipse
- フリーフォームRPGのカラーシンタックスが用意されている
- ファイルの CCSID は 5035 へ要変換(CPYとか)
テキストエディター:vim
Orion
フリーフォームRPGの概要
・**free
- ソースがフリーフォームである事を示す
- 1桁目からコーディング可能
・大文字/小文字
- 区別なし(現状と同じ)
・ステートメントの開始
- 演算命令(命令コード)で開始
・ステートメントの終わり
- セミコロン(;)
・コメント
- //
利用可能な仕様書の種類
・制御(H)
・ファイル(F)
・定義(D)
・演算(C)
・プロシージャー(P)
※ 入力(I)、出力(O)は対象外
仕様書の順序
・従来通りの順序
1. 制御(H)
2. ファイル(F)、定義(D)
3. 演算(C)
4. プロシージャー(P)
・抜けは構わないが順序は守る
制御(H)仕様書
・構文
・解説
CTL-OPT {keyword1 keyword2 ..};
• 構文
⁃ CTL-OPT で開始
⁃ keyword :
⁃ ゼロから複数のキーワード ⁃ 複数キーワードはブランクで区切る• 備考
⁃ 利用可能なキーワードは従来と同じ
⁃ 複数の制御ステートメントへの分割も可
ファイル(F)仕様書
・構文
・解説
DCL-F fileName {keyword1 keyword2 ..};
• 構文
⁃ DCL-F で開始
⁃ fileName : ファイル名
⁃ keyword :
⁃ ゼロから複数のキーワード ⁃ ファイル装置キーワードの指定はキーワードの先頭に指定 ⁃ 複数キーワードはブランクで区切るファイル(F)仕様書
・主なキーワードと定位置フォームとの比較
定位置フォーム 定位置桁 指定方法 備考
ファイル・タイプ 17 USAGE キーワードの パラメーター *input, *output, *update *delete
ファイル指定 18 なし(全手順のみ) RPGサイクルはサポートされない ファイルに追加 20 USAGE(*OUTPUT) キーワード
ファイル形式 22 装置キーワードの パラメーター *ETX , レコード長
レコードアドレス・タイプ 34 KEYED キーワード 指定しない場合、RRN 順
定義(D)仕様書
・利用可能な定義
- 独立フィールド(変数)
- 名前付き固定情報フィールド(定数)
- データ構造
- プロトタイプ
- インターフェイス
独立フィールド(変数)定義
・構文
・解説
DCL-S fieldName keyword1 {keyword2 ..};
• 構文
⁃ DCL-S で開始
⁃ filedName : フィールド(変数)名
⁃ keyword :
⁃ ゼロから複数のキーワード ⁃ データタイプ・キーワードの指定はキーワードの先頭に指定 ⁃ 複数キーワードはブランクで区切る独立フィールド(変数)の定義
・主なデータタイプキーワード
データ・タイプ シンタックス 例 文字 CHAR(len) VARCHAR(len) dcl-s library char(10); dcl-s address varchar(300);パック十進数 PACKED(digits {:decimal}) dcl-s number packed(5);
dcl-s price packed(7:2); ゾーン十進数 ZONED(digits {:decimal}) dcl-s number zoned(5);
dcl-s price zoned(7:2); 標識(ON / OFF value) IND dcl-s isValied ind;
日付 DATE {(format)} dcl-s startDate date;
dcl-s endDate date(*iso); 時刻 TIME {(format)} dcl-s startTime time;
dcl-s endTime time(*hms); タイムスタンプ TIMESTAMP dcl-s current timestamp;
名前付き固定情報フィールド(定数)定義
・構文
・解説
DCL-C constantName value|const(value);
• 構文
⁃ DCL-C で開始
⁃ constantName : 名前付き固定情報(定数)名
⁃ value :
⁃ 値を指定 ⁃ const キーワードによる値の指定も可(同じ意味)データ構造定義
・構文
・解説
DCL-DS dsName {keyword1 keyword2 ..};
{DCL-SUBF} subFieldName keyword1 {keyword2 ..}
END-DS {dsName};
• 構文:データ構造定義の開始と終了
⁃ DCL-DS で開始
⁃ dsName : データ構造名
⁃ keyword :
⁃ ゼロから複数のキーワード ⁃複数キーワードはブランクで区切る⁃ END-DS で終了
⁃ LIKEDS、LIKEREC キーワードを指定したデータ構造は END-DS は指定されないデータ構造定義
・解説2
• 構文:データ構造のサブフィールド定義
⁃ DCL-SUBF で開始(省略可)
⁃ subFieldName : サブフィールド名
⁃ keyword :
⁃ ゼロから複数のキーワード ⁃ データタイプ・キーワードの指定はキーワードの先頭に指定 ⁃複数キーワードはブランクで区切るDCL-DS dsName {keyword1 keyword2 ..};
{DCL-SUBF} subFieldName keyword1 {keyword2 ..} END-DS {dsName};
外部プログラムの呼び出し
・プロトタイプ定義
- 呼び出し側に定義
・V6R1 以前のRPGⅣは呼び出される側にもプロトタイプ定義が必要
- PLIST、PARM と同じ
・パラメーターの数、属性、順番の設定
・インターフェイス定義
- 呼び出される側に定義
- *ENTRY PLIST、PARM と同じ
・パラメーターの数、属性、順番の設定
・定義は一致させる
- パラメーターの数、属性、順番
*PGM
(呼び出す側)
*PGM
(呼び出される側)
プロトタイプ CALLP インターフェイス 一致させるプロトタイプ定義(外部プログラム呼び出し)
・構文
・解説1
dcl-pr externalProgramName extpgm {keyword1 keyword2 ..};
{DCL-PARM} parameterName keyword1 {keyword2 ..}
END-PR {externalProgramName};
• 構文:プロトタイプの開始と終了
⁃ DCL-PR で開始
⁃ ernalProgramName : 外部プログラム名
⁃ EXTPGM キーワード
⁃ keyword :
⁃ ゼロから複数のキーワード ⁃複数キーワードはブランクで区切る⁃ END-PR で終了
呼び出し側
プロトタイプ定義(外部プログラム呼び出し)
・解説2
• 構文:パラメーター定義
⁃ DCL-PARM で開始(省略可)
⁃ subfieldname : サブフィールド名
⁃ keyword :
⁃ ゼロから複数のキーワード ⁃ データタイプ・キーワードの指定はキーワードの先頭に指定 ⁃複数キーワードはブランクで区切る• 備考
⁃ プロトタイプで設定するパラメーター名は変数として利用不可
dcl-pr externalProgramName extpgm {keyword1 keyword2 ..}; {DCL-PARM} parameterName keyword1 {keyword2 ..}
END-PR {externalProgramName};
インターフェイス定義(外部プログラム呼び出し)
・構文
・解説1
DCL-PI interfaceName {keyword1 keyword2 ..};
{DCL-PARM} parameterName keyword1 {keyword2 ..};
END-PI {interfaceName};
• 構文:プロトタイプの開始と終了
⁃ DCL-PI で開始
⁃ interfaceName : インターフェイス名(任意)
⁃ keyword :
⁃ ゼロから複数のキーワード ⁃複数キーワードはブランクで区切る⁃ END-PI で終了
呼び出される側
インターフェイス定義(外部プログラム呼び出し)
・解説2
• 構文:パラメーター定義
⁃ DCL-PARM で開始(省略可)
⁃ subfieldname : サブフィールド名
⁃ keyword :
⁃ ゼロから複数のキーワード ⁃ データタイプ・キーワードの指定はキーワードの先頭に指定 ⁃複数キーワードはブランクで区切る• 備考
⁃ インターフェイスで設定するパラメーター名は変数として利用可
DCL-PI interfaceName {keyword1 keyword2 ..};
{DCL-PARM} parameterName keyword1 {keyword2 ..}; END-PI {interfaceName};
演算(C)仕様書
・構文
・解説
operationCode factor1 factor2 result;
• 構文
⁃ operetionCode : 演算命令
⁃ eval, callp などは省略可⁃ factor1 : 演算項目1
⁃ factor2 : 演算項目2
⁃ result : 結果のフィールド
演算(C)仕様書
・フリーフォームで利用できなくなる演算命令(一部)
演算命令 代用 演算命令 代用
ADD +, += LOOKUP %LOOKUP,%TLOOKUP ADDDUR %YEARS, %MONTHS MOVE EVAL,EVALR
ANDxx AND MOVEA %SUBARR CALL CALLP MOVEL EVAL
CAT + MULT *,*=
CHECK %CHECK MVR %REM COMP -,=,<,<=,>,>=,<> OCCUR %OCCUR
DIV -/、=/、%DEV PARM,PLIST プロトタイプ, インターフェイス
DO FOR SCAN %SCAN
DOUXX DOU SUB -,-=
DOWXX DOW SUBDUR %YEARS、%MONTHS、%DIFF EXTRCT %SUBDT SUBST %SUBST
GOTO LEAVE,LEAVESR,ITER,RETURN TIME %DATE、%TIME、%TIMESTAMP KFLD,KLIST %KDS WHENXX WHEN
演算(C)仕様書
・例:KLIST → %KDS 関数を利用する
プログラムの作成(コンパイル)
・ CRTBNDRPG コマンド
-
デバッグ用ソースコードの組み込み
・
DBGVIEW:*SOURCE
-
IFS のソースファイルを指定する場合
・
SRCSTMF:
・ 例:ソースファイルにコーディング
-
CRTBNDRPG PGM(KIT/PGM010) SRCFILE(KIT/QRPGLESRC)
DBGVIEW(*SOURCE)
・ 例:IFS のストリームファイルにコーディング
-
CRTBNDRPG PGM(KIT/PGM010)
SRCSTMF('/home/kit/qrpglesrc/pgm010')
DBGVIEW(*SOURCE)
ILEについて
・統合化言語環境
(Integrated Language Envionment)
- IBM i におけるプログラム開発の強化を目的として設計された環境
- ツールのセットおよび関連するシステム・サポートを指す
・ILE コンパイラーで作成されたプログラムのみが利用可
- ILE RPG, ILE COBOL, ILE C / C++, ILE CL
・ILE プログラムの構造
- プログラムは、1つ以上のモジュールから成る
・モジュールはバインドされプログラムに結合される
・結合されているため、呼び出しのスピードが速い
・異なる言語で作成されたモジュールもバインド可能
- モジュールは、1つ以上のプロシージャーから成る
・プログラム内部の変数は限定されたスコープ
(後述)で共有される
プログラム(*PGM) モジュール(*MODULE) モジュール(*MODULE) プロシージャー プロシージャー プロシージャーモジュールの構造
・メイン・ソース・セクション
- 最初の行から、最初のプロシージャーまでのソース
・メイン・プロシージャーが含まれる場合がある
・メイン・プロシージャー
- コンパイラーが生成するプロシージャー
- プログラムの入り口点となる
・制御仕様書の NOMAIN 指定で生成なし
・サブ・プロシージャー
- メイン・ソース・セクションのあとに定義する
- C言語などの関数と同じと考えて良い
・実行コードの最小限のグループ
- プロシージャー仕様書で指定する
モジュール(*MODULE) サブ・プロシージャー サブ・プロシージャー メイン・ソース・セクション メイン・プロシージャー変数のスコープ
・グローバール変数
- メイン・ソース・セクションに定義された変数
- 同一モジュール内の全プロシージャーから利用できる
・ローカル変数
- 各プロシージャー内に定義された変数
- 各プロシージャー内でのみ利用できる
モジュール(*MODULE) サブ・プロシージャー 定義仕様書 サブ・プロシージャー 定義仕様書 メイン・ソース・セクション 定義仕様書 メイン・プロシージャー ローカル・ スコープ変数 グローバル・ スコープ変数プロシージャーの構造
・利用可能な仕様書の種類と順序
1. プロシージャー(P)仕様書
2. ファイル(F)仕様書、定義(D)仕様書
3. 演算(C)仕様書
プロシージャー1:内部プロシージャー呼び出し
・呼び出し側と同じモジュール内のプロシージャーを呼び出す
モジュール(*MODULE) サブ・プロシージャー サブ・プロシージャー メイン・ソース・セクション メイン・プロシージャープロシージャー(P)仕様書:内部プロシージャー呼び出し
・構文
・解説
DCL-PROC procedureName;
... procedure code ...
END-PROC {procedureName};
• 構文:プロシージャーの開始と終了
⁃ DCL-PROC で開始
⁃ procedureName : プロシージャー名(任意)
⁃ END-PROC で終了
定義(D)仕様書:内部プロシージャー呼び出し
・呼び出される側にインターフェイスを定義する
・インターフェイスには、外部から呼び出される情報を定義
- パラメーターの数や属性
- 戻り値の属性
・呼び出される側のプログラムに定義する
・プロトタイプは不要
- V7R1以降、内部プロシージャー呼び出しにおけるプロトタイプは不要
・呼び出し側、呼び出される側ともにコンパイラーが自動で生成
モジュール(*MODULE)プロシージャー
(呼び出す側)
プロシージャー
(呼び出される側)
インターフェイス 呼び出し定義(D)仕様書:インターフェイス
・構文
・解説1
DCL-PI interfaceName {keyword1 keyword2 ..};
{DCL-PARM} parameterName keyword1 {keyword2 ..};
END-PI {interfaceName};
• 構文:プロトタイプの開始と終了
⁃ DCL-PI で開始
⁃ interfaceName : インターフェイス名
⁃ プロシージャー名と一致させる
⁃ keyword :
⁃ ゼロから複数のキーワード ⁃ 戻り値を設定する場合、データタイプ キーワードをキーワードの先頭に指定する ⁃複数キーワードはブランクで区切る⁃ END-PI で終了
定義(D)仕様書:インターフェイス
・解説2
• 構文:パラメーター定義
⁃ DCL-PARM で開始(省略可)
⁃ subfieldname : サブフィールド名
⁃ keyword :
⁃ ゼロから複数のキーワード ⁃ データタイプ・キーワードの指定はキーワードの先頭に指定 ⁃ 複数キーワードはブランクで区切る• 備考
⁃ インターフェイスで設定する
パラメーター名は変数として利用可
プロシージャー1:内部プロシージャー呼び出し
・呼び出し方
{CALLP} procedureName ({parameter1 parameer2 ..});
モジュール(*MODULE)
サブ・プロシージャー メイン・ソース・セクション
メイン・プロシージャー
プロシージャー2:外部プロシージャー呼び出し
・バインドされた別モジュールのプロシージャーを呼び出す
プログラム(*PGM) モジュール(*MODULE) サブ・プロシージャー サブ・プロシージャー メイン・ソース・セクション メイン・プロシージャー モジュール(*MODULE) サブ・プロシージャー サブ・プロシージャー メイン・ソース・セクション メイン・プロシージャープロシージャー(P)仕様書:外部プロシージャー呼び出し
・構文
・解説
DCL-PROC procedureName EXPORT;
... procedure code ...
END-PROC {procedureName};
• 構文:プロシージャーの開始と終了
⁃ DCL-PROC で開始
⁃ procedureName : プロシージャー名(任意)
⁃ EXPORT キーワードを指定
⁃ END-PROC で終了
定義(D)仕様書:外部プロシージャー呼び出し
・呼び出し側にプロトタイプを定義する
・呼び出される側にプロトタイプを定義する
・呼び出される側にインターフェイスを定義する
・プロトタイプ、インターフェイスには、外部から呼び出されるた
めの情報を定義
- パラメーターの数や属性
- 戻り値の属性
プロシージャー
(呼び出す側)
(呼び出される側)
プロシージャー
プロトタイプ 呼び出し 同じ定義 インターフェイス プロトタイプ定義(D)仕様書:プロトタイプ
・構文
・解説1
dcl-pr externalProcedureName {keyword1 keyword2 ..};
{DCL-PARM} parameterName keyword1 {keyword2 ..}
END-PR {externalProcedureName};
• 構文:プロトタイプの開始と終了
⁃ DCL-PR で開始
⁃ ernalProcedureName : プロシージャー名
⁃ プロシージャー名と一致させる⁃ keyword :
⁃ ゼロから複数のキーワード ⁃ 戻り値を指定する場合、データタイプ・キーワード をキーワードの先頭に指定する ⁃ 複数キーワードはブランクで区切る⁃ END-PR で終了
呼び出し側
呼び出される側
定義(D)仕様書:プロトタイプ
・解説2
• 構文:パラメーター定義
⁃ DCL-PARM で開始(省略可)
⁃ subfieldname : サブフィールド名
⁃ keyword :
⁃ ゼロから複数のキーワード ⁃ データタイプ・キーワードの指定はキーワードの先頭に指定 ⁃複数キーワードはブランクで区切る• 備考
⁃ プロトタイプで設定するパラメーター名
は変数として利用不可
dcl-pr externalProcedureName {keyword1 keyword2 ..}; {DCL-PARM} parameterName keyword1 {keyword2 ..} END-PR {externalProgramName};
定義(D)仕様書:インターフェイス
・構文
・解説1
DCL-PI interfaceName {keyword1 keyword2 ..};
{DCL-PARM} parameterName keyword1 {keyword2 ..};
END-PI {interfaceName};
• 構文:プロトタイプの開始と終了
⁃ DCL-PI で開始
⁃ interfaceName : インターフェイス名
⁃ プロシージャー名と一致させる
⁃ keyword :
⁃ ゼロから複数のキーワード ⁃ 戻り値を設定する場合、データタイプ キーワードをキーワードの先頭に指定する ⁃複数キーワードはブランクで区切る⁃ END-PI で終了
呼び出される側
定義(D)仕様書:インターフェイス
・解説2
• 構文:パラメーター定義
⁃ DCL-PARM で開始(省略可)
⁃ subfieldname : サブフィールド名
⁃ keyword :
⁃ ゼロから複数のキーワード ⁃ データタイプ・キーワードの指定はキーワードの先頭に指定 ⁃ 複数キーワードはブランクで区切る• 備考
⁃ インターフェイスで設定する
パラメーター名は変数として利用可
呼び出される側
プロシージャー2:外部プロシージャー呼び出し
・呼び出し方
{CALLP} procedureName ({parameter1 parameer2 ..});
呼び出し側
(モジュールA)
呼び出される側
(モジュールB)
ILE プログラムの作成
・ソースコードから直接プログラム(*PGM)は作成できない
・以下の手順で作成
1. モジュールの作成:CRTRPGMOD
・ ソースコードからコンパイルを行い、モジュール(*MODULE) を作成する
・ モジュールを実行することはできない
2. プログラムの作成:CRTPGM
・ 作成されたモジュールを結合(バインド)しプログラムを作成する
・ プログラムの開始点となるモジュールを指定する
* M O D U L E * M O D U L E * M O D U L E I L E R P G ソ ー ス コ ー ド * P G M I L E C O B O L ソ ー ス コ ー ド I L E C ソ ー ス コ ー ド CRTRPGMOD CRTCBLMOD CRTCMOD CRTPGM CRTBNDRPGモジュールの作成(コンパイル)
1. CRTRPGMOD
-
ソースコードからコンパイルを行い、モジュール(*MODULE)を作成
-
デバッグ用ソースコードの組み込み
・
DBGVIEW パラメーターに *SOURCE を指定
-
IFS のソースファイルを指定する場合
・
SRCSTMF パラメーターに指定
・ 例
-
CRTRPGMOD MODULE(KIT/MOD010) SRCFILE(KIT/QRPGLESRC)
DBGVIEW(*SOURCE)
-
CRTRPGMOD MODULE(KIT/MOD020) SRCFILE(KIT/QRPGLESRC)
DBGVIEW(*SOURCE)
* M O D U L E I L E R P G ソ ー ス コ ー ト ゙ M O D 0 1 0 * P G M CRTRPGMOD CRTPGM * M O D U L E I L E R P G ソ ー ス コ ー ト ゙ M O D 0 2 0 CRTRPGMODプログラムの作成(バインド)
2. CRTPGM
-
作成済みのモジュールを結合(バインド)し、プログラム(*PGM)を作成
-
モジュールの指定
・
MODULE パラメーターに指定(複数可)
-
プログラム入口プロシージャーモジュールの指定
・
ENTMOD パラメーターに指定(初期値:*FIRST)
・ 例
-
CRTPGM PGM(KIT/PGM010)
MODULE(KIT/MOD010 KIT/MOD020)
* M O D U L E I L E R P G ソ ー ス コ ー ト ゙ M O D 0 1 0 * P G M CRTRPGMOD CRTPGM * M O D U L E I L E R P G ソ ー ス コ ー ト ゙ M O D 0 2 0 CRTRPGMODプログラムの更新
・UPDPGM
- 作成済み *PGM にバインドされている *MODULE を更新した際
に実行する
・例
- CRTRPGMOD MODULE(KIT/MOD020)
SRCFILE(KIT/QRPGLESRC) DBGVIEW(*SOURCE)
- UPDPGM PGM(KIT/PMG010) MODULE(KIT/MOD020)
* M O D U L E I L E R P G ソ ー ス コ ー ト ゙ M O D 0 1 0 * P G M CRTRPGMOD CRTPGM * M O D U L E I L E R P G ソ ー ス コ ー ト ゙ M O D 0 2 0 CRTRPGMOD