IBM RPG

редактировать
Генератор программы отчетов RPG
IBM RPG logo.png
Парадигма Мультипарадигма
Разработчик IBM
Впервые появился 1959 ; 62 года назад ( 1959)
Стабильный выпуск РПГ IV версии 7, выпуск 4/6 октября 2020 г. ( 2020-10-06)
Печатная дисциплина Сильный, статичный
Операционные системы CPF, SSP, OS / 400, IBM i, OS / VS1, z / OS, DOS / VSE, VSE / SP, VSE / ESA, z / VSE, VS / 9, PRIMOS, OpenVMS, Wang VS, Burroughs MCP, HP MPE, MS-DOS, OS / 2, Microsoft Windows
Диалекты
РПГ, РПГ II, РПГ III, РПГ 400, РПГ IV, РПГ / ИЛЭ; Ролевая игра / Бесплатно, Детские / 36, Детские / 400, Решетчатая ролевая игра, VAX RPG II
Под влиянием
9PAC, FARGO

RPG - это язык программирования высокого уровня для бизнес-приложений, представленный в 1959 году для IBM 1401. Он наиболее известен как основной язык программирования линейки компьютерных продуктов IBM среднего уровня, включая операционную систему IBM i. RPG традиционно имеет ряд отличительных концепций, таких как программный цикл и синтаксис, ориентированный на столбцы. Самая последняя версия - RPG IV, которая включает ряд функций модернизации, включая синтаксис свободной формы.

СОДЕРЖАНИЕ
  • 1 Платформы
  • 2 Ранняя история
    • 2.1 РПГ II
    • 2.2 РПГ III
      • 2.2.1 DE / RPG
      • 2.2.2 РПГ / 400
      • 2.2.3 Сторонние разработки
  • 3 РПГ IV
  • 4 типа данных
  • 5 Пример кода
  • 6 См. Также
  • 7 ссылки
  • 8 Дальнейшее чтение
  • 9 Внешние ссылки
Платформы

Язык программирования RPG изначально был создан IBM для их систем 1401. Они также разработали реализацию для System / 360, и он стал основным языком программирования для их линейки компьютерных продуктов среднего уровня ( System / 3, System / 32, System / 34, System / 38, System / 36 и AS / 400. ). Также были реализации для Digital VAX, Sperry Univac BC / 7, Univac system 80, Siemens BS2000, Burroughs B700, B1700, Hewlett Packard HP 3000, серии ICL 2900, Honeywell 6220 и 2020, Four-Phase IV / 70 и IV / 90 series, Singer System 10 и WANG VS, а также различные компиляторы и среды выполнения для систем на основе Unix, таких как Infinite36 (ранее Unibol 36) и ПК (Baby / 400, Lattice-RPG).

Приложения RPG II по-прежнему поддерживаются операционными системами IBM z / VSE и z / OS, Unisys MCP, Microsoft Windows и OpenVMS.

История ранних веков

Первоначально разработанное IBM в 1959 году, название Report Program Generator описывало цель языка: создание отчетов из файлов данных. FOLDOC аккредитует Уилфа Хея на работу в IBM, результатом которой стала разработка RPG. ФАРГО ( Р ourteen-о-один utomatic R ТЧЕТ G eneration O peration) был предшественником RPG на IBM 1401.

Оба языка были предназначены для облегчения перехода технических специалистов по оборудованию счетных машин IBM (Tab) на новые на тот момент компьютеры. Специалисты по табуляторам привыкли подключать провода к панелям управления для выполнения операций ввода, вывода, управления и счетчика (сложение, вычитание, умножение, деление). Программы табуляторов выполнялись импульсами, испускаемыми в машинном цикле; следовательно, FARGO и RPG эмулировали понятие машинного цикла с программным циклом. RPG превзошла и быстро заменила FARGO в качестве предпочтительной программы генератора отчетов.

Альтернативными языками, общедоступными в то время, были Ассемблер, COBOL или FORTRAN. Ассемблер и COBOL были более распространены в бизнес-операциях мэйнфреймов ( System / 360 модели 30 и выше), а RPG чаще использовались клиентами, которые переходили от оборудования для составления таблиц (System / 360 модель 20).

РПГ II

Основная статья: RPG II

RPG II была представлена ​​в серии компьютеров System / 3. Позже он использовался в System / 32, System / 34 и System / 36 с улучшенной версией языка. RPG II также была доступна для более крупных систем, включая мэйнфрейм IBM System / 370 с DOS / VSE (затем VSE / SP, VSE / ESA и z / VSE ). ICL также выпустила версию своей операционной системы VME / K.

На заре ролевой игры ее главной сильной стороной был программный цикл. Программист напишет код для обработки отдельной записи, и программный цикл выполнит изменение для каждой записи файла, заботясь о потоке управления. В это время каждая запись (отдельная перфокарта) будет сравниваться с каждой строкой в ​​программе, которая будет воздействовать на запись или нет, в зависимости от того, был ли у этой строки «индикатор» включен или выключен. Индикатор состоял из набора логических переменных, пронумерованных 01–99 для определенных пользователем целей, или других меньших наборов, основанных на функциях обработки записей, полей или отчетов. Концепция разрывов уровней и сопоставления рекордов уникальна для языка RPG II и изначально разрабатывалась с расчетом на картридеры. Функция совпадающей записи цикла позволила легко обрабатывать файлы, имеющие отношение заголовка к детали. Программы RPG, написанные для использования преимуществ программного цикла, могут создавать сложные отчеты с гораздо меньшим количеством строк компьютерного кода, чем программы, написанные на COBOL и других бизнес-ориентированных языках.

В спецификациях файлов программы перечислены все файлы, в которые выполняется запись, чтение или обновление, а за ними следуют спецификации определения данных, содержащие программные элементы, такие как структуры данных и размерные массивы, что очень похоже на раздел «Рабочее хранилище» в программе на языке COBOL. Далее следуют спецификации вычислений, которые содержат исполняемые инструкции. Могут следовать спецификации вывода, которые можно использовать для определения макета других файлов или отчетов. В качестве альтернативы файлы, некоторые структуры данных и отчеты могут быть определены извне, что в основном устраняет необходимость вручную вводить и выводить коды (« ввод / вывод »).

РПГ III

Основная статья: RPG III

RPG III была создана для System / 38 и ее преемницы AS / 400. RPG III значительно отличается от исходного языка, предоставляя современные структурированные конструкции, такие как блоки IF-ENDIF, циклы DO и подпрограммы. RPG III также была доступна для более крупных систем, включая мэйнфрейм IBM System / 370 под управлением OS / VS1. Он также был доступен от Unisys для операционной системы VS / 9, работающей на мэйнфреймах UNIVAC Series 90.

С момента появления IBM System / 38 в 1979 году большинство программистов на RPG прекратили использование цикла в пользу управления потоком программы с помощью стандартных циклических конструкций, хотя IBM продолжала обеспечивать обратную совместимость для цикла.

DE / RPG

DE / RPG или Data Entry RPG были доступны исключительно на рабочих станциях ввода данных IBM 5280 в начале 80-х. Она была похожа на RPG III, но без внешних описаний данных (DDS) для описания данных (файлов), как в System / 38 и ее преемниках. Вместо этого часть DDS должна была быть включена в сам исходник RPG.

РПГ / 400

RPG / 400 фактически представляла собой RPG III, работающую на AS / 400. IBM переименовала компилятор RPG в «RPG / 400», но на момент его появления он был идентичен компилятору RPG III в System / 38. Практически все продукты IBM были переименованы в xxx / 400, и компилятор RPG не стал исключением. RPG III, скомпилированный с помощью компилятора RPG / 400, не предлагал ничего нового для языка RPG III, пока IBM не начала разработку новых кодов операций, таких как SCAN, CAT и XLATE, после нескольких лет доступности AS / 400. Эти улучшения RPG III не были доступны в версии System / 38 RPG III.

Сторонние разработки

Компания Amalgamated Software of North America (ASNA) в конце 1980-х годов выпустила сторонний компилятор для System / 36 под названием 400RPG. Другая компания под названием BPS создала сторонний препроцессор под названием RPG II-1/2. Оба этих продукта позволяли пользователям писать программы RPG II с кодами операций RPG III.

РПГ IV

RPG IV, также известная как RPGLE или ILE RPG) была выпущена в 1994 году как часть версии V3R2 OS / 400 (теперь известной как IBM i). С выпуском RPG IV название RPG официально перестало быть инициализмом. RPG IV предлагала большее разнообразие выражений в своей Спецификации вычисления Расширенного Фактора-2, а позже - в Спецификации Вычисления в свободном формате и Синтаксисе Процедур. RPG IV - единственная версия RPG, поддерживаемая IBM на текущей платформе IBM i.

В 2001 году, с выпуском OS / 400 V5R1, RPG IV предложила большую свободу вычислений, чем это предлагалось в Extended Factor-2 Calculation Specification: исходная запись в свободном формате с возможностью ввода текста в качестве альтернативы исходному источнику, зависящему от столбца. формат. Расчет «/ FREE» не требовал размещения кода операции в конкретном столбце; код операции не является обязательным для операций EVAL и CALLP; а синтаксис в целом более похож на синтаксис основных языков программирования общего назначения. До ноября 2013 года свободный формат применялся исключительно к расчетным спецификациям. С обновлением языка IBM i V7R1 TR7 вычисления «/ free» и «/ end-free» больше не нужны, и язык наконец-то разорвал связь с перфокартами.

Хотя редактирование по-прежнему можно выполнять через SEU, простой редактор с зеленым экраном (хотя проверка синтаксиса не поддерживается для функций, представленных начиная с IBM i V7R1), с течением времени был разработан длинный ряд инструментов. Некоторые из них включают CODE / 400 и Visual Age for RPG, разработанные IBM. В настоящее время предпочтительной платформой редактирования является клиент IBM Websphere Development Studio (WDSc), который теперь называется RDi (Rational Developer for i), который представляет собой настраиваемую реализацию Eclipse. Eclipse, а следовательно, и RDi, в основном работают на персональных компьютерах и других устройствах. IBM постоянно расширяет свои возможности и добавляет больше встроенных функций (BIF). Он имеет возможность связываться с объектами Java и API IBM i ; его можно использовать для написания программ CGI с помощью набора инструментов IBM Cgidev2 Web, RPG Toolbox и других коммерческих пакетов с поддержкой Интернета. Даже с внесенными изменениями он сохраняет значительную обратную совместимость, поэтому программа RPG, написанная 37 лет назад, может работать сегодня с небольшими изменениями или без них.

Прекомпилятор SQL позволяет нынешним разработчикам RPG воспользоваться преимуществами экономичного SQE (SQL Query Engine) от IBM. При традиционном подходе F-Spec разработчику приходилось определять конкретный путь доступа к набору данных, теперь они могут реализовывать стандартные встроенные операторы SQL непосредственно в программе. При компиляции прекомпилятор SQL преобразует операторы SQL в операторы RPG, которые вызывают программы менеджера баз данных, которые в конечном итоге реализуют запрос запроса.

Язык RPG IV основан на наборе символов EBCDIC, но также поддерживает UTF-8, UTF-16 и многие другие наборы символов. Некоторые считают, что потокобезопасные аспекты языка являются идиосинкразическими, поскольку команда компиляторов обратилась к потокам, предоставив каждому потоку свое собственное статическое хранилище, вместо того, чтобы повторно задействовать среду выполнения RPG. Было отмечено, что это размывает различие между потоком и процессом (что делает потоки RPG IV своего рода гибридом между потоками и процессами).

В 2010 году IBM выпустила RPG Open Access, также известную как Rational Open Access: RPG Edition. Он позволяет программисту определять новые обработчики ввода-вывода, что позволяет считывать и записывать данные в источники, для которых RPG не имеет встроенной поддержки.

Типы данных

RPG поддерживает следующие типы данных.

Примечание. Символ в столбце типа данных - это символ, который закодирован в Спецификации определения в столбце, предназначенном для типа данных. Для сравнения, в таком языке, как C, где определения переменных имеют свободный формат и для объявления целочисленной переменной будет использоваться ключевое слово, например int, в RPG переменная определяется со спецификацией определения фиксированного формата. В Спецификации определения, обозначенной буквой D в столбце 6 исходной строки, символ типа данных будет закодирован в столбце 40. Кроме того, если символ типа данных опущен, то есть оставлен пустым, по умолчанию используется A, если десятичные позиции не указаны, P, если десятичные позиции указаны для резервных полей, и S (ZONED), если десятичные позиции указаны в пределах структура данных.

Тип данных Имя Длина Описание
A Буквенно-цифровой символ От 1 до 16 773 104 байтов (фиксированные) от 1 до 16 773 100 байтов (переменной длины) Буквенно-цифровой символ
B Двоичное числовое 1 байт (8 бит) 2 байта (16 бит) 4 байта (32 бит) 8 байтов (64 бит) Знаковое двоичное целое число
C UCS-2 персонаж От 1 до 8 386 552 символов (фиксировано) от 1 до 8 386 550 символов (варьируется) 16-битный символ UCS-2 ( DBCS или EGCS)
D Дата 10 байт Дата: год, месяц, день
F С плавающей точкой числовой 4 байта (32-бит) 8 байтов (64-бит) Знаковое двоичное вещественное число с плавающей запятой
G Графический персонаж От 1 до 8 386 552 символов (фиксировано) от 1 до 8 386 550 символов (варьируется) 16-битный графический символ ( DBCS или EGCS)
I Целочисленный числовой 1 байт (8 бит) 2 байта (16 бит) 4 байта (32 бит) 8 байтов (64 бит) Знаковое двоичное целое число
N Индикатор символа 1 байт '1' = ИСТИНА '0' = ЛОЖЬ
O Объект Размер не разглашается Ссылка на объект
P Упакованный десятичный числовой От 1 до 63 цифр, 2 цифры на байт плюс знак Знаковое десятичное число с фиксированной точкой, целыми и дробными цифрами
S Зональный десятичный числовой От 1 до 63 цифр, 1 цифра на байт Знаковое десятичное число с фиксированной точкой, целыми и дробными цифрами
T Время 8 байт Время: час, минута, секунда
U Целочисленный числовой 1 байт (8 бит) 2 байта (16 бит) 4 байта (32 бит) 8 байтов (64 бит) Беззнаковое двоичное целое число
Z Отметка времени 26 байт Дата и время :   год, месяц, день, час, минута, секунда, микросекунды
* Базовый указатель Процедура-указатель Системный указатель 16 байт Адрес для данных Адрес для активированной процедуры Адрес для объекта
Пример кода

Следующая программа получает номер клиента в качестве входного параметра и возвращает имя и адрес в качестве выходных параметров. Это самая примитивная версия синтаксиса 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" (data) 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" (data) 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" (data) 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

Наконец, если вы примените технологию обновления 7 (TR7), относящуюся к PTF компилятора, к своей операционной системе 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 fetch first 1 row only with CS use currently committed; return; end-proc;
Смотрите также
использованная литература
дальнейшее чтение
внешние ссылки
Последняя правка сделана 2023-04-04 03:21:42
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте