RPG (Report Program Generator)とは
RPGは、
IBMが開発したビジネスアプリケーション向けの
プログラミング言語です。
高水準言語に分類され、特に
IBM i (旧AS/400) システム上で広く利用されています。その名称は「Report Program Generator」の略であり、初期には帳票出力ツールとして設計されましたが、現在では幅広い用途に対応できる強力な言語へと進化を遂げています。
 RPGの概要
RPGは、もともと
IBM System i(旧AS/400)の中核となる
プログラミング言語です。開発当初はクエリツールとしての側面が強かったものの、
IBMによる継続的な改良によって、高機能な言語となりました。
典型的なRPGプログラムは、まずファイル仕様(File Specification)から始まり、ここで使用する全ての
入出力ファイルを定義します。次にデータ定義仕様(Data Definition Specification)で、
データ構造や
配列を記述します。これは、
COBOLのWorking-Storageセクションや
Pascalの変数定義に相当する部分です。その後、プログラムの実際の処理を記述する計算仕様(Calculation Specification)へと続きます。最後に、出力レイアウトを定義する出力仕様(Output Specification)を追加することもできます。
初期のRPGには「プログラムサイクル」という独特な概念がありました。これは、ファイルから
レコードを読み込むごとに、暗黙のループの中でプログラムが実行されるというものです。現在では、プログラムフローをループで明示的に制御するのが一般的になり、この機能はあまり使用されなくなっています。
 RPGの歴史
RPGは、
パンチカードの時代から現代まで使われ続けている数少ない
プログラミング言語の一つです。1960年代に
IBMによって開発され、初期の目的は、データファイルから会計報告書を作成することでした。
RPGの前身はFARGO (Fourteen-o-one Automatic Report Generation Operation)で、FARGOとRPGはユニット
レコード装置(PCS)から
IBM 1401シリーズへの移行を円滑に進めるために開発されました。当時のPCS技術者は、
プラグボード上で配線を行い、
入出力や演算を行っていました。RPGはこの仕組みを「プログラムサイクル」としてエミュレートしました。
当時、広く使われていた言語としては
COBOLとFORTRANがありました。
COBOLはビジネス用途、FORTRANは科学技術計算用途という役割分担がありました。RPGは当初、
COBOLが主流となる以前の、PCSから移行した小規模なビジネスシステムで多く用いられました。
RPG IIはSystem/3と共に導入され、その後System/32、
System/34|System_34、System/36でも利用されました。
System/38|System_38向けにはRPG IIIが開発されました。AS/400の登場に伴い、RPG/400が開発され、統合
データベースとの連携が強化されました。RPG/400はAS/400の主要な開発言語となり、ラインエディタで命令ごとにプロンプトが表示されるようになりました。
RPG IIIでは、IF-ENDIFブロックやDOループ、
サブルーチンといった近代的な構造が導入され、大幅な進化を遂げました。
1994年に登場したRPG IV(RPGLE、RPG/ILE)では、Report Program Generatorという名称の意味はもはやなくなり、より柔軟な記述が可能になりました。特に、Extended Factor-2 Calculation Specificationによって、より多様な表現ができるようになりました。
2001年には、RPG IVは自由形式のソースコードを受け入れるようになり、従来のコラム依存の記述から解放されました。これにより、命令コードを特定のコラムに記述する必要がなくなり、EVALやCALLPといった命令がオプションになり、現代的な汎用言語に近づきました。
現在、RPG IVはより強固な言語となり、従来の編集方法に加え、
IBMのWebsphere Development Studioを利用したPCでの編集も可能になっています。
IBMはRPGの機能拡張を継続しており、
Javaオブジェクトとの連携や、OS/400のAPI呼び出しなどが可能です。また、CGIツールキットやその他の商用パッケージを利用することで、CGIアプリケーションの開発も可能です。これらの改良にも関わらず、過去のコードとの互換性は維持されており、古いRPGプログラムもほとんど修正せずに実行できます。
RPGで使用可能な
データ型には、以下のようなものがあります。
- - 文字型 (Character)
 - - 数値型 (Numeric)
 - - 論理型 (Boolean)
 - - 日付型 (Date)
 - - 時刻型 (Time)
 - - タイムスタンプ型 (Timestamp)
 - - ポインター型 (Pointer)
 
 コード例
以下は、顧客番号を入力として受け取り、名前と住所を出力するRPGプログラムの例です。
rpg
       自由形式が許される環境もあるが、歴史的にRPGはコラムに従って記述する。
       第7コラムの星印()はコメント行を意味する。
       行の目的は第6コラムの文字で決まる。
       'F'はファイルその他の
入出力装置の仕様を示す。
       'D'は変数定義である。
       'C'は実行すべき文を示す。パラメタは plist 及び parm 命令で定義される。
       'chain' コマンドは(検索用)キーのあるファイルのランダムアクセスを行う。
       RPGはスイッチを利用する。その一つ'LR'<最終
レコード>の意味で、プログラムの実行を停止する。
Fcustfile   if   e           k disk    
D custnum          s              5p 0
D name             s             30a
D address          s             50a
C                   read   custfile                 99
C     99            if       %eof
C                   eval     inlr = on
C                   return
C                   endif
C                   move     custno        custnum
C                   chain    custnum     custfile             99
C     99            if       in99
C                   eval     name = 'not found'
C                   eval     address = 'not found'
C                   else
C                   eval     name = custname
C                   eval     address = custaddr
C                   endif
C                   dsply                  name
C                   dsply                  address
C                   eval     inlr = on
この例は、RPG IIIの形式で記述されています。以下に、RPG IV (ILE)と自由形式のRPG IVの例も示します。
RPG IV (ILE)
rpgle
     H dftactgrp(no) 
     Fcustfile   if   e           k disk    
      /free
       dcl-s custnum packed(5:0);
       dcl-s name char(30);
       dcl-s address char(50);
       read custfile;
       if %eof;
           inlr = on;
           return;
       endif;
       custnum = custno;
       chain custnum custfile;
       if in99;
          name = 'not found';
          address = 'not found';
       else;
          name = custname;
          address = custaddr;
       endif;
       dsply name;
       dsply address;
        inlr = on;
      /end-free
RPG IV (フリーフォーマット)
rpgle
     dcl-f custfile if e k disk;
     dcl-s custnum packed(5:0);
     dcl-s name char(30);
     dcl-s address char(50);
     read custfile;
     if %eof;
       inlr = on;
       return;
     endif;
     custnum = custno;
     chain custnum custfile;
     if in99;
       name = 'not found';
       address = 'not found';
     else;
       name = custname;
       address = custaddr;
     endif;
     dsply name;
     dsply address;
      inlr = *on;
 プラットフォーム
RPGはもともと、
IBMの1401, System/360, /3, /32, /34, /36, /38, AS/400, 
System iシステムで利用されていました。しかし、
IBM製以外のシステムにも移植され、Digital 
VAX、Sperry Univac BC/7、Univac system 80、Siemens BS2000、Burroughs B1700、Hewlett Packard HP3000、ICL 2900 series、WANG VSなど、幅広いシステムで利用されていました。さらに、
UNIXベースのシステムやPC環境向けの
コンパイラも存在しました。
RPG IIは、サードパーティ製の
コンパイラによって、HP 
OpenVMS operating system on 
VAX、Alpha、Integrity processorでも利用可能です。
 関連項目