IBM RPG
Paradigm(s) | Multi-paradigm |
---|---|
Appeared in | 1959 |
Developer | IBM |
Stable release | RPG IV version 7 release 1 (April 23, 2010 | )
Typing discipline | Strong, static |
Dialects | RPG, RPG II, RPG III, RPG 400, RPG IV, RPG/ILE; RPG/Free, Baby/36, Baby/400, Lattice RPG |
Influenced by | 9PAC, FARGO |
Influenced | RPG II |
OS | CPF, SSP, OS/400, OS/VS1, z/OS, VS/9, PRIMOS, OpenVMS, Burroughs MCP, Windows |
RPG is a high-level programming language (HLL) for business applications.
It has a long history, having been developed by IBM in 1959 as the Report Program Generator - a tool to replicate card processing on the IBM 1401[1] then updated to RPG II for the IBM System/3 in the late 1960s, and since evolved into an HLL equivalent to COBOL and PL/I. It remains a popular programming language on the IBM Power i platform where the current version, RPG IV (aka ILE RPG), provides a modern programming environment.
While IBM is the creator and primary vendor of RPG, the language is available from other mainframe and microcomputer manufacturers, including Unisys.
Contents |
[edit] Overview
An RPG program typically starts off with File Specifications, listing all files being written to, read from or updated, followed by Data Definition Specifications containing program elements such as Data Structures and dimensional arrays, much like a "Working-Storage" section of a COBOL program or var statements in a Pascal program. This is followed by Calculation Specifications, which contain the actual meat of the code. Output Specifications can follow which can be used to determine the layout of other files or reports. Alternatively files, some data structures and reports can be defined externally, mostly eliminating the need to hand code input and output specifications.
In the early days of RPG, its major strength was known as the program cycle: every RPG program executes within an implied loop, which can apply the program to every record of a file. At that time each record (individual punched card) would be compared to each line in the program, which would act upon the record, or not, based upon whether that line had an "indicator" turned "on" or "off" — from a set of logical variables numbered 01–99 for user-defined purposes, or other smaller sets based upon record, field, or report processing functions. The concept of level breaks and matching records is unique to the RPG II language, and was originally developed with card readers in mind.
Today, most RPG programmers avoid using the cycle in favor of controlling the flow of the program with standard looping constructs.
In 2012, iProDeveloper author Mel Beckman suggested that RPG should be considered a dead language, along with Algol, BAL, Basic, PL/I, and Snobol.[1]
[edit] History
RPG is one of the few languages created for punched card machines that is still in common use today. This is because the language has evolved considerably over time. It was originally developed by IBM in 1959. The name Report Program Generator was descriptive of the purpose of the language: generation of reports from data files, including matching record and sub-total reports.
FARGO (Fourteen-o-one Automatic Report Generation Operation) was the predecessor to RPG on the IBM 1401 . Both languages were intended to facilitate ease of transition for IBM tabulating machine (Tab) unit record equipment technicians to the then new computers.
Tab machine technicians were accustomed to plugging wires into control panels to implement input, output, control and counter operations (add, subtract, multiply, divide). Tab machines programs were executed by impulses emitted in a machine cycle; hence, FARGO and RPG emulated the notion of the machine cycle with the program cycle. RPG was superior to and rapidly replaced FARGO as the report generator program of choice.
The alternative languages generally available at the time were Assembler, COBOL or FORTRAN. COBOL was a natural language-like business oriented language and FORTRAN was a language that facilitated mathematical applications. Other languages of the era included ALGOL and Autocoder and a few years later PL/I. Assembler and COBOL were more common in mainframe business operations (System/360 models 30 and above) and RPG more commonly used by customers who were in transition from tabulating equipment (System/360 model 20).
[edit] Language evolution
RPG II was introduced with the System/3 series of computers. It was later used on System/32, System/34, and System/36, with an improved version of the language. ICL also produced a version on its VME/K operating system
RPG III was created for the System/38 and its successor the AS/400 . RPG III significantly departed from the original language, providing modern structured constructs like IF-ENDIF blocks, DO loops, and subroutines (RPG2 Supported Subroutines). RPG III was also available for larger systems including the IBM System/370 mainframe running OS/VS1. It was also available from Unisys for the VS/9 operating system running on the Univac 90/60 mainframe.
DE/RPG or Data Entry RPG was exclusively available on the IBM 5280 series of data-entry workstations in the early 80s. It was similar to RPG III but lacking external Data Descriptions (DDS) to describe data(files) like on the System/38 and its successors. Instead, the DDS part had to be included into the RPG source itself.
RPG/400 was effectively RPGIII running on AS/400. IBM renamed the RPG compiler as "RPG/400" but it was identical to the RPGIII compiler on System/38. The rebranding took place to differentiate between the earlier CISC (Complete Instruction Set Compile) on the beige boxes to the later 'faster' RISC (Reduced Instruction Set Compile), usually on the black servers. Virtually all IBM products were rebranded as xxx/400 and the RPG compiler was no exception. RPGIII compiled with the RPG/400 compiler offered nothing new to the RPGIII language until IBM began development of new operation codes, such SCAN, CAT and XLATE after several years of AS/400 availability. These enhancements to RPGIII were not available in the System/38 version of RPGIII.
RPG IV (aka RPGLE, aka ILE RPG[2]) was released in 1994 and the name, officially, was no longer an initialism. RPG IV offered a greater variety of expressions within its Extended Factor-2 Calculation Specification and, later in life, its free-format Calculation Specifications and Procedure syntax. RPG IV is the only version of RPG supported by IBM on its long-line of successors to the AS/400 system.
[edit] RPG IV, a modern language
In 2001, with the release of OS/400 V5R1, RPG IV offered even greater freedom for calculations than offered by the Extended Factor-2 Calculation Specification: a free-format text-capable source entry, as an alternative to the original column-dependent source format. The "/FREE" calculation does not require the operation code to be placed in a particular column; the operation code is optional for the EVAL and CALLP operations; and syntax generally more closely resembles that of mainstream, general-purpose programming languages. However, the free format only applies to the calculation specifications. F and D specifications still need to be in column-dependent format.
Today, RPG IV is a considerably more robust language. Editing can still be done via the simple green screen editor (even though syntax checking is not supported for features introduced from OS 7.1 onwards) or it can be edited via PC using IBM's Websphere Development Studio now named RDi (Rational Development Studio for i) a customized implementation of Eclipse. IBM is continually extending its capabilities and adding more built-in functions (BIFs). It has the ability to link to Java objects,[3] and i5/OS APIs; it can be used to write CGI programs with the help of IBM's Cgidev2 web toolkit,[4] RPGLIB (a collection of hundreds of pre-written RPG IV routines), CGILIB, the RPG Toolbox, and other commercial Web enabled packages. Even with the changes, it retains a great deal of backward compatibility, so an RPG program written 37 years ago could run today with little or no modification.
Furthermore, with the implementation of the SQL Precompiler, current RPG developers can take advantage of IBM's cost-based SQE (SQL Query Engine). As opposed to the traditional F-Spec approach, where a developer identified a specific access path to a data set, a developer can now implement standard embedded SQL statements directly in the program. When compiled, the SQL Precompiler transforms the invalid embedded SQL statements into valid RPG statements that call the database manager programs that ultimately implement the query request.
OS/400 was later renamed i5/OS to correspond with the new IBM System i5 branding initiative; the 5 was later dropped in favor of just System i. In March 2008 i5/OS was renamed IBM i as part of the Power Systems consolidation of System i and System p product lines. The new Power Systems also adopt more mainstream version numbers, substituting 6.1 for the twenty year old V1R1M0 notation. The latest release is now referred to as IBM i 7.1 and fully supports the RPG IV language, as well as many others. WebSphere Development Studio Client (WDSC) is now referred to as Rational Developer for i (RDi), of which three product levels are available. They are called Rational Developer for i (RDi), RDi Service Oriented Architecture (RDi SOA), and Rational Application Developer (RAD). The new lineup provides in more granular packaging all of the development tools and support previously offered by WDSC and WDSC Advanced Edition.
Some of the more unmodern features of the language include the dependency on the EBCDIC character sets which means that use of UTF-8 requires considerable effort and is quite risky (the programmer has to take responsibility not to get his/her character data mixed up with a single byte CCSID), whereas 16 bit characters (e.g. UTF-16) are supported directly via a separate datatype (Graphic). The threadsafeness of the language is also a bit odd as the compiler team has solved this by giving each thread its own static storage, rather than make the RPG run-time environment re-entrant. This has been noted to meddle up the distinction between a thread and a process (making RPG IV threads a kind of hybrid between threads and processes).
[edit] Data types
RPG supports the following data types.[5][6]
Data type | Name | Length | Description |
---|---|---|---|
A |
Alphanumeric character | 1 to 32,766 bytes | Alphanumeric character |
B |
Binary numeric | 2 byte (16-bit) 4 bytes (32-bit) |
Signed binary integer |
D |
Date | 10 bytes | Date: year, month, day |
F |
Floating point numeric | 4 bytes (32-bit) 8 bytes (64-bit) |
Signed binary floating-point real |
G |
Graphic character | 1 to 32,766 bytes | 16-bit graphic character (DBCS or EGCS) |
I |
Integer numeric | 1 byte (8-bit) 2 bytes (16-bit) 4 bytes (32-bit) 8 bytes (64-bit) |
Signed binary integer |
U |
Integer numeric | 1 byte (8-bit) 2 bytes (16-bit) 4 bytes (32-bit) 8 bytes (64-bit) |
Unsigned binary integer |
P |
Packed decimal numeric | 1 to 30 digits, 2 digits per byte plus sign |
Signed fixed-point decimal number with integer and fraction digits |
S |
Zoned decimal numeric | 1 to 30 digits, 1 digit per byte |
Signed fixed-point decimal number with integer and fraction digits |
T |
Time | 6, 12, or 14 bytes | Time: hour, minute, second, microseconds |
Z |
Timestamp | 26 bytes | Date and time: year, month, day, hour, minute, second, microseconds |
[edit] Example code
The following program receives a customer number as an input parameter and returns the name and address as output parameters.
* Historically RPG is columnar in nature, though free-formatting * is allowed under particular circumstances. * The purpose of various lines code are determined by a * letter code in column 6. * An asterisk (*) in column 7 denotes a comment line * "F" (file) specs define files and other i/o devices F ARMstF1 IF E K Disk Rename(ARMST:RARMST) * "D" specs are used to define variables D pCusNo S 6p 0 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" (calculation) specs are used for executable statements * Parameters are defined using plist and parm opcodes C *entry plist C parm pCusNo C parm pName C parm pAddr1 C parm pAddr2 C parm pCity C parm pState C parm pZip * The "chain" command is used for random access of a keyed file C pCusNo chain ARMstF1 * If a record is found, move fields from the file into parameters C if %found C eval pName = ARNm01 C eval pAddr1 = ARAd01 C eval pAddr2 = ARAd02 C eval pCity = ARCy01 C eval pState = ARSt01 C eval pZip = ARZp15 C endif * RPG makes use of switches. One switch "LR" originally stood for "last record" * LR actually flags the program and its dataspace as removable from memory. C eval *InLR = *On
The same program using free calculations:
* "F" (file) specs define files and other i/o devices FARMstF1 IF E K Disk Rename(ARMST:RARMST) * "D" specs are used to define variables and parameters * The "prototype" for the program is in a separate file * allowing other programs to call it /copy cust_pr * The "procedure interface" describes the *ENTRY parameters D getCustInf PI D pCusNo 6p 0 const D pName 30a D pAddr1 30a D pAddr2 30a D pCity 25a D pState 2a D pZip 10a /free // The "chain" command is used for random access of a keyed file chain pCusNo ARMstF1; // If a record is found, move fields from the file into parameters if %found; pName = ARNm01; pAddr1 = ARAd01; pAddr2 = ARAd02; pCity = ARCy01; pState = ARSt01; pZip = ARZp15; endif; // RPG makes use of switches. One switch "LR" originally stood for "last record" // LR actually flags the program and its dataspace as removable from memory. *InLR = *On; /end-free
Assume the ARMSTF1 example table was created using the following SQL Statement:
create table armstf1 (arcnum decimal(7,0), arname char(30), aradd1 char(30), aradd2 char(30), arcity char(25), arstte char(2), arzip char(10))
The same program using free calculations and embedded SQL:
* RPG IV no longer requires the use of the *INLR indicator to terminate a program. * by using the MAIN keyword on the "H" (Header) spec, and identifying the "main" or * entry procedure name, the program will begin and end normally without using the * decades-old RPG Cycle and instead a more "C like" begin and end logic. H MAIN(getCustInf) * "D" specs are used to define variables and parameters * The "prototype" for the program is in a separate file * allowing other programs to call it /copy cust_pr * The "procedure interface" describes the *ENTRY parameters P getCustInf B D getCustInf PI D pCusNo 6p 0 const D pName 30a D pAddr1 30a D pAddr2 30a D pCity 25a D pState 2a D pZip 10a /free exec sql select arName, arAddr1, arAdd2, arCity, arStte, arZip into :pName, :pAddr1, :pAddr2, :pCity, :pState, :pZip from ARMstF1 where arCNum = :pCusNo for fetch only fetch first 1 row only optimize for 1 row with CS; /end-free P GetCustInf E
As of V7R1 of the operating system, the above program would not necessarily need the prototype in a separate file, so it could be completely written as:
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 row only with CS use currently committed; /end-free P GetCustInf E
[edit] Platforms
As stated above, the RPG programming language originally was introduced by IBM for their proprietary 1401, /360, /3, /32, /34, /36, /38 AS/400 and System i systems. There have also been implementations for the Digital VAX, Sperry Univac BC/7, Univac system 80, Siemens BS2000, Burroughs B700, B1700, Hewlett Packard HP3000, ICL 2900 series, Honeywell 6220 and 2020, Four-Phase IV/70 and IV/90 series and WANG VS, as well as miscellaneous compilers & runtime environments for Unix-based systems (INFINITE 36 (formerly UNIBOL36)) and PCs (Baby/400, Lattice-RPG).
The latest platform to receive an RPG compiler is Windows .Net through the WINRPG compiler. This version contains extensions to RPG IV beyond that of the base IBM compiler. These extensions provide Windows and .Net hooks.
RPG II applications are still supported under the IBM z/VSE and z/OS operating systems, HP MPE operating system on HP3000 and the OpenVMS operating system on VAX, Alpha, and Unisys MCP.
[edit] References
This article needs additional citations for verification. (February 2008) |
- ^ "...IBM 1401 and the Report Program Generator (RPG) contributed significantly to this success...", IBM 1401 Data Processing System / 1959
- ^ "Generating Random Numbers in ILE RPG Using the CEERAN0 API", IBM.com
- ^ http://publib.boulder.ibm.com/iseries/v5r1/ic2924/books/c0918160.pdf
- ^ http://www.easy400.net/cgidev2/start
- ^ "RPG/400 Reference". IBM. June 1994. http://publib.boulder.ibm.com/infocenter/iseries/v5r3/topic/books/c0918170.pdf.
- ^ "RPG/400 User's Guide". IBM. June 1994. http://publib.boulder.ibm.com/infocenter/iseries/v5r3/topic/books/c0918160.pdf.
[edit] Further reading
- McGee, W.C. (September 1981). "Data Base Technology" (PDF). IBM Journal of Research and Development (IBM) 25 (5, 25th Anniversary Issue): 514. http://www.research.ibm.com/journal/rd/255/ibmrd2505O.pdf. "...original report program generator was the IBM Report Program Generator introduced in the early 1960s for the IBM 1401 computer. It was patterned after the SHARE 9PAC system..."
- "9PAC, Report Generator". History of Programming Languages (HOPL), Murdoch University, AU. 2006. http://hopl.murdoch.edu.au/showlanguage2.prx?exp=35.
- "RPG, Report Program Generator". History of Programming Languages (HOPL), Murdoch University, AU. 2006. http://hopl.murdoch.edu.au/showlanguage2.prx?exp=207.
- DuCharme, Bob (2006-02-26). "Pulling data out of computers in the mid-twentieth and early twenty-first centuries". http://www.snee.com/bobdc.blog/2006/02/pulling_data_out_of_computers.html.
- Cozzi, Robert (1996). "The Modern RPG IV Language". http://mc-store.com/5080.html.
- Shelly, Gary B.; Thomas J. Cashman (1977). Introduction to Computer Programming RPG. Fullerton, California: Anaheim Publishing Company. ISBN 0-88236-225-9.
[edit] External links
- Smith, Brian R.; Martin Barbeau, Susan Gantner, Jon Paris, Zdravko Vincetic, Vladimir Zupka (Updated April 25, 2000). "Who Knew You Could Do That with RPG IV? A Sorcerer’s Guide to System Access and More" (PDF). IBM International Technical Support Organization. https://www.redbooks.ibm.com/redbooks/pdfs/sg245402.pdf. Retrieved 2012-02-18. "This redbook is focused on RPG IV as a modern, thriving, and rich application development language for the 21st century."
- RPG IV for beginners - A basic tutorial for beginners is available here.
- Midrange.com - A large amount of code examples are available here
- RPG OPEN - A free open source service program with add-on subprocedures written in RPG IV for RPG IV.
- IBM (1964) (PDF). IBM 1401 RPG manual. C24-3261-1. http://www.bitsavers.org/pdf/ibm/140x/C24-3261-1_1401_diskRPG.pdf.
- IBM (2008) (PDF). ILE RPG Programmer's Guide. SC09-2507-07. http://publib.boulder.ibm.com/infocenter/iseries/v6r1m0/topic/rzasc/sc092507.pdf.
- RPG for COBOL programmers - Article
- RPG II for MVS, OS/390 and z/OS - Status of the IBM RPG II product in z/OS