**آر پی جی (زبان برنامه‌نویسی مبتنی بر آی بی ام)**

زبان RPG یک زبان برنامه‌نویس سطح بالا (HLL) برای برنامه‌های کاربردی تجاری است. زبان RPG یک زبان برنامه‌نویسی اختصاصی IBM است و نسخه‌های بعدی ان تنها در IBM یا سیستم‌های مبتنی بر OS/400 موجود هستند.

این زبان تاریخچه طولانی دارد، در سال ۱۹۵۹ توسط ای بی ام به صورت Report Program Generator (تولیدکننده برنامه گزارش) – ابزاری برای تکثیر پردازش کارت پانچ شده روی ای بی ام ۱۴۰۱ – ساخته شد و بعد در اواخر دهه ۱۹۶۰ میلادی به صورت RPG II برای IBM System/3 ارتقاء داده شد و از ان زمان به بعد به صورت یک HLL معادل COBOL و PL/I درآمد.

این زبان به عنوان زبان برنامه‌نویسی رایج در سیستم عامل ای بی ام ای باقی مانده‌است، این سیستم عامل در سخت‌افزار IBM Power I Platform اجرا می‌شود. نسخه فعلی، RPG IV (ILE RPG نیز نامیده می‌شود) یک محیط برنامه‌نویسی مدرن را فراهم می‌سازد.

بررسی کلی
---------

برنامه RPG ابتدا با File Specifications (مشخصات فایل) آغاز به کار کرد که همه فایل‌هایی که در ان نوشته می‌شدند، از ان خوانده می‌شدند یا به روزرسانی می‌شدند را فهرست بندی می‌کرد، بعد Date Definition Specifications (مشخصات تعریف داده‌ها) قرار داشت که اجزای برنامه مانند Data Structures (سازه‌های داده‌ها) و ارایه‌های بعد دار را داشت، این بسیار شبیه بخش Working-Storage برنامه COBOL یا بیانیه‌های Var در پاسکال بود. سپس Calculation Specifications (مشخصات محاسبه) قرار داشت که حاوی دستورالعمل‌های قابل اجرا بود. بعد Output Specifications (مشخصات برون داد) می‌تواند وجود داشته باشد که می‌توان از ان برای تعیین طرح کلی سایر فایل‌ها یا گزارشات استفاده کرد. در عوض فایل‌ها، بعضی از سازه‌های داده‌ها و گزارشات را می‌توان در بیرون تعریف کرد که اغلب نیاز به کدگذاری دستی مشخصات درون داد و برون داد (I/O) را برطرف می‌کند.

در روزهای اول RPG، نقطه قوت عمده ان سیکل برنامه بود: هر برنامه RPG در یک حلقه ضمنی اجرا می‌شود که می‌تواند برنامه را برای هر ضبط فایل به کار ببرد. در ان زمان هر ضبط (کارت پانچی انفرادی) با هر خط در برنامه مقایسه می‌شد که براساس ضبط کار می‌کرد نه براساس اینکه ایا خط دارای اندیکاتور روشن یا خاموش است یا خیر – از مجموعه‌ای از متغیرهای منطقی با شماره ۰۱ الی ۹۹ برای اهداف کاربر نهایی، یا سایر مجموعه‌های کوچکتر براساس ضبط، میدان یا عملکردهای پردازش گزارش. مفهوم قطع سطح و تطبیق ضبط‌ها مختص زبان RPG II است و ابتدا با داشتن کارت خوان در ذهن ساخته شد.

از زمان ورود سیستم ۳۸ در ۱۹۷۹ میلادی، اکثر برنامه نویسان RPG به نفع کنترل جریان برنامه با ساختارهای حلقه استاندارد دست از استفاده از سیکل برداشتند با این وجود ای بی ام همچنان به تأمین سازگاری وارونه برای سیکل ادامه داده است.

تاریخچه
-------

زبان RPG یکی از چند زبانی است که برای ماشین‌های Punched Card ساخته شد که تا امروز همچنان از آن‌ها استفاده می‌شود. علت این است که این زبان به مرور زمان در حد قابل توجهی رشد کرده‌است. این زبان ابتدا در ۱۹۵۹ میلادی توسط ای بی ام ساخته شد. نام Report Program Generator (تولیدکننده برنامه گزارش) گویای هدف این زبان است: تولید گزارش از فایل‌های داده‌ها از جمله کارت تطبیق و گزارشات نیمه کلی.

فارگو (FARGO) (عملیات تولید گزارش اتوماتیک چهارده به یک) پیش پردازشگر RPG در ای بی ام ۱۴۰۱ بود. هدف از هر دو زبان تسهیل تبدیل جدول‌نویس ای بی ام (tab) و تجهیزات ضبط واحد به رایانه‌ای جدید برای تکنیسین‌ها بود.

تکنیسین‌های ماشین جدول‌بندی به زدن سیم به پانل‌های کنترل برای اجرای درون داد، برون داد، کنترل و عملیات‌های شمارشگر (جمع، تفریق، ضرب و تقسیم) عادت داشتند. برنامه‌های ماشین‌های جدول با ضربه‌های خارج شده در سیکل ماشین اجرا می‌شدند؛ بنابراین، FARGO و RPG از مفهوم سیکل ماشین با سیکل برنامه تقلید کردند. زبان RPG بهتر از FARGO بود و به عنوان برنامه برتر تولید گزارش سریع جایگزین ان شد.

زبان‌های جایگزینی که در ان زمان معمولاً رواج داشتند Assembler, COBOL یا FORTRAN بودند. زبان COBOL یک زبان تجارت گرای شبیه زبان طبیعی بود و FORTRAN زبانی بود که برنامه‌های کاربردی ریاضیات را آسان می‌کرد. سایر زبان‌های این دوره شامل ALGOL و Autocoder بودند و چند سال بعد PL/I آمد. اسمبلر و COBOL در عملیات‌های تجاری پردازنده مرکزی رواج بیشتری داشتند (سیستم /۳۶۰ مدل‌های ۳۰ و بالاتر) و RPG به تازگی توسط مشتریانی مورد استفاده قرار می‌گیرد که در حال‌گذار از تجهیزات جدول‌بندی هستند (سیستم / ۳۶۰ مدل ۲۰).

تکامل زبان
----------

زبان RPG II با مجموعه رایانه‌های سیستم / ۳ معرفی شد. بعداً در سیستم / ۳۲، سیستم / ۳۴، و سیستم / ۳۶ با نسخه ارتقاء یافته زبان به کار برده شد؛ و RPG II برای سیستم‌های بزرگتر نیز موجودبود از جمله پردازنده مرکزی سیستم ای بی ام / ۳۷۰ که DOS/VSE را اجرا می‌کند (بعد VSE/SP, VSE/ESA و z/VSE). همچنین ICL روی سیستم عامل VME/K خود یک نسخه تولید کرد.

زبان RPG III برای سیستم / ۳۸ و جانشین ان AS/400 ساخته شد. زبان RPG III به‌طور چشمگیری با زبان اولیه فاصله گرفت، سازه‌های ساختاربندی شده مدرن مانند بلوک‌های IF-ENDIF، حلقه‌های DO، و subroutines (RPG2 Supported Subroutines) را فراهم کرد. همچنین RPG III برای سیستم‌های بزرگتر از جمله پردازنده مرکزی سیستم ای بی ام / ۳۷۰ که OS/VSI را اجرا می‌کند فراهم شد. این زبان از Unisys برای سیستم عامل VS/9 که در پردازنده‌های مرکزی UNIVAC Series 90 اجرا می‌شوند نیز فراهم شد.

در اوایل دهه ۱۹۸۰ میلادی، DE/RPG یا Date ntry RPG تنها در مجموعه ایستگاه‌های ثبت داده‌های ای بی ام ۵۲۸۰ موجود بود. این زبان شبیه RPG III بود اما Data Descriptions (DDS) خارجی برای تشریح (فایل‌های) داده‌ها در سیستم / ۳۸ و جانشین‌های آن را نداشت. در عوض بخش DDS باید در خود منبع RPG گنجانده می‌شد.

زبان RPG/400 زبان RPG بود که به‌طور اثربخش در AS/400 اجرا می‌شد. ای بی ام نام کامپایلر RPG را به RPG/400 تغییر داد اما در زمان ورودش با کمپایلر RPG III در سیستم / ۳۸ همسان بود. تغییر برند به خاطر ایجاد تمایز بین CISC قبلی (Complex Instruction Set Compiler) در جعبه‌های بژ با RISC سریع بعدی (Reduced Instruction Set Compiler) انجام شد که معمولاً در سرورهای سیاه است. همه محصولات ای بی ام عملاً برند xxx/400 را داشتند و کامپایلر RPG از این امر مستثنی نبود؛ و RPG III با کامپایلر RPG /400 همگردان شد که چیز جدیدی برای زبان RPG III نداشت تا اینکه‌ای بی ام پس از چند سال موجود بودن AS/400 شروع با ساخت کدهای عملیاتی جدید کرد مانند SCAN, CAT، و XLATE. این ارتقاءهای RPG III در نسخه RPG III سیستم / ۳۸ موجود نبود.

زبان RPG IV (که RPGLE یا ILE RPG نیز نامیده می‌شود) در ۱۹۹۴ منتشر شد و نام ان رسماً دیگر initialim نبود. زبان RPG IV تنوع وسیعی از عبارات را در Extended Factor-2 Calculation Specification (مشخصات محاسبه فاکتور ۲ بسط یافته) و Procedure sytnax (نحو روش) عرضه کرد. زبان RPG IV تنها نسخه RPG بود که RPG در خط بلند پردازشگرهای سیستم AS/400 (iSeries و غیره) از ان پشتیبانی کرد.

RPG IV
------

در ۲۰۰۱ میلادی با انتشار OS/400 V5R1، RPG IV در مقایسه با Extended Factor-2 Calculation Specification آزادی بیشتری را برای محاسبات فراهم آورد: مدخل منبع دارای متن با فرمت آزاد، یک جایگزین برای فرمت منبع وابسته به ستون اولیه. محاسبه "/Free" نیازی به قرار دادن کد عملیات در یک ستون خاص ندارد؛ کد عملیات برای عملیات‌های EVAL و CALLP اختیاری است؛ و syntax (نحو) به‌طور کلی بسیار شبیه پردازنده مرکزی، زبان‌های برنامه‌های همه منظوره، بود. تا نوامبر ۲۰۱۳، فرمت آزاد تنها برای Calculation Specification اعمال می‌شد. با ارتقاء V7R1 TR7 برای زبان دیگر نیازی به محاسبات "/free" و "/end-free" نبود و زبان در نهایت به گره‌هایی برای کارت‌های پانچ شده تبدیل شد.

امروزه، RPG IV زبان محکم تری است. هر چند که می‌توان هنوز هم ویرایش را با SEU انجام داد که ویرایشگر صفحه ساده و سبز (هر چند که بررسی نحو برای مشخصات معرفی شده از OS 7.1 به بعد حمایت نمی‌شود) است اما پیشرفت طولانی ابزار به مرور زمان رخ داده است. بعضی از این‌ها شامل Code/400 و Visual Age برای RPG بوده‌اند که توسط ای بی ام ساخته شدند و Jon Paris و دیگران آن‌ها را ارتقاء دادند. به تازگی پلتفرم ویرایش مطلوب، Sebsphere Development Studio client است که اینک RDi (Rational Developer for i) نامیده می‌شود که اجرای سفارشی شده Eclipse است. اکلیپس و همچنین RDo در اصل در رایانه‌های شخصی و در سایر ابزار اجرا می‌شوند. ای بی ام مرتب توانایی‌های آن را افزایش می‌دهد و عملکردهای توکار بیشتری (BIF) را اضافه می‌کند. این توانایی وصل شدن به اشیاء جاوا و i5/OS APls را دارد؛ می‌توان از ان برای نوشتن برنامه‌های CGI با کمک جعبه ابزار وب Cqidev2 ای بی ام، Cozzi app-Tools (مجموعه‌ای از روتین‌های RPG و CGI برای RPG IV), CGILIB, RPG Toolbox و سایر بسته‌های تجاری Web-enabled استفاده کرد. این حتی با تغییراتش هم سازگاری وارونه بسیار زیادی را دارد بنابراین یک برنامه RPG که ۳۷ سال پیش نوشته شده‌است اینک با کمی تغییر یا بدون تغییر هنوز هم اجرا می‌شود.

پریکامپایلر SQL به سازندگان RPG فعلی این امکان را می‌دهد که از مزیت SQE هزینه محور ای بی ام (SQL Query Engine موتور جستجوی اس کیو ال) بهره ببرند. یک سازنده با یک رویکرد F-Spec سنتی باید مسیر دسترسی خاص به مجموعه داده‌ها را مشخص کند اینک آن‌ها می‌توانند جملات SQL جاساز شده‌استاندارد را مستقیماً در برنامه اجرا کنند. وقتی پریکامپایلر SQL کامپایل می‌شود جملات SQL جاساز شده نامعتبر را تبدیل به جملات RPG معتبر می‌کند که برنامه‌های مدیر پایگاه داده‌ها که در نهایت درخواست جستجو را اجرا می‌کنند را فرا می‌خوانند.

در ۲۰۰۶ میلادی، نام OS/400 به i5/OS تغییر یافت تا با ابتکار عمل برندگذاری IBM System جدید مطابقت داشته باشد؛ این ۵ بعداً به نفع System i کنار گذاشته شد. در مارس ۲۰۰۸، به عنوان بخشی از ادغام خطوط محصول System i و System p سیستم‌های نیرو، نام i5/ OS به IBM i تغییر یافت. سیستم‌های نیروی جدید نیز شماره‌های نسخه پردازنده مرکزی را اتخاذ می‌کنند، ۶٫۱ را جایگزین نشان‌گذاری V 1R1M0 بیست ساله می‌کنند. جدیدترین نسخه منتشر شده اینک IBM I 7.3 نامیده می‌شود و کاملاً زبان RPG IV و همچنین بسیاری دیگر را حمایت می‌کنند. مشتری WebSphere Development Studio (WDS) اینک Rational Developer برای i (RD i) نامیده می‌شود که سه سطح محصول از آن‌ها موجود است. آن‌ها Rational Developer for I (RDi), RDi Service Oriented Architecture (RD I SOA), Rational Application Developer (RAD) نامیده می‌شوند. صف جدید، بسته‌بندی دانه‌ای تری از همه ابزار توسعه را فراهم می‌سازد و آنهایی که قبلاً با WDSc و WDSc Advanced Edition عرضه شده‌اند را حمایت می‌کنند.

این زبان براساس مجموعه کاراکتر EBCDIC است اما UTF-8، UTF-16 و بسیاری دیگر از مجموعه‌های کاراکتر را نیز حمایت می‌کند. عده‌ای ابعاد رشته ایمن زبان را شخصی و خاص در نظر می‌گیرند زیرا تیم کامپایلر با دادن یک ذخیره ایستا به هر رشته، به ان پرداخته است نه اینکه محیط زمان اجرای RPG را قابل ورود مجدد کند. این برای مبهم کردن تمایز بین رشته و پروسه گفته شده‌است (رشته‌های RPG IV تبدیل به نوعی پیوند بین رشته‌ها و پروسه‌ها می‌شوند).

دسترسی آزاد RPG
---------------

در سال ۲۰۱۰ میلادی با نام کامل Rational Open Access: RPG Edition آغاز به کار کرد.

استیو ویل معمار ارشد ای بی ام ای هنگام آغاز به کار ان اینطور آن را تشریح کرد: یک ارتقاء که واقعاً یک تغییر معماری است که RPG را برای کل کاربردهای جدید می‌گشاید؛ و IBM i، دوستان ما در IBM Rational، و چند ISV که با IBM برای یک دستاورد مهم کار کرده‌اند آن را برای جامعه به ارمغان می‌آورند. ایده پشت این توانمندی جدید رفع نیاز به برون داد از برنامه‌های RPG که به زور وارد جریان محدود داده‌های ۵۲۵۰ می‌شوند است. در عوض، می‌توان آن را به رسیدگی کنندگان داد، آن‌ها می‌توانند آن را به هر نحوی که بخواهند تغییر دهند. آن را در XML بگذار؛ آن را در فرمت مورد نیاز یک ابزار فراگیر قرار ده؛ یک وب پیچ بساز که مانند صفحه ۵۲۵۰ نباشد؛ هر چه می‌خواهید.

هرچند که بسیاری از شرکت‌ها نسبت به مفید بودن Open Access شک داشتند اما Open Access خیلی زود مورد استقبال دیگران قرار گرفت از جمله Profound Logic که با هدف بازکردن i به سرعت آن را وارد محصولات خود کرد و اسکات کلمنت که سازنده محصول بود و به خاطر ابزارهای منبع آزاد مشهور شده بود را برای دسترسی به این فناوری استخدام کرد.

انواع داده‌ها
-------------

انواع داده‌های زیر مورد حمایت RPG هستند:

نکته:

کاراکتر ستون نوع داده‌ها کاراکتری است که در Definition Specification در ستون طراحی شده برای نوع داده‌ها کدگذاری می‌شود. برای مقایسه، در زبانی مانند C، که در ان تعریف متغیرها فرمت آزاد است و از یک کلید واژه مانند int برای اعلان یک متغیر صحیح استفاده می‌کند در RPG، متغیر با Definition Specification فرمت ثابت تعریف می‌شود. در Definition Specification که با حرف D در ستون ۶ خط منبع نشان داده می‌شود کاراکتر نوع داده‌ها در ستون ۴۰ کدگذاری می‌شود. همچنین، اگر کاراکتر data type (نوع داده‌ها) حذف شود یعنی خانه خالی شود چنانچه هیچ موقعیت دهدهی مشخص نشود پیش‌فرض A خواهد بود. در غیر این صورت پیش‌فرض P خواهد بود.


| Data type | Name | Length | Description |
| --- | --- | --- | --- |
| `A` | Alphanumeric character | 1 to 16,773,104 bytes (fixed)1 to 16,773,100 bytes (varying-length) | Alphanumeric character |
| `B` | Binary numeric | 1 byte (8-bit)2 byte (16-bit)4 bytes (32-bit)8 bytes (64-bit) | Signed binary integer |
| `C` | UCS-2 character | 1 to 8,386,552 characters (fixed)1 to 8,386,550 characters (varying) | 16-bit UCS-2 character (DBCS or EGCS) |
| `D` | Date | 10 bytes | Date: year, month, day |
| `F` | ممیز شناور numeric | 4 bytes (32-bit)8 bytes (64-bit) | Signed binary floating-point real |
| `G` | Graphic character | 1 to 8,386,552 characters (fixed)1 to 8,386,550 characters (varying) | 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 |
| `N` | نوع داده بولی | 1 byte | '1' = TRUE'0' = FALSE |
| `O` | Object | Size undisclosed | Object reference |
| `P` | Packed decimal numeric | 1 to 63 digits,2 digits per byte plus sign | Signed fixed-point decimal number with integer and fraction digits |
| `S` | Zoned decimal numeric | 1 to 63 digits,1 digit per byte | Signed fixed-point decimal number with integer and fraction digits |
| `T` | Time | 8 bytes | Time: hour, minute, second |
| `U` | Integer numeric | 1 byte (8-bit)2 bytes (16-bit)4 bytes (32-bit)8 bytes (64-bit) | Unsigned binary integer |
| `Z` | Timestamp | 26 bytes | Date and time:year, month, day, hour, minute, second, microseconds |
| `*` | Basing-PointerProcedure-PointerSystem-Pointer | 16 bytes | Address to DataAddress to Activated ProcedureAddress to Object |

نمونه کد
--------

برنامه زیر شماره‌هایی را به عنوان پارامترهای ورودی از کاربر می‌گیرد و اسم و آدرس را به عنوان پارامترهای خروجی تحویل می‌دهد این نسخه ابتدایی‌ترین کد RPG IV می‌باشد شبیه این برنامه بعداً با نسخه‌ها و دستورات جدید تر نشان داده خواهد شد.

```
 * Historically RPG was columnar in nature, though free-formatting
 * was 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
 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 flags the program and its dataspace as removable from memory
```

```
 C eval *InLR = *On
```

همان برنامه می‌باشد که با استفاده از محاسبات در دسترس V5R1 نوشته شده‌است

```
  * "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

```

فرض کنید مثال جدول ARMSTF1 با استفاده از دستورات SQL ایجاد شده بود:

```
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))

```

همان برنامه با استفاده از محاسبات 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

```

با وجود سیستم عامل 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 row only
 with CS
 use currently committed;
 /end-free
 P GetCustInf E

```

درنهایت اگر شما برای سیستم عامل ۷٫۱ خود از کامپایلر PTFS استفاده کنیم کد بالا به صورت مستقل مانند زیر نوشته می‌شود:

```
 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
 fetch first 1 row only
 with CS
 use currently committed;
 return;
 end-proc;

```

پلتفرم‌ها
---------

همان‌طور که در بالا گفته شد زبان برنامه‌نویسی RPG ابتدا توسط ای بی ام برای تملک ۱۴۰۱، ۳۶۰/، ۳/، ۳۴/، ۳۶/، 38/ AS/۴۰۰ و سیستم‌های System i معرفی شد. همچنین کاربردهایی برای Digital VAX, Sperry Univac BC/7، Univac system 80، Siemens BS2000، Burroughs B700، B1700، Hewlett Packard HP3000، مجموعه‌های ICL 2900، Honeywell 6220 و ۲۰۲۰، مجموعه‌های Four-Phase IV/60 و IV/90، Singer System 10 و WANG VS و همچنین کمپایلرهای متفرقه و محیط‌های عادی برای سیستم‌های مبتنی بر یونیکس مانند Infinite 36 (قبلاً Unibol 36 نامیده می‌شد) و PCها (Baby/400، Lattice- RPG) نیز وجود داشت.

آخرین پلتفرمی که کمپایلر RPG را دریافت می‌کند Windows.Net از طریق کمپایلر WIN RPG است که با I-Net System Solutions در مارس ۲۰۱۳ خریداری شد. این نسخه شامل پسوندهایی برای RPG IV فراتر از کمپایلر IBM پایگاه است. این پسوندها برای مایکروسافت ویندوز و Net قلاب‌هایی را در Native و در محیط System 36 فراهم می‌کنند و همچنین توانایی وارد کردن فایل‌های DB/2 به پایگاه داده‌های Microsoft Access و Microsoft SQL Server را از طریق ODBC برای آن‌ها فراهم می‌کنند.

برنامه‌های کاربردی RPG II هنوز هم در سیستم‌های عامل z/VSE و z/OS ای بی ام، سیستم عامل HP MPE در HP3000 و سیستم عامل OpenVMS در VAX, Alpha و Unisys MCP و Windows Servers و Desktops در I-Net RPG حمایت می‌شوند.

منابع
-----

*