RPG PL/1特有の機能
前ページ 目次



PL/1はFORTRAN,COBOLについでGUIDE,SHAREというユーザー団体が
中心となって仕様をまとめ、メーカーにリクエストした言語といわれています。
PL/1も固有名詞というより、リクエストしたA Programing Language/1であったとか。
その内容は、20年以上も前まとめられたとは思えないほど、機能豊富でかつ整理統合
された体系になっています。
このページでは、その中から他の言語がまねのできない(まねしたくない)部分を紹介します。
この部分は、少々の努力では変換ツールをつくることが困難な機能で、変換するのは
泥臭く、手作業しか解決方法がないのではないかと思っています。
RPG-IVはここでは単にRPGと呼ぶことにします。



PL/1独自の機能


ストリーム型入出力

ストリーム型入出力はデータを一連の続きとして、レコード長に関係なく入出力するものです。
RPGには対応する機能がありません。
今、以下のようなレコード長30のファイルがあるとして、これを10、15、20バイトの
文字列フィールドXX,YY,ZZに入力するとします。

データファイル(レコード長:30バイト)
AAAAAAAAAABBBBBBBBBBCCCCCCCCCC
DDDDDDDDDDEEEEEEEEEEFFFFFFFFFF
GGGGGGGGGGHHHHHHHHHHIIIIIIIIII
JJJJJJJJJJKKKKKKKKKKLLLLLLLLLL
MMMMMMMMMMNNNNNNNNNNOOOOOOOOOO

これを、10、15、20バイトの文字列フィールドXX,YY,ZZに3回入力した場合、次のようになります。
        GET  EDIT(XX, YY, ZZ)  (A(10), A(15), A(20)) ; /* 1回目 */
        GET  EDIT(XX, YY, ZZ)  (A(10), A(15), A(20)) ; /* 2回目 */
        GET  EDIT(XX, YY, ZZ)  (A(10), A(15), A(20)) ; /* 3回目 */


1回目
XX :'AAAAAAAAAA'  YY:'BBBBBBBBBBCCCCC' ZZ:'CCCCCDDDDDDDDDDEEEEE'
2回目
XX :'EEEEEFFFFF'  YY:'FFFFFGGGGGGGGGG' ZZ:'HHHHHHHHHHIIIIIIIIII'
3回目
XX :'JJJJJJJJJJ'  YY:'KKKKKKKKKKLLLLL' ZZ:'LLLLLMMMMMMMMMMNNNNN'

出力の場合も同様で、データの流れが主記憶装置から外部記憶装置へと方向がかわるだけです。


ストリーム入出力の一般形

入力: GET FILE(ファイル名)                EDIT (変数リスト) (変換様式のリスト);
出力: PUT FILE(ファイル名) 改頁・改行のパラメータ  EDIT (式のリスト) (変換様式のリスト);


編集仕様

外部とのデータの転送の際、データを外部形式 ⇔ 内部形式の形式変換を行うときの仕様です。

編集仕様 意味
A(m) 文字列として無編集で転送。mはフィールド桁数。
出力のときはmは省略可。このとき、長さは変数の長さに合わされます。
F(m,n) 固定小数点数として編集。mはフィールド桁数。nは少数以下桁数。
nは省略可能。省略すると少数以下なしとなります。
X(m) 固定小数点数として編集。mはフィールド桁数。nは少数以下桁数。
m桁のブランクになります。
P'999,999' ピクチャー仕様による編集です。前ゼロ消去なしです。
P'ZZZ,ZZZ' ピクチャー仕様による編集です。前ゼロ消去ありです。
Vは小数点位置を示します。負の値のとき、−符号が後に付けられます。
P'99/99/99' RPGでの編集コードYに相当する編集です。
SKIP よみ残りデータをスキップし、レコードの先頭から編集するよう同期を取ります。

同一使用の繰返し

変換仕様の前に数値をおくと繰り返し数になります。
2 F(5,1)は、(F(5,1),F(5,1))と同じです。


PUT命令

PUT  [PAGE/SKIP[(n)]/LINE(n)]  EDIT(式のリスト) (編集仕様リスト);

PAGE:    印刷に先立ち、改ページします。
LINE(n):  次のn行目に位置づけします。
SKIP(n) : 印刷に先立ち、n回改行します。(n)を省略すると1回改行します。
EDIT(  ): 変数のリストを指定します。構造名を記述するとその要素を全て記述したことと同じになります。
編集リスト : 出力するときの編集要領のリストを記述します。
        リストの要素が足りないとき、元に戻って繰返し使用されます。


ストリームI/OのPL/1からRPGへ変換の際の解決策

RPGに対応する命令がないGET,PUTの命令に対する変換の解決策としては、次の方法をとるのがいいと思います。

出力の場合
1.出力の場合は、印刷ファイルを記述して、印刷ファイルを使用した出力(WRITE命令)を行う。
2.出力様式の同等の構造を定義仕様書(D仕様書)で作成し、これを出力(EXCPT命令)する。

入力の場合
1.入力様式同等の構造を、定義仕様書に作成し、この構造に入力を行う。

いずれにしても、泥臭い手作業しかないようです。


複数割付

I,J,K=0;は、
   I=0;J=0;K=0;
に同じ意味です。すなわち、RPGでは
   EVAL   I = 0
   EVAL   J = 0
   EVAL   K = 0
と同じです。


複数定義

DCL  (I,J,K)  CHAR(3) ;

DCL  I  CHAR(3);
DCL  J  CHAR(3);
DCL  L  CHAR(3);
と同じです。


その他

PIC様式、’ZZZ,ZZZ,ZZ’の属性をもった変数での計算。

DCL  X  P’Z,ZZZ’;
X = X + 1 ;

PL/1では可能ですが、RPGはもちろん、COBOLでも不能です。


ソース・マージン

PL/1のスペックではありませんが、PL/1ソースとして有効な範囲を示す、
ソース・マージンが、コンパイルのときに指定できます。
標準値は、2カラムから72カラムです。ソース・マージンの範囲外は注釈などとして
自由に使用できます。
随時、判明の都度追補します。m(--)m





前ページ 目次


(C)COPYRIGHT ISHIOKA KATSUHIDE ,2000