RPG

402. MOVE命令はフリー・フォーマットでは使えない

RPGのMOVE, MOVEL命令は大変汎用的でRPGプログラムの特性を
代表するような演算命令である。
MOVE命令が含まれていないRPGソースは見ないくらい
数多くの場面でMOVE命令は使われている。

特に便利であるのはMOVE命令が値をコピーするという
単純な命令でありながら異なるタイプの変数への型変換
行えるという点である。
RPGのプログラマーは意識せずに文字フィールドから
数字フィールドへMOVE命令だけで値をコピーしているし
これがRPGプログラムをやさしい開発言語としている。

一般にRPGの変数の型は第別すると

 

文字フィールドと数字フィールド

に分けられる。かなり大雑把であるが通常のRPGの開発で
あればこの程度の理解でよいし数字フィールドは

 ゾーン10進数 (S) と
 パック形式(P)

に分けられる。ところが一般の開発言語ではこのどちらも
存在していない。
IBM iのC言語ではパック形式では decimalという型で
パック形式の数字は扱えるもののゾーン10進数は
C言語にはない

考えてみれば CLPには *DEC というパック形式(P)は扱えるが
やはりゾーン10進数 (S)はCLPにもないということに
お気づきだろうか?

MOVEの話に戻って MOVE命令では1桁の文字を1桁のゾーンや
BIN(2進数)であってもMOVEで値をコピーすることができる。
ところが C言語などの開発言語では数字といっても

整数 int
短整数 short int
長整数 long
倍整数 double
:
:
などいろいろな型がある。
RPGでも最近は BIN(=バイナリ), UC(=符号なしバイナリ), … など
いろいろな型を扱うようになってきた。
フリー・フォーマットでは文字フィールドから数字フィールドへの
値のコピーは MOVE命令は使えず必ず型変換を明示的に指定しなければならない。
C言語の影響や他言語の考え方がフリー・フォーマットに影響しているのであろう。

   /FREE
     ITSU = %INT(STR);
     PACK70 = %DEC(STR:7:0);
   /END-FREE

のようにいちいち型を考えてそれに見合った組み込み関数で変換しなければならない。
場合によってはポインタを基盤とする変数を定義してそれにコピーするという
高度な変換を必要とする。
筆者が試した場合 1桁の文字を1桁の数字に変換することができなかった
これはフリー・フォーマットへの移行の見落としであったと推測される。

人にやさしかったMOVE命令を何も定義にとらわれて難しくしてしまったのでは
せっかくのRPGのやさしさが失われてしまう。
型変換が必要な場合は無理やりフリー・フォーマットを使おうとするのではなく
今までどおり MOVE 命令を使うほうが見た目にもやさしい。

MOVE命令は実は人にやさしい奥の深い演算命令であったのだ。