Первый взгляд на RPG: оказывается, это не только ролевые игры

    Многие из вас слышали об одном из старейших языков программирования COBOL, а также о том, что как сильно сейчас нужны COBOL-программисты для поддержки старого кода. Существует еще один «старожил», о котором знают немногие, который используется сейчас и будет использоваться еще достаточно долгое время для написания программ в различных сферах человеческой деятельности (финансовой, банковской и др.). Имя этому языку — IBM RPG.

    Picture 3

    Once upon a time...


    RPG — проприетарный язык программирования высокого уровня, являющийся собственностью корпорации IBM, для создания бизнес-приложений. Последние версии языка доступны только для операционной системы IBM i (и ее прошлых версий под старым названием OS/400).

    У RPG более чем полувековая история. К концу 50-х IBM выпустила огромное количество электромеханических машин, называемых табуляторами. Последним серийным табулятором стала модель IBM 407 Accounting Machine:

    Рисунок 1. IBM 407 в Арсенале армии США в 1961 году.

    Рисунок 1. IBM 407 в Арсенале армии США в 1961 году.

    К слову, аренда такого табулятора в зависимости от модели стоила от $800 до $920 в месяц (в перерасчете на современный доллар — от $8100 до $9300), а прекращена их продажа была 17 декабря 1976 года.

    Как известно, технический прогресс не стоял на месте, и к концу 50-ых годов стали появляться транзисторные компьютеры. Первым таким компьютером для IBM стал IBM 1401, вышедший в 1959 году:

    Рисунок 2. IBM 1401 в Центре истории и наследия Эндикотта.

    Рисунок 2. IBM 1401 в Центре истории и наследия Эндикотта.

    В Музее компьютерной истории находится вполне рабочий экземпляр, я думаю, вам будет интересно посмотреть, как все это работало (особенно «доставляют» слова "We need a little bit of cooling" на 4:41):



    Для упрощения перехода своих клиентов на новые транзисторные компьютеры в 1959 году также были придуманы сразу два инструмента, имитирующие процесс обработки перфокарт на компьютере — FARGO (Fourteen-o-one Automatic Report Generation Operation) и RPG (Report Program Generator). Синтаксис обоих языков был схож с командным языком электромеханических табуляторов. Кроме этого, FARGO и RPG повторяли важную особенность табуляторов: они эмулировали их циклический режим работы (программный цикл), во время которого табуляторы считывали данные с перфокарт, суммировали их и печатали результаты. IBM и на сегодняшний момент обеспечивает обратную совместимость с программным циклом даже в последнем диалекте RPG IV.

    Хоть RPG и создавался под влиянием FARGO, уже через несколько лет RPG вытеснил своего предшественника как более перспективный вариант. А следующей системой, куда «подвезли» RPG, был мейнфрейм IBM System/360 Model 20:

    Рисунок 3. IBM System/360 Model 20 в Немецком музее.

    Рисунок 3. IBM System/360 Model 20 в Немецком музее.

    А уже через пару лет (конец 60-ых) IBM предоставляет следующий диалект языка — RPG II — для среднего компьютера System/3:

    Рисунок 4. Средний компьютер IBM System/3 Model 10 с оператором.

    Рисунок 4. Средний компьютер IBM System/3 Model 10 с оператором.

    С тех пор RPG развился в высокоуровневый аналог языков COBOL и PL/I. Отличительной особенностью языка (по сравнению с современными) являлся «фиксированный формат» синтаксиса, затруднявшим чтение программ без специального отладочного шаблона.

    Рисунок 5. Отладочный шаблон.

    Рисунок 5. Отладочный шаблон.

    Программы начинались со спецификаций файлов (File Specifications) — списка всех файлов, подлежащих чтению, записи или обновлению. За ними шли спецификации определений данных (Data Definition Specifications) — список элементов программы, таких как структуры данных или массивы. Этот блок напоминает секцию рабочей памяти (Working-Storage) в языке COBOL или команды с ключевым словом «var» в Паскале. Для указания типа переменной в колонку 40 спецификации определений записывается соответствующий символ (см. таблицу ниже). Если он опущен, т.е. вместо него стоит пробел, то типом по умолчанию будет A при условии, что не заданы десятичные разряды. В противном случае типом по умолчанию будет P.
    Тип данных
    Название
    Длина
    Описание
    *
    Указатель на базированную переменную

    Указатель на процедуру

    Системный указатель
    16 байт
    Обращение к данным

    Обращение к активированной процедуре

    Обращение к объектному файлу
    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' = TRUE

    '0' = FALSE
    O
    Объектный файл
    Размер неизвестен
    Ссылка на объектный файл
    P
    Упакованное десятичное число
    От 1 до 63 цифр,

    по 2 цифры на байт плюс знак
    Десятичное число с фиксированной точкой, со знаком, с целой и дробной частями
    S
    Распакованное десятичное число
    От 1 до 63 цифр,

    по 1 цифре на байт
    Десятичное число с фиксированной точкой, со знаком, с целой и дробной частями
    T
    Время
    8 байт
    Время: час, минута, секунда
    U
    Целое число
    1 байт (8-бит)

    2 байт (16-бит)

    4 байт (32-бит)

    8 байт (64-бит)
    Целое число без знака
    Z
    Метка времени
    26 байт
    Дата и время: год, месяц, день, час, минута, секунда, микросекунды

    Далее указывались спецификации вычислений (Calculation Specifications) — список команд для исполнения. Также могли добавляться спецификации вывода (Output Specifications), определяющие вид выходных файлов или отчетов.

    Приведу также дополнительную информацию о всех типах спецификаций:

    • U — спецификация автоотчета (Auto Report), требуется только для программ с автогенерируемым отчетом.
    • H — спецификация заголовков (Header), служит началом программы и описывает такие опции компилятора, как максимальный размер объектного кода, листинг компиляции, а также флаг поддержки доступа с нескольких терминалов (Multiple Requestor Terminal, MRT). Имя объектной программы записывается в колонки 75-80; если спецификация заголовков отсутствует, используется имя по умолчанию RPGOBJ.
    • F — спецификации файлов (File). Здесь описываются файлы, используемые в программе. Это могут быть как файлы на диске (DISK), так и устройства, такие как принтер (PRINTER), рабочая станция (WORKSTN), клавиатура (KEYBORD), неформатируемый дисплей (CRT или DISPLAY) либо пользовательское устройство (SPECIAL). Здесь же описывается размер записей и блоков, индикаторы переполнения и внешние индикаторы. Спецификации F могут отсутствовать.
    • E — спецификации расширений (Extension), описывают массивы и таблицы, предварительно извлекаемые из файлов на диске (таблицы ввода) или констант в конце исходного кода между символами ** и /* либо собираемые по итогам вычислений.
    • L — спецификации счетчика строк (Line Counter). Если присутствуют, то описывают формат вывода на печать: количество строк на странице и границы начала и конца печати.
    • I — спецификации ввода (Input): описывают области данных внутри файлов. RPG II разрешает переопределять области данных, так что поле FLDA может занимать ту же область, что и массив AR, содержащий 8 односимвольных элементов. Здесь же могут описываться области, не являющиеся записями, например, структуры данных. Индикаторы могут использоваться в условиях, зависящих от значений входящей записи.
    • C — спецификации вычислений (Calculation). Здесь описываются и наращиваются поля для итоговых результатов. Над ними можно проводить сложные вычисления и операции со строками. Индикаторы могут использоваться в условиях.
    • O — спецификации вывода (Output), которые описывают поля и границы выходящей записи.

    А теперь небольшой пример для разминки ваших глаз (опущены спецификации файлов и определений данных):

          * Звездочка (*) в колонке 7 определяет строку-комментарий
    
          * В колонке 6 пишется спецификация одним символом. Определяет,
          * что будет происходить в строке (например, раздел объявлений,
          * раздел вычислений, ...).
          * Спецификация "C" (calculation) - вычисление
         C        HOURS     IFLE 40
         C        HOURS     MULT RATE      PAY
         C                  ELSE
         C        RATE      MULT 40        PAY     72
         C        HOURS     SUB  40        OTIME   30
         C        RATE      MULT 1.5       OTRATE  94
         C        OTRATE    MULT OTIME     OTPAY   72
         C                  ADD  OTPAY     PAY
         C                  END

    Код сложен для восприятия, не правда ли? А здесь всего лишь производится расчет налога на заработную плату для сотрудника с почасовой оплатой труда (работники, переработавшие 40 часов, получают полуторную ставку).

    В 1978 году IBM представляет одновременно средний компьютер System/38 и новый диалект языка — RPG III — для него:

    Рисунок 6. Средний компьютер IBM System/38

    Рисунок 6. Средний компьютер IBM System/38

    С этого момента ограничения языка несколько ослабляются и разрешается писать спецификации вычислений в «свободном формате»:

          /free
            If Hours <= 40;                     
              Pay = Hours * Rate;                  
            Else;                          
              Pay = (40 * Rate) + ((Hours - 40) * (Rate * 1.5));         
            EndIf;
          /end-free

    И, наконец, последняя версия диалекта — RPG IV (иначе RPGLE, ILE RPG) — вышла в 1994 году. Тремя основными «фичами» можно назвать встроенные функции, процедуры и «свободный формат» программирования. До ноября 2013 года свободный формат был доступен только для спецификаций вычислений. В обновлении V7R1 TR7 команды "/free" и "/end-free" были упразднены, а язык наконец-то освободился от наследия эпохи перфокарт.

    Предлагаю также ознакомиться с данной брошюрой, в которой IBM показывает, как сильно изменился диалект языка. Сам же язык широко используется сейчас под ОС IBM i на аппаратной платформе IBM Power i:

    Рисунок 7. Линейка серверов IBM Power i

    Рисунок 7. Линейка серверов IBM Power i

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

    К настоящему времени язык RPG развился в сильный, жизнеспособный язык. Программы можно по-прежнему писать в обычном редакторе в черно-зеленой гамме (green-screen):

    Рисунок 8. Green-screen.

    Рисунок 8. Green-screen.

    Однако появилось и множество других инструментов. Среди них — Visual Age для RPG, разработанные IBM и продвигаемые Джоном Пэрисом (Jon Paris) и другими. Наиболее популярным редактором на данный момент является IBM Websphere Development Studio, позднее переименованный в RDi (Rational Developer for i), являющийся пользовательской реализацией Eclipse:

    Рисунок 9. Rational Developer for i.

    Рисунок 9. Rational Developer for i.

    Также компилятор RPG реализован для платформы Microsoft .NET. Помимо базовой версии в него входят дополнительные расширения языка RPG IV, что позволяет Microsoft Windows и .NET пользоваться окружением Native и System/36, а также портировать файлы DB/2 в базы данных Microsoft Access и Microsoft SQL Server через интерфейс ODBC.

    Заключение


    Хоть язык и представляет собой экзотику, мы понимаем, что на нем написано много кода для финансовой, банковской и других видов деятельности. Он достаточно многообразен: существует 4 диалекта, фиксированная и свободная формы синтаксиса. Необходимость в поддержке старого и написании нового кода вынуждает компании искать RPG-программистов, которые, по-видимому, уже занесены в Красную книгу. В таких условиях возникает потребность в использовании дополнительных инструментов по контролю качества кода, например, таких как статический анализатор.

    Возможно, читатель уже догадался, почему мы решили написать эту статью, и к чему мы клоним. Да, мы подумываем создать статический анализатор кода для языка RPG. Думаю, такой анализатор станет отличным подспорьем тем, кто продолжает сопровождать и развивать программы на этом языке. Однако, решение ещё не принято. Думаю, вы понимаете, что это весьма специфическое направление.

    Поэтому, если вы хотите, чтобы анализатор PVS-Studio научился искать ошибки в RPG программах, то напишите нам. Мы ищем Вас, уважаемых потенциальных клиентов PVS-Studio RPG. Пишите нам!



    Если хотите поделиться этой статьей с англоязычной аудиторией, то прошу использовать ссылку на перевод: Phillip Khandeliants. A first look at RPG: turns out it's not only Role-Playing Games
    PVS-Studio
    412,65
    Static Code Analysis for C, C++, C# and Java
    Поделиться публикацией

    Комментарии 12

      +2

      А не проще ли написать транслятор кода на что-нибудь посвежее?

        +5
        напиши — озолотишься :)
          0
          У Micro Focus такого ещё нет?
        0

        Серверы IBM AS/400 и iSeries активно используются в ПФР. Интересно, на чем там софт написан.

          +2
          В статье достаточно много неточностей.
          Например,
          «В 1978 году IBM представляет одновременно средний компьютер System/38 и новый диалект языка — RPG III — для него.С этого момента ограничения языка несколько ослабляются и разрешается писать спецификации вычислений в «свободном формате»»
          Т.н. «free format», с картинки в статье, появился только в RPG ILE (IV), и не сразу после его выхода в 1994-м, а лишь в версии 5.1 в 2001-м. Мне тогда пришлось преодолеть немало запретов и получить специальное разрешение использовать free в своем коде. Это по-сути был другой диалект языка который рвал на части многие принятые до того стандарты.

          Говоря об истории, не стоит забывать об отечественных версиях языка. Например, компилятор с языка был на ЭВМ Минск-32, и я даже когда-то читал книжечку изданную в 70-х про язык РПГ :-).

          Eclipse-based клиент, показанный на картинке, назывался «IBM Websphere Development Studio Client», а «IBM Websphere Development Studio» — это прежде всего набор компиляторов на самом мэйнфрейме. В клиенте ничего не компилируется. (вот www.ibm.com/support/knowledgecenter/en/ssw_i5_54/rzau1/rzau1ebwds.htm)

          RPG для .NET действительно когда-то был, в 2001-м, если не ошибаюсь. Тогда на него возлагали большие надежды, типа убийца AS400 (ведь программа предполагала еще и перенос софта на мощные сервера по управлением OS Windows). Почила в бозе эта инициатива уже давно, насколько мне известно.

          Ну и главное, не раскрыто, почему собственно язык пользуется популярностью до сих пор. В чем его мощь? А она вовсе не в синтаксисе. Она в глубокой интеграции с OS, и прежде всего с БД. Если кто-то был знаком c FoxPro — вот это примерно отдаленно то же, только лучше. Нативно, на уровне синтаксиса, поддерживаются операции ввода-вывода в БД.
          Ну и надо сказать пару слов о БД. Дело в том, что в IBM параллельно, в одно и то же время, две разные команды разрабатывали концепцию реляционной БД и язык для него. Кодд делал SQL, а команда AS400 (или тогда еще S/38) свой вариант — DDS. Попытка объединить усилия была предпринята, но, как пишет Ф. Солтис (папа архитектуры as400), Кодд воспринял их идеи холодно и больше они не сотрудничали. В результате AS400 получила свой язык описания моделей БД — DDS. А в качестве языка программ-запросов используется RPG.
          Конечно, со временем SQL появился и на AS400. Но в существующих программах преобладает использование DDS.

          Стратегически, IBM сейчас нацеливает разработчиков на переход с DDS на SQL. Это, на мой взгляд, сильно нивелирует достоинства языка и становится не понятно, почему например не писать тогда на Java или c++ например?
            0
            Дополнительно можно отметить, что язык синтегрирован ещё и со специальным языком для отчётов и с языком для GUI. Но здесь они сейчас полностью просрали полимеры.
            Если бы они хотя бы позволили создавать окна произвольного размера (а не только 80х24 и 132х27), то было бы очень круто.
            Ведь эти текстовые интерфейсы дико круты для операционистов: всё управляется с клавы, летает и т.д. Но маленький экранчик при современных мониторах не позволяет удобно умещать информацию…
            И в части отчётов уже всё везде ушло вперёд, но не на AS400. Я запилил для наших целей либу для формирования отчётов в excel, и пользоваться ей было во многих отношениях удобнее и быстрее, чем «родными» PRTF. Кроме того, что их задёшево нельзя сразу отправить на печать.
              0
              Ну, это разговор про DDS, о котором я упомянул. В принципе, все кто хотел, прекрасно заменили RPTF и DSPF на вызов API и трагедии я тут не вижу.
              Мне DDS нравится как язык для описания моделей. На самом деле, он ближе к современным подходам, когда модели описываются не в DDL, а на неком языке приближенном к языку приложения. Жаль, что IBM решила его не развивать. Вот такими решениями и убивается платформа. Если я буду писать свои приложения на SQL, модели описывать на DDL, спрашивается, зачем вообще AS400 и RPG?
            0
            С этого момента ограничения языка несколько ослабляются и разрешается писать спецификации вычислений в «свободном формате»:


            «Свободный формат» появился только в RPG IV.
              0
              khandeliants, решите пилить анализатор для RPG, учтите, что у этого языка безумное море своих очень индивидуальных тараканов, которые вряд ли описаны в «стандартных» книжках. Что-то полезное за быстро не запилите. Тараканы в большинстве своём гораздо проще сами по себе, чем разные плюсовые «фичи», но…
                0
                Программирование на RPG — это в основном поддержка существующего старого кода, написанного при Царе Горохе, со своими вставками во Free формате.
                Новые проекты больше пишется на С/С++, Java и Python, которые также поддерживаются в iSeries.

                Не вижу смысла пилить анализатор на умирающий язык, где клиентов раз-два и обчелся.
                  0
                  Однако появилось и множество других инструментов. Среди них — Visual Age для RPG, разработанные IBM и продвигаемые Джоном Пэрисом (Jon Paris) и другими.

                  Кстати, начиная с версии 7.1 IBM поставляет OpenSource пакет, который включает в себя python, perl, bash, много чего еще, и Orion — бесплатный Web редактор исходного, который поддерживает подсветку rpg синтаксиса. (https://orionhub.org/)
                  Появляется все больше статей про замену платного RDI в пользу бесплатного ориона :)
                    +1
                    Наш сотрудник сделал плагин для Notepad++ (пока α — версия)

                    Возможности:
                    — редактирование и подсветка: RPG, Free-RPG, C++
                    — загрузка, выгрузка файлов
                    — выполнение SQL
                    — git, сравнение файлов и версий
                    Он полностью отказался от RDi-ки

                    Я разрабатываю на плюсах, использую Sublime, но деплой на сервер осуществляется с помощью gradle. По форматированию кода RDi-ка вообще ни какой инструмент. Отладка в green screen.

                    Вот альтернативный проект github.com/WorksOfLiam/rpg-intro

                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                  Самое читаемое