IBM RPG

RPGレポートプログラムジェネレーター
パラダイムマルチパラダイム
開発者IBM
初登場1959 (1959年
安定版リリース
RPG IV バージョン7 リリース4 / 2020年10月6日 ( 2020-10-06 )
タイピングの規律強い静的
OSCPFSSPOS/400IBM iOS/VS1z/OSDOS/VSEVSE/SPVSE/ESAz/VSEVS/9PRIMOSOpenVMSWang VSBurroughs MCPHP MPEMS-DOSOS/2Microsoft Windows
方言
RPG、RPG IIRPG III、RPG 400、RPG IV、RPG/ILE、RPG/Free、Baby/36、Baby/400、Lattice RPG、VAX RPG II
影響を受けた
9PACファーゴ

RPGは、1959年にIBM 1401向けに導入された、ビジネスアプリケーション向けの高水準プログラミング言語です。IBM iオペレーティングシステムを含む、IBMの中規模コンピュータ製品ラインの主要プログラミング言語として最もよく知られています。[ 1 ] RPGは伝統的に、プログラムサイクルや列指向構文など、多くの独特な概念を特徴としてきました。[ 2 ]最新バージョンはRPG IVで、自由形式構文を含む多くの近代化機能が含まれています。[ 3 ]

プラットフォーム

RPGプログラミング言語は、もともとIBMが1401システム向けに開発したものでした。IBMは後に7070/72/74 [ 4 ] [ 5 ]およびSystem/360 [ 6 ]向けの実装を開発しました。RPG IIは、同社のミッドレンジコンピュータ製品ライン(System/3System/32System/34System/38System/36AS/400)の主要プログラミング言語となりました。また、 DEC VAX、Sperry Univac BC/7、Univac system 80、Siemens BS2000、Burroughs B700、B1700、Hewlett Packard HP 3000ICL 2900シリーズ、Honeywell 6220 および 2020、Four-Phase IV/70 および IV/90 シリーズ、Singer System 10WANG VS向けの実装もあり、さらに Infinite36 (旧 Unibol 36) などの Unix ベース システムや PC (Baby/400、Lattice-RPG) 向けのさまざまなコンパイラやランタイム環境も実装されています。

RPG IIアプリケーションは、 VSE [ 7 ]およびz/OSオペレーティングシステム、[ 8 ] Unisys MCP[ 9 ] Microsoft Windows [ 10 ]およびOpenVMS [ 11 ]でも引き続きサポートされています。

歴史

背景

1959年にIBMによって開発されたもので、 Report Program Generatorという名前は、データファイルからレポートを生成するという言語の目的を表していました。[ 12 ] FOLDOCは、IBMでのRPG開発につながった仕事に対してWilf Heyの功績を認めています。[ a ] FARGO1401自動レポート生成操作)は、 IBM 1401上のRPGの前身でした。

どちらの言語も、IBMの集計機(Tab)ユニット記録装置の技術者が当時の最新式コンピュータに容易に移行できるようにすることを目的としていました。Tabマシンの技術者は、入力、出力、制御、カウンタ操作(加算、減算、乗算、除算)を実行するために、制御パネルに配線を接続することに慣れていました。Tabマシンのプログラムは、マシンサイクルで発行されるインパルスによって実行されました。したがって、FARGOとRPGは、マシンサイクルの概念をプログラムサイクルでエミュレートしていました。RPGはFARGOよりも優れており、レポート生成プログラムの選択肢として急速にFARGOに取って代わりました。

IBMは後にIBM 7070/72/74にRPG(7070-RG-902)を実装したが、FARGOは実装しなかった。 [ 13 ] [ 14 ]

当時一般的に利用可能な代替言語は、アセンブラCOBOL、Commercial Translator COMTRAN、またはFORTRANでした。アセンブラとCOBOLはメインフレームの業務処理(707X、7080、System/360モデル30以上)でより一般的であり、RPGは表計算機器( 14xx 、System/360モデル20)からの移行中の顧客によってより一般的に使用されていました。

RPG II

RPG IIは1969年頃、System/3シリーズのコンピュータとともに導入されました。その後、言語の改良版がSystem/32System/34System/36でも使用されました。RPG IIは、 DOS/VSE(当時はVSE/SPVSE/ESAz/VSE )を搭載したIBM System/370メインフレームなど、より大規模なシステムでも利用可能でした。ICL社もVME/Kオペレーティングシステム用のバージョンをリリースしました。

RPGの初期の時代、その最大の強みはプログラムサイクルでした。プログラマーは個々のレコードを処理するコードを書き、プログラムサイクルは制御フローを管理しながら、ファイルのすべてのレコードに対して変更を実行します。当時、各レコード(個々のパンチカード)はプログラムの各行と比較され、その行の「インジケータ」がオンかオフかに基づいて、レコードに対して操作を行うか行わないかが決定されていました。インジケータは、ユーザー定義の目的のために01から99までの番号が付けられた論理変数の集合、またはレコード、フィールド、またはレポート処理機能に基づいたより小さな集合で構成されていました。レベル区切りとレコードのマッチングという概念はRPG II言語に特有のもので、元々はカードリーダーを念頭に置いて開発されました。このサイクルのレコードマッチング機能により、ヘッダーと詳細の関係を持つファイルの処理が容易になりました。プログラムサイクルを活用するように作成されたRPGプログラムは、COBOLなどのビジネス中心の言語で書かれたプログラムよりもはるかに少ない行数で複雑なレポートを作成できました。

プログラムファイル仕様には、書き込み、読み取り、または更新の対象となるすべてのファイルがリストされ、その後にデータ構造や次元配列などのプログラム要素を含むデータ定義仕様が続きます。これは、COBOLプログラムの「作業領域」セクションに似ています。さらに、実行命令を含む計算仕様が続きます。出力仕様は、他のファイルやレポートのレイアウトを決定するために使用できます。また、ファイル、一部のデータ構造、およびレポートを外部で定義することもできます。これにより、入出力(「 I/O 」)仕様を手動でコーディングする必要がほとんどなくなります。

RPG III

RPG IIIはSystem/38とその後継機であるAS/400向けに開発されました。RPG IIIはオリジナル言語から大きく発展し、IF-ENDIFブロック、DOループ、サブルーチンといった現代的な構造化構文を採用しました。RPG IIIは、 OS/VS1を搭載したIBM System/370メインフレームを含む大規模システムでも利用可能でした。また、 UNIVAC Series 90メインフレームで動作するVS/9オペレーティングシステム向けにもUni​​sysから提供されていました。

1979 年にIBM System/38が導入されて以来、ほとんどの RPG プログラマーはサイクルの使用をやめ、標準のループ構造を使用してプログラム フローを制御するようになりましたが、IBM はサイクルの下位互換性を提供し続けています。

ドイツ語/RPG

DE/RPG(データ入力RPG)は、 1980年代初頭、 IBM 5280シリーズのデータ​​入力ワークステーションでのみ利用可能でした。RPG IIIに似ていますが、System/38やその後継機種のようにデータ(ファイル)を記述するための外部データ記述(DDS)がありませんでした。そのため、DDS部分はRPGソースコード自体に組み込む必要がありました。

RPG/400

RPG/400は、実質的にはAS/400上で動作するRPG IIIでした。IBMはRPGコンパイラーを「RPG/400」に改名しましたが、導入当時はSystem/38上のRPG IIIコンパイラーと同一でした。事実上すべてのIBM System/38製品はxxx/400にブランド名が変更され、RPGコンパイラーも例外ではありませんでした。RPG/400コンパイラーでコンパイルされたRPG IIIは、AS/400が発売されて数年後にIBMがSCAN、CAT、XLATEなどの新しい命令コードの開発を開始するまで、RPG III言語に何ら新しい機能を提供しませんでした。RPG IIIに対するこれらの機能強化は、System/38版のRPG IIIでは利用できませんでした。

RPG IVとILE RPG

RPG IV(別名RPG ILE ) [ 15 ]は、OS/400(現在はIBM iとして知られている)のV3R2リリースの一部として1994年にリリースされました。 [ 16 ] [ 17 ]

RPG IVのリリースにより、RPGという名称は正式には頭字語ではなくなりました。RPG IVは拡張演算項目2演算仕様の中でより多様な表現を提供し、後には自由形式の演算仕様と手続き構文も提供しました。統合言語環境フレームワークにおけるRPG IVはILE RPGと呼ばれ、ユーザーガイドでは両方のニュアンスが説明されています。[ 18 ] [ 19 ] [ 20 ] RPG IVとILE RPGは、現在のIBM i プラットフォームでIBMによってサポートされています。[ 21 ]

2001年、 OS/400 V5R1のリリースにより、RPG IVは拡張演算項目2演算仕様よりも大きな演算の自由度を提供しました。これは、元の列依存のソース形式に代わる、自由形式のテキスト対応ソース項目です。「/FREE」演算では、命令コードを特定の列に配置する必要がなく、EVALおよびCALLP命令では命令コードはオプションで、構文は一般的に主流の汎用プログラミング言語の構文に近くなりました。2013年11月までは、自由形式は演算仕様にのみ適用されていました。[ 22 ] IBM i V7R1 TR7への言語アップグレードにより、「/free」および「/end-free」演算は不要になり、この言語はついにパンチカードとの結びつきを断ち切りました。

IBM Rational Developer for i (RDi) [ 23 ]Eclipseベースの統合開発環境であり、IBMではRPG開発に推奨しています。[ 24 ] Source Entry Utility (SEU)テキストエディタはRPG開発には推奨されなくなり、IBM i 6.1以降開発は中止されました。[ 25 ]その他のレガシー開発ツールにはCODE/400 (IBM WorkFrame/2ベース)やVisualAge for RPGなどがあります。

継続的な言語強化

IBMは、ソフトウェアリリースとリリース内「テクノロジーリフレッシュ」(TR)[ 27 ]を通じてRPG言語[ 26 ]の機能強化を続けています。 [ 27 ] [ 28 ] より多くの組み込み関数(BIF)が追加されました。Javaオブジェクト[ 29 ]やIBM i APIにリンクする機能がありIBMCgidev2 Webツールキット[ 30 ]、RPGツールボックスその他の商用Web対応パッケージを利用してCGIプログラムを作成することもできます。変更があっても、かなりの下位互換性が維持されているため、37年前に作成されたRPGプログラムでも、ほとんどまたはまったく変更せずに今日実行できます。

SQLプリコンパイラーにより、現在のRPG開発者はIBMのコストベースのSQE(SQLクエリーエンジン)を活用できるようになります。従来のF-Specアプローチでは、開発者はデータセットへの特定のアクセスパスを指定する必要がありましたが、SQLプリコンパイラーでは標準の埋め込みSQL文をプログラム内に直接実装できます。SQLプリコンパイラーはコンパイル時にSQL文をRPG文に変換し、最終的にクエリー要求を実行するデータベース・マネージャー・プログラムを呼び出します。

RPG IV言語はEBCDIC文字セットをベースとしていますが、UTF-8、UTF-16、その他多くの文字セットもサポートしています。この言語のスレッドセーフな側面は、コンパイラチームがRPGランタイム環境を再入可能にするのではなく、各スレッドに独自の静的ストレージを割り当てることでスレッドに対処しているため、一部の人々からは特異なものと見なされています。このため、スレッドとプロセスの区別が曖昧になっていることが指摘されています(RPG IVのスレッドは、スレッドとプロセスのハイブリッドのようなものになっています)。

2010年、IBMはRPG Open Access ( Rational Open Access: RPG Editionとも呼ばれる)をリリースしました。これにより、プログラマーによる新しいI/Oハンドラーの定義が可能になり、RPGが組み込みサポートを提供していないソースからのデータの読み書きが可能になります。[ 31 ]

データ型

RPG は次のデータ型をサポートしています。

注:データ型の列の文字は、データ型に指定された列の定義仕様書でエンコードされる文字です。比較すると、変数の定義が自由形式であり、整数変数を宣言するためにintなどのキーワードを使用する C などの言語の場合、RPG では、変数は固定形式の定義仕様書を使用して定義されます。定義仕様書では、ソース行の列6に文字Dで示され、データ型文字は列40にエンコードされます。また、データ型文字を省略 (つまり空白のままに) した場合、小数点以下の桁数が指定されていない場合はデフォルトはA、独立型フィールドに小数点以下の桁数が指定されている場合は P、データ構造内で小数点以下の桁数が指定されている場合はS (ZONED) になります。

データ型 名前 長さ 説明
A英数字 1~16,773,104バイト(固定)1~16,773,100バイト(可変長) 英数字
B2進数値 1バイト(8ビット)2バイト(16ビット)4バイト(32ビット)8バイト(64ビット) 符号付き2進整数
CUCS-2文字 1~8,386,552文字(固定)1~8,386,550文字(可変) 16ビット UCS-2 文字(DBCSまたは EGCS)
D日付 10バイト 日付: 年、月、日
F浮動小数点数値 4バイト(32ビット)8バイト(64ビット) 符号付き2進浮動小数点実数
Gグラフィック文字 1~8,386,552文字(固定)1~8,386,550文字(可変) 16ビットグラフィック文字(DBCSまたはEGCS)
I整数数値 1バイト(8ビット)2バイト(16ビット)4バイト(32ビット)8バイト(64ビット) 符号付き2進整数
N文字インジケータ1バイト '1' = 真'0' = 偽
O物体 サイズ非公開 オブジェクト参照
Pパック10進数値 1~63桁、1バイトあたり2桁+符号 整数と小数点を含む符号付き固定小数点10進数
Sゾーン10進数値 1~63桁、1バイトあたり1桁 整数と小数点を含む符号付き固定小数点10進数
T時間 8バイト 時間: 時、分、秒
U整数数値 1バイト(8ビット)2バイト(16ビット)4バイト(32ビット)8バイト(64ビット) 符号なし2進整数
Zタイムスタンプ26バイト 日付と時刻:  年、月、日、時、分、秒、マイクロ秒
*ベースポインタ手順ポインタシステムポインタ16バイト データへのアドレス、アクティブ化されたプロシージャへのアドレス、オブジェクトへのアドレス

サンプルコード

次のプログラムは、顧客番号を入力パラメータとして受け取り、名前と住所を出力パラメータとして返します。これはRPG IV構文の最も原始的なバージョンです。後ほど、同じプログラムを、構文を徐々に現代的に変え、ルールを徐々に緩和したもので示します。

 * 歴史的にRPGは列形式の性質を持っていましたが、 * 特定の状況下で許可されました。 * さまざまな行コードの目的は、 * 6列目の文字コード。 * 7列目のアスタリスク(*)はコメント行を示します * 「F」(ファイル)仕様はファイルやその他のI/Oデバイスを定義します F ARMstF1 IF EK ディスク名変更(ARMST:RARMST) * 「D」(データ)仕様は変数を定義するために使用されます D pCusNo S 6p D pName S 30a D pAddr1 S 30a D pAddr2 S 30a D pCity S 25a D pState S 2a D pZip S 10a * 「C」(計算)仕様は実行文に使用されます * パラメータはplistおよびparmオペコードを使用して定義されます C *エントリplist C パラメータ pCusNo C パラメータ pName C パラメータ pAddr1 C パラメータ pAddr2 C パーム pCity C パラメータ pState C パラメータ pZip * 「chain」コマンドはキー付きファイルのランダムアクセスに使用されます C pCusNo チェーン ARMstF1 * レコードが見つかった場合は、ファイルからパラメータにフィールドを移動します %見つかった場合はC C 評価 pName = ARNm01 C 評価 pAddr1 = ARAd01 C 評価 pAddr2 = ARAd02 C 評価 pCity = ARCy01 C 評価 pState = ARSt01 C 評価 pZip = ARZp15 C 終了 * RPGではスイッチを使用します。スイッチの「LR」は元々「最後の記録」を意味していました。 * LRはプログラムとそのデータスペースをメモリから削除可能としてフラグ付けします C 評価 *InLR = *On 

V5R1 以降で利用可能なフリー計算を使用する同じプログラム:

 * 「F」(ファイル)仕様はファイルやその他のI/Oデバイスを定義します FARMstF1 IF EK ディスク名変更(ARMST:RARMST) * 「D」(データ)仕様は変数とパラメータを定義するために使用されます * プログラムの「プロトタイプ」は別のファイルにあります * 他のプログラムから呼び出せるようにする /コピー cust_pr *「手続きインターフェース」は*ENTRYパラメータを記述する D getCustInf PI D pCusNo 6p 0 定数 D pName 30a D pAddr1 30a D pAddr2 30a D pCity 25a D pState 2a D pZip 10a /無料 // 「chain」コマンドはキー付きファイルのランダムアクセスに使用されます チェーン pCusNo ARMstF1; // レコードが見つかった場合は、ファイルからフィールドをパラメータに移動する %が見つかった場合; pName = ARNm01; pAddr1 = ARAd01; pAddr2 = ARAd02; pCity = ARCy01; pState = ARSt01; pZip = ARZp15; 終了; // RPGではスイッチが使われます。スイッチの1つ「LR」は元々「最後のレコード」を意味していました // LR は実際にはプログラムとそのデータスペースをメモリから削除可能としてフラグ付けします。 *InLR = *オン; /end-free 

ARMSTF1 サンプル テーブルが次の SQL ステートメントを使用して作成されたと仮定します。

テーブルarmstf1作成しますarcmun107、0 arnamechar 30 aradd1char 30 aradd2char 30 )、arcitychar 25 arsttechar 2 arzipchar 10 

自由計算と埋め込み SQL を使用した同じプログラム:

 * RPG IV では、プログラムを終了するために *INLR インジケーターを使用する必要がなくなりました。 * 「H」(ヘッダー)仕様でMAINキーワードを使用し、「メイン」または * エントリプロシージャ名を使用すると、プログラムは、 * 数十年前の RPG Cycle ではなく、より「C のような」開始ロジックと終了ロジックを採用しました。 H MAIN(getCustInf) * 「D」(データ)仕様は変数とパラメータを定義するために使用されます * プログラムの「プロトタイプ」は別のファイルにあります * 他のプログラムから呼び出せるようにする /コピー cust_pr *「手続きインターフェース」は*ENTRYパラメータを記述する P 顧客情報取得 B D getCustInf PI D pCusNo 6p 0 定数 D pName 30a D pAddr1 30a D pAddr2 30a D pCity 25a D pState 2a D pZip 10a /無料 exec sql で arName、arAddr1、arAdd2、arCity、arStte、arZip を選択します。 :pName、:pAddr1、:pAddr2、:pCity、:pState、:pZip に ARMstF1から ここで、arCNum = :pCusNo フェッチのみ 最初の1行のみ取得 1行に最適化 CS付き; /end-free P 顧客情報取得 E 

オペレーティング システム V7R1 以降では、上記のプログラムは必ずしも別のファイルにプロトタイプを必要としないため、次のように完全に記述できます。

H main ( GetCustInf ) D ARMSTF1 E DS P GetCustInf B D GetCustInf PI extpgm ( 'CUS001' ) D inCusNo like ( arCNum ) const D outName like ( arName ) D outAddr1 like ( arAdd1 ) D outAddr2 like ( arAdd2 ) D outCity like ( arCity ) D outState like ( arStte ) D outZip like ( arZip ) / free exec sql select arName , arAdd1 , arAdd2 , arCity , arStte , arZip into : outName , : outAddr1 , : outAddr2 , : outCity , : outState , : outZip from ARMSTF1 where arCNum = : inCusNo fetch first 1 CS使用のみ現在コミット済み; /終了-解放P GetCustInf E

最後に、コンパイラー PTF 関連の Technology Refresh 7 (TR7) を 7.1 オペレーティング システムに適用すると、上記のプログラムは次のように完全に自由形式でコーディングできます。

ctl - opt main ( GetCustInf ); dcl - ds ARMSTF1 ext end - ds ; dcl - proc GetCustInf ; dcl - pi * n extpgm ( 'CUS001' ); inCusNo like ( arCNum ) const ; outName like ( arName ); outAddr1 like ( arAdd1 ); outAddr2 like ( arAdd2 ); outCity like ( arCity ); outState like ( arStte ); outZip like ( arZip ); end - pi ; exec sql select arName arAdd1 arAdd2 arCity arStte arZip into : outName : outAddr1 : outAddr2 : outCity : outState : outZip from ARMSTF1 where arCNum = : inCusNo CS最初の1行のみフェッチします現在コミット済みを使用します; return ; end - proc ;

説明ノート

  1. ^しかし、ここで言及されている 1959 年ではなく、1965 年となっています。

参考文献

  1. ^ 「RPG ILE 入門」 IBM、2012年6月。2024年2月29日時点のオリジナルよりアーカイブ2021年3月16日閲覧。
  2. ^ Tony Baritz、David Dunne (1991). AS/400 - 概念と機能. McGraw-Hill. ISBN 978-0-07-018301-8. 2024年2月29日時点のオリジナルよりアーカイブ2021年3月16日閲覧。
  3. ^ Alex Woodie (2020年8月24日). 「RPGの名前を変更する時期か?」 . itjungle.com . 2021年4月23日時点のオリジナルよりアーカイブ2021年3月16日閲覧。
  4. ^ 7070/7074コンパイラシステム:レポートプログラムジェネレーター. IBM . C28-6113.
  5. ^プログラミング・システム分析ガイド - IBM 7070シリーズ・レポート・プログラム・ジェネレーター(PDF) . IBM . 1962. C28-6192. 2024年1月19日時点のオリジナルよりアーカイブ(PDF) . 2024年1月19日閲覧
  6. ^ IBM System/360 - オペレーティング・システム - RPG 言語仕様 - プログラム番号 380S-RG-038 (OS) (PDF) (第7版). IBM . 1973年7月. GC24-3337-6. 2024年1月19日時点のオリジナルよりアーカイブ(PDF) . 2024年1月19日閲覧
  7. ^ "21CS VSEn" . 21st Century Software . 2025年2月22日閲覧。
  8. ^ 「サポート対象製品リスト」 IBM、2021年3月16日。2021年5月2日時点のオリジナルよりアーカイブ2021年3月17日閲覧。
  9. ^ 「ClearPath MCP Express」(PDF) . Unisys. 2017年. 2020年11月12日時点のオリジナルよりアーカイブ(PDF) . 2021年3月17日閲覧
  10. ^ "Visual RPG for .NET" . asna.com . ASNA. 2022年4月3日時点のオリジナルよりアーカイブ。 2022年4月3日閲覧
  11. ^ 「Migration RPG」 . migrationspecialties.com . 2021年5月17日時点のオリジナルよりアーカイブ2021年3月17日閲覧。
  12. ^ 「IBM 1401とレポート・プログラム・ジェネレーター(RPG)はこの成功に大きく貢献しました...」 Wayback Machineに2012年1月24日アーカイブ、IBM 1401データ処理システム/1959
  13. ^ 7070/7074コンパイラシステム:レポートプログラムジェネレーター. IBM . C28-6113.
  14. ^プログラミング・システム分析ガイド - IBM 7070シリーズ・レポート・プログラム・ジェネレーター(PDF) . IBM . 1962. C28-6192. 2024年1月19日時点のオリジナルよりアーカイブ(PDF) . 2024年1月19日閲覧
  15. ^「CEERAN0 APIを使用したILE RPGでの乱数生成」、IBM.com
  16. ^「なぜRPG IVの成熟期を見逃したのか?」Wayback Machineに2017年3月3日アーカイブ、ibmsystemsmag.com
  17. ^ "RPG/400" . IBM.com . International Business Machines Corporation. 2018年5月8日. 2022年4月3日時点のオリジナルよりアーカイブ。 2022年4月4日閲覧
  18. ^ 「ILE RPGリファレンス」 IBM.com International Business Machines Corporation、2012年6月。2022年4月3日時点のオリジナルよりアーカイブ。 2022年4月4日閲覧
  19. ^ 「ILE RPG プログラマーズ・ガイド」 IBM.com International Business Machines Corporation、2012年6月。2022年4月3日時点のオリジナルよりアーカイブ。 2022年4月4日閲覧
  20. ^ 「このガイドの対象読者」 IBM.com International Business Machines Corporation、2012年6月。2022年4月3日時点のオリジナルよりアーカイブ。 2022年4月4日閲覧
  21. ^ 「High Level Languages」 IBM.com International Business Machines Corporation、2018年5月8日。2022年4月3日時点のオリジナルよりアーカイブ。 2022年4月4日閲覧
  22. ^ Paris, Jon ; Gantner, Susan. 「Totally Free RPG」 . IBM Systems Magazine. 2014年3月8日時点のオリジナルよりアーカイブ。 2014年3月8日閲覧
  23. ^ 「IBM Rational Developer for i」 IBM.com International Business Machines Corporation. 2022年4月3日時点のオリジナルよりアーカイブ。 2022年4月3日閲覧
  24. ^ “5770-WDS IBM Rational Development Studio for i V7.4” . IBM.com . International Business Machines Corporation. 2022年4月3日時点のオリジナルよりアーカイブ。 2022年4月3日閲覧
  25. ^ “5770-WDS IBM Rational Development Studio for i V7.4” . IBM.com . International Business Machines Corporation. 2022年4月3日時点のオリジナルよりアーカイブ。 2022年4月4日閲覧
  26. ^ IBM. 「RPG Cafe」 . IBM.com . International Business Machines Corporation. 2022年4月3日時点のオリジナルよりアーカイブ。 2022年4月3日閲覧
  27. ^ IBM. 「IBM i テクノロジー・アップデート」 . IBM.com . International Business Machines Corporation. 2022年4月12日時点のオリジナルよりアーカイブ。 2022年4月3日閲覧
  28. ^ IBM. 「IBM i テクノロジーリフレッシュ」 . IBM.com . International Business Machines Corporation. 2022年4月3日時点のオリジナルよりアーカイブ。 2022年4月3日閲覧
  29. ^ 「RPG/400 ユーザーズ・ガイド」(PDF) . Ibm.com . 2017年8月7日時点のオリジナルよりアーカイブ(PDF) . 2017年8月6日閲覧
  30. ^ “EASY400 CGIDEV2” . Easy400.net . 2019年3月26日時点のオリジナルよりアーカイブ2019年3月26日閲覧。
  31. ^ 「Rational Open Access: RPG Edition」 IBM。2024年2月29日時点のオリジナルよりアーカイブ。 2021年3月17日閲覧

さらに読む