RPG II は、IBM RPGプログラミング言語の非常に初期の人気バージョンです。
RPG IIは1960年代後半に開発され、IBM 1130、IBM System/3、System/32、System/34、System/36など、当時の最小のIBMシステムで動作するように設計されました。また、System/370、Singer System 10、Sperry Univac 90/25、90/30、90/40、System 80、1100メインフレームシリーズ[1]、およびWang VSシリーズでも使用できました。ICLはICL 2903システム用とVME/K用のバージョンを製造し、Burroughs CorporationはB1700シリーズのコンピュータ用にデータベース拡張機能を備えたRPG IIコンパイラを製造しました。Digital Equipment CorporationはVAX/VMSシステム用にVAX RPG IIという独自の実装を持っていました。[2]
1978年に強化版RPG IIIが登場した。
暗黙の処理ループや、固定形式のプログラミング言語であるため特別なデバッグテンプレートなしではプログラムを読むのが難しいなど、いくつかの珍しい特徴があります。[3]
特徴
RPG IIは固定形式のプログラミング言語であり、正しい結果を生成するためにはコードを正確な列位置に配置する必要があります。8つの異なる仕様タイプがあり、それぞれを記述するために別々のコーディング形式が使用され、特別なデバッグテンプレート[3]が プログラムのプリントアウトの読み取り補助として使用されます。
すべての RPG II プログラムは、暗黙のループ、つまりプログラム サイクル内で実行され、このループは、プログラムをファイルのすべてのレコードに順次適用します。これは、デバッグ テンプレートの「ロジック フロー」図で文書化されます。[3]各レコード (個々のパンチ カード) は、プログラムの各行と比較され、その行の「インジケーター」が「オン」か「オフ」かに基づいて、レコードに対してアクションを実行するかどうかが決まります。インジケーターは、ユーザー定義の目的で 01 から 99 まで番号が付けられた論理変数のセット、またはレコード、フィールド、レポート処理機能に基づくその他の小さなセットから取得されます。UDATE、UYEAR、PAGE などの特殊変数は、プログラムの開始時またはページ オーバーフローの発生時に、これらのアクティビティに対する明示的な指示がなくても埋められます。合計計算と出力は、L1/LR が固定ロジックによってオンに設定された詳細サイクルの後の「合計時間」に実行されます。
RPG のプログラム サイクルの概念は、カードを読み取り、その内容を要約し、結果を印刷する、まるで集計マシンのような周期的なマシンにぴったりでした。この言語は、他の入出力デバイスを処理できるように拡張され、高速で効率的なプログラミング方法を提供します。
ワークステーション (WORKSTN)、キーボード (KEYBORD)、コンソール (CONSOLE) などのデバイスには、ジョブの開始時に固定数のレコードがないため、固定ロジック RPG の「最終レコード」サイクルを組み込むために、SETON 命令を使用して LR インジケーターをオンに設定できます。LR をオフに設定することはできません。
RPG II は、1977 年の System/34 での実装から、Advanced/36 が販売中止となった 2000 年まで、あまり進化していません。1970 年代のバージョンからの変更点には、IFEQ/IFNE/IFGT/IFGE/IFLT/IFLE および END グループ化が含まれます。また、外部サブルーチンを呼び出すための call/parm も追加されました。もう 1 つの変更点は、内部サブルーチンの場合、C (計算) 仕様の列 7 と 8 に SR を入れる必要がなくなったことです。
サード パーティ プロバイダーは、System/36 および Advanced/36 プログラマーが RPG II の制限を超えるために使用できる 200 種類以上のアセンブラ サブルーチンを販売しました。System/3、32、34、および 36 (Advanced/36 を含む) での RPG II の制限の一部は、64K の制限とプログラムに含めることができるファイル数でした。そのため、プログラミング行が多数あったり、配列が大きい場合は、オブジェクト コードの 64,000 バイトを簡単に超えてしまいました。ただし、AS/400 およびその後継の iseries と IBM i (S/36E (実行環境) と呼ばれる環境で OS/400 または i5/OS を実行するもの) で実行される RPG II では、これらの制限 (64K バイトとファイル数) が大幅に拡張されたか、または削除されました。
RPGII仕様
RPG II のSystem/36実装には、System/3 などの初期の IBM システムのパンチ カード入力の元々の使用法から派生した、長さ 80 文字 (バイト) の固定形式のテキスト行である 8 つの異なる仕様 (spec)タイプがあります。同様の仕様はグループ化され、各タイプは U 、 T 、 H 、 F 、 E 、 L 、 I 、 C 、 Oの特定の順序で指定する必要がありました。
仕様コードは、RPG-II 仕様の 6 列目に表示されます。
命令コードは、RPG-II 計算仕様の 28 ~ 32 列目に表示されます。
- CALL/PARM は、リリース 6.0 (VASP とも呼ばれる) で RPG II に追加されました。
CHAIN は、因子 1 の値で指定されたキーと完全に一致する、因子 2 で指定された索引ファイル内のレコードを取得します。
SETLL は、係数 2 で指定されたファイルのインデックス ポインターを、係数 1 の値で指定された位置に配置します。
SORTA は、名前付き配列をその場でソートします。つまり、要素が順番に表示されます。
Z-SUB は、逆の符号を持つ係数 2 を計算し、結果フィールドに移動します。
XFOOT は配列を合計し、その結果を結果フィールドに移動します。
MVR は DIV 演算の後に続く必要があります。DIV 演算の整数の余りは結果フィールドに配置されます。「56 を 3 で割る」という DIV 演算の後に続く MVR は、結果フィールドに値 2 を配置します。
指標
インジケータは「設定されている」か「設定されていない」かのいずれかであり、 「フラグ」またはブール データ型です。
- プログラムのI、C、およびO仕様内でカスタム使用するために、通常は手動で設定される汎用的なもの。
- 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19
- 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
- 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
- 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
- 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
- 計算C仕様内で手動で設定される停止インジケーターは、戻りコードでプログラムを終了します。
- H1 H2 H3 H4 H5 H6 H7 H8 H9
- マッチング インジケータは、入力I仕様フィールドに割り当てられ、ファイルからレコードを読み取るときに自動的に設定され、2 つ以上のファイルのレコード内のどのフィールド (変数) が同期されているかの階層を調整し、通知します。各ファイル内のレコードがソート順になっており、レコードが順番に処理されていると想定します。
- M1 M2 M3 M4 M5 M6 M7 M8 M9であり、
MR一致が起こったことを反映している
- M1 M2 M3 M4 M5 M6 M7 M8 M9であり、
- 制御レベル インジケータは、入力I仕様フィールドに割り当てられ、ファイル内のレコードがソート順で処理されていると仮定して、ファイルからのレコード内のどのフィールドがグループ化されているかの階層を調整し、通知します。
- L0 L1 L2 L3 L4 L5 L6 L7 L8 L9
- コマンド キー インジケーターは、ワークステーションのキーボードからの入力を処理するプログラムに信号を送ります。PCキーボードのファンクション キー (
F1-F12、 、 ) に相当し、キーの代わりに使用されます。shift-F1-F12Enter
- KA KB KC KD KE KF KG KH KI KJ KK KL KM KN KP KQ KR KS KT KU KV KW KX KY
- これらのインジケータは、コマンド キー 1 から 24 をこの順序で参照します。インジケータがないことに注意してください
KO。
- 最初のサイクル インジケーターは、最初のページの出力時に自動的に設定され、主にプリンター ファイルに使用され、ページ区切りや見出しなどの出力を制御するためのオーバーフロー インジケーターと同様に使用されます。
- 1P
- オーバーフロー インジケータは、各ファイルのL仕様の行カウンタごとに、プリンタ出力ファイルのページ区切り制限の処理で自動的にトリップされますが、手動で設定することもできます。通常は、ページ区切りを確立し、見出しを印刷します。最大 8 つの出力ファイルごとに 1 つのインジケータがあります。
- OA OB OC OD OE の OG OV
- 最後のレコード インジケータ (制御レベル インジケータと混同しないでください) は、プログラムを終了し、バッチ処理ジョブ ストリーム (スクリプト) に制御を戻します。順次処理されるファイルでファイルの終わりに達したときに自動的に設定され、順次処理ソース (ファイル) がないプログラムを終了するために手動で設定されます。
- 左
- ジョブストリーム制御 (スクリプト) バッチ ファイルからプログラムに渡される、カスタム使用のための汎用的な外部インジケーター:
- U1 U2 U3 U4 U5 U6 U7 U8
さまざまな仕様をまとめた、折り畳み可能なシート、テンプレート、摩耗や汚れを防ぐためにプラスチックでコーティングされたものが用意されていました。固定形式のソース コード テキストを印刷出力に当てて視覚的に検査および検証するために使用されました。これらは、パンチ カードの本来の使用法から引き出された当時の標準テキスト間隔と一致して整列していました。
サンプルコード
************************************************************************
F* このプログラムは請求書ヘッダーファイルの内容を読み取ります
F* で設定された日付に処理された請求書を印刷します。
F* ローカルデータエリア。レベル区切りと合計があります
各店舗をクソにしろ。
************************************************************************
クソ*
FINVHDR IP F 62 ディスク
132 のプリンターの FPRINTER
IINVHDR NS 01 1NC
I 1 3 ストア L1
I 4 13 INVNO
I 14 20 カスタマー
I 21 45 ストーン
I 46 53 情報
I 54 622TOTINV
私はUDS
I 1 8 RPTDAT
C 01 情報 COMP RPTDAT 11
C 01 11 追加TOTINV L1TOT 92
C 01 11 追加 TOTINV LRTOT 92
Oプリンター H 101 1P
O またはの
O ページ Z 106
O 102「ページ」
O 59「とても大きい」
O 72「STORES, INC.」
更新 17
O 8 「実行日」
OH 1 1P
O またはの
O 73 「店舗別日次売上」
OH 2 1P
O またはの
O RPTDAT 83
O 63 「日付:」
OH 1 1P
O またはの
O 6「ストア」
O 18「請求書」
O 28「顧客」
O 58「顧客」
O 78「請求書」
OH 2 1P
O またはの
O 6 '番号'
O 18 'ナンバー'
O 28 '番号'
O 58 「名前」
O 78 '合計'
外径0L1
Oストア6
OD 1 01 11
O INVNO 18
O カスタマー 28
O ストーン 58
O TOTINV1B 78
OT 1 L1
O 45 「ストア合計...」
オー L1TOT 1B 78
OT 1 LR
O 45 「合計金額...」
O LRTOT 1 78
参考文献
- ^ 「Sperry Univac 1100/60 System」(PDF) 。 2021年1月18日閲覧。
- ^ 「VAX/VMS ソフトウェア言語およびツール ハンドブック」(PDF) . bitsavers.org . 1985 . 2020 年 12 月 31 日閲覧。
- ^ abc 「IBM RPG デバッグ テンプレート」、コンピュータ歴史博物館
- ^ 「IBM System/3 モデル 8、モデル 10、モデル 12、およびモデル 15 RPG II コンパイラ」、IBM プログラム製品仕様、1977 年 11 月、p. 3
外部リンク
- System/36 互換 RPG II - ユーザーズ ガイドとリファレンス
- ウィキミッドレンジ
