CL

87. ILE-CLP の正しいコンパイル方法

CRTBNDCL によるコンパイルの都度に結果がフラフラと異なるような不思議な
現象に悩まされたことはないだろうか ?
コンパイルしたはずなのに、まるで結果が変わらないとかいう現象である。
もしそのような現象に出くわしたとしたら多くの原因は活動化グループ
*NEW ではなく *DFTACTGRP になっていることに起因している可能性が高い。

ILE-CLPソースをコンパイルするときは CRTCLMOD + CRTPGM でコンパイルするか、
または多くは CRTBNDCL コマンドによってコンパイルするのが一般的である。
省略値によるコンパイルであれば

CRTBNDCL PGM(MYLIB/MYPGM) SRCFILE(PGMRLIB/QCLLESRC) AUT(*ALL)

のようにして コンパイルする。
ところがこのコンパイルの結果を DSPPGM コマンドで確認してみると


                              プログラム情報の表示      
                                                                    画面 7 の 1
  プログラム . . . . . . :   TESTLPAR      ライブラリー . . . . . :   TEST.COM  
  所有者 . . . . . . . . :   QTR                                                
  プログラム属性 . . . . :   CLLE                                               
  詳細 . . . . . . . . . :   *BASIC                                             

  プログラム作成情報 :                                                          
    プログラム作成日/時刻 . . . . . . . . . . . . :   14/10/19  11:13:08       
    プログラムのタイプ . . . . . . . . . . . . . . :   ILE                      
    プログラム入力プロシージャー・モジュール . . . :   TESTLPAR                 
      ライブラリー   . . . . . . . . . . . . . . . :     QTEMP                  
    活動化グループ属性 . . . . . . . . . . . . . . :   *DFTACTGRP               
    共用活動化グループ . . . . . . . . . . . . . . :   *NO                      
    ユーザー・プロファイル . . . . . . . . . . . . :   *USER                    
    借用権限の使用 . . . . . . . . . . . . . . . . :   *YES                     
    コード化文字セット ID  . . . . . . . . . . . . :   65535                    
    モジュールの数 . . . . . . . . . . . . . . . . :   1                        
  

のように活動化グループ属性: *DFTACTGRP となってしまい、*NEW とすることができない。
これは CRTBNDCL の「省略時の活動化グループ」パラメータの省略値の値が *YES
なっているためである。

*DFTACRGRP という活動化グループは QILE という活動化グループであり
実行ジョブが完全に終了するまではプログラムは一旦、ロードすると
メモリーに留まり続けるのである。
これは ILE 以前の OPM での実行とは異なるので期待どおりの結果が得られない場合がある。
米国のユーザーは、このことはよく承知していて活動化グループ*NEW で作成することが
暗黙の了解となっている。

それどころか *DFTACTGRP としてコンパイルするとプロシージャーの定義そのものが
コンパイル・エラーを引き起こしてしまうのである。
となると *DFTACTGRP でコンパイルすることは避けるべきとなる。

活動化グループ*NEW であれば RPG III の終了と同じようにプログラムの終了とともに
プログラムはメモリから正しく削除される。
( 実際はメモリに残るのであるが、再ロードのときには、プログラムで使用しているすべての
変数やフィールドも初期化される。これに対して省略時の活動化グループ(QILE) であれば
QILE の終了まではプログラムは再ロードされると以前に使用されていた変数値やフィールド値も
そのまま再利用されてしまう。)

それでは一体 *NEW としてコンパイルするには、どのように指定すればよいのだろうか ?

CRTBNDCL + [F4キー] を押してから、省略時の活動化グループ (初期値:*YES) を *NO にして
実行キーを押すと次のように表示が変更される。


                         バインド CL PGM の作成  (CRTBNDCL)                     

  選択項目を入力して,実行キーを押してください。                                

  プログラム  . . . . . . . . . . > MYPGM          名前                      
   ライブラリー  . . . . . . . . . . . >   MYLIB        名前 , *CURLIB            
  ソース・ファイル  . . . . . . .   QCLSRC         名前                         
   ライブラリー  . . . . . . . . . . . >   MYSRC        名前 , *LIBL, *CURLIB     
  ソース・メンバー  . . . . . . .   *PGM           名前 , *PGM                  
  テキスト ' 記述 ' . . . . . . .   *SRCMBRTXT                                  

  省略時の活動化グループ  . . . . > *NO           *YES, *NO                  
  活動化グループ  . . . . . . . .   *STGMDL        名前 , *STGMDL, *NEW, *CALLER
  ストレージ・モデル  . . . . . .   *SNGLVL       *SNGLVL, *TERASPACE           

この「活動化グループ」を *STGMDL から *NEW に変更してコンパイルすると
作成されたプログラム・オブジェクトの活動化グループは次のように *NEW としてオブジェクトを
作成することができるのである。


                             プログラム情報の表示                              
                                                                    画面 7 の 1
   プログラム . . . . . . :   TESTLPAR      ライブラリー . . . . . :   TEST.COM  
   所有者 . . . . . . . . :   QTR                                                
   プログラム属性 . . . . :   CLLE                                               
   詳細 . . . . . . . . . :   *BASIC                                             

   プログラム作成情報 :                               
     プログラム作成日/時刻 . . . . . . . . . . . . :   14/10/19  11:20:43       
     プログラムのタイプ . . . . . . . . . . . . . . :   ILE                      
     プログラム入力プロシージャー・モジュール . . . :   TESTLPAR                 
       ライブラリー . . . . . . . . . . . . . . . . :     QTEMP                  
     活動化グループ属性 . . . . . . . . . . . . . . :   *NEW                     
     共用活動化グループ . . . . . . . . . . . . . . :   *NO                      
     ユーザー・プロファイル . . . . . . . . . . . . :   *USER                    
     借用権限の使用 . . . . . . . . . . . . . . . . :   *YES                     
     コード化文字セット ID  . . . . . . . . . . . . :   65535                    
     モジュールの数 . . . . . . . . . . . . . . . . :   1                        

したがって正しい CRTBNDRPG によるコンパイル・コマンドとは

CRTBNDCL PGM(MYLIB/MYPGM) SRCFILE(MYSRCLIB/QCLLESRC)
                                      DFTACTGRP(*NO) ACTGRP(*NEW) AUT(*ALL)  

である。

これで ILE-CLP の動作結果が安定しない、という悩みから解放されるにちがいない。

最後に「活動化グループ」については「RPG」の活動化グループの解説を参照されたい。