RPG

526. 【速報】Ver7.6 でグローバル変数の変更は不可に

OS Ver7.6ではILE-RPGのコンパイラーで
プロシージャー内でのグローバル変数の変更は
コンパイル・エラーとなって許可されません。
_

これは実行時にエラーとなって停止するということではなく
RPGコンパイルが通らなくなるという意味です。
以前の旧リリースでコンパイルしたプログラムが
OS Ver7.6では動かなくなるという意味ではありません。

つまり今回の改訂はコンパイラーの改訂ですから
それまでのILE-RPGプログラムをOS Ver7.6環境に移行して
実行しすると実行時にエラーとなるという意味ではありません。

しかし旧リリースではコンパイルが通っていたILE-RPGプログラムが
Ver7.6でコンパイルするとコンパイル・エラーになることが
あるということを注意しておいてください。
要は行儀作法のよくないプログラムのコンパイルは認めないと
いう方針のようです。

■ グローバル変数とローカル変数

グローバル変数とはプログラム内のすべての関数やプロシージャーでも
共通して使える更新可能な変数(=フィールド)であり
ローカル変数はプロシージャー内部だけで使える変数のことであり
他のプロシージャーやメインルーチンからは参照や更新からも
保護されているプロシージャー内だけで通用する関数である。
このようなグローバル変数とローカル変数の区別はオープン系の
開発言語では共通する概念であるがRPG III にはなかった。
ILE-RPGからの概念である。
_

▼グローバル変数とローカル変数の使用例

0002.00 H COPYRIGHT('AS400 ENGINE FOR PYTHON (C) Copyright Office Quattro -        
0003.00 H Corp.Japan 2024. All Right Reserved.                                  - 
0004.00 H Users Restricted Rights - Use, duplication or disclosure restricted')    

 :
(以下はグローバル変数)
0043.00 D SFLRRN          S             10I 0                                     
0044.00 D DATA            S           5000A                                       
0045.00 D RFILE           S             10A                                       
0046.00 D REDREC          S             10A                                       
0047.00 D RCD_LEN_        S              5I 0                                     
0048.00 D BYTES           S             10I 0                                     
 :
0794.00  **************************************************** 
0795.00  *     内 部 使 用  プロシージャー             * 
0796.00  **************************************************** 

865.00  *---( OPEN    PROCEDURE  ここから )------------------------* 
866.00 P OPEN            B                   EXPORT                  
867.00 D                 PI              *                           
 :
(以下はローカル変数)
0887.00 D MODE            S             30A   
0888.00 D RES             S              4B 0 
0889.00 D FILE            S             10A   
 :
1117.00 P                 E 

そもそもプロシージャーとは独立した実行スタックとして
実行されるものですからそのプロシージャーが
グローバル変数を変更するということはプロシージャーの
独立性を疎外するものですからあってはならない演算であり
本来、許可されるべきものではありません。
実行時のエラーとなっていないことが不思議でさえあります。

グローバル変数とはそのプログラム全体で共有して
使用される変数(=フィールド)のことです。
これに対してプロシージャー内だけで宣言されている変数は
ローカル変数と呼ばれメイン・ルーチンや他のプロシージャーから
参照することはできません。(保護されています)
_

例えば 整数 N = 1- 50 のLOOP演算の整数 : N がグローバル変数として
定義されている変数を使用しているとそのプロシージャーから
戻ったメイン・ルーチンでも N を使用していると
次のNを使用するメイン・ルーチンの演算が正しく行われなくなる
可能性があります。
このような障害を避けるためには N はローカル変数として
定義しておくのが正しい使用方法です。
よくサブルーチンの中で変数が更新されていたために
トラブルとなった経験をお持ちだと思いますが
プロシージャーとローカル変数に変えておけば
このようなトラブルは発生しません。

社内で使用されているプロシージャーでグローバル変数を変更している
ものがないかどうかよく調べることをお勧めします。

プロシージャーはそのプログラムから EXPORTして他のプログラムで
IMPORTしてオブジェクト・レベルで再利用することも
目的のひとつとしています。
(これをオブジェクト指向と呼びます)

■ Ver7.4および 7.5 でのコンパイラー・チッェク

OS Ver7.4, 7.5でも ADDENVAR によって環境変数を
追加してからコンパイルすればグローバル変数を
更新するプログラムに警告を与えることができます。

IBM_RPG_CHK_ALL_CONST_IN_SUBPROC に値 ‘Y’ を追加すると
RPGコンパイラーはプロシージャー内でグローバル変数を
更新する記述を見つけるとエラーにすることができます。

■ オブジェクト指向のために

プログラム内に書かれたプロシージャーはEXPORTすると
他のプログラムからでも参照して利用することができます。
そのためにはプロシージャーは独立して実行できるように設計しなければ
なりません。
例えば社内製品の消費税を計算するプロシージャーは
社内のプログラムでたったひとつであることが理想です。
他のすべてのプログラムで消費税の計算を必要とするプログラムは
その消費税手計算のプロシージャーをIMPORTすることによって
計算できます。
消費税が変更されてもたったひとつの消費税を算出するプロシージャーだけを
修正して再コンパイルすればそれをIMPORTしている他の多くのプログラムは
再コンパイルする必要はありません。

OS Ver7.6でのRPGコンパイラーの改訂はこのようなオブジェクト指向を
より推進するための改訂であり正しい方向に進んでいます。
_