Введение

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

Платформы

Язык программирования RPG был первоначально разработан IBM для систем 1401. Позднее IBM создала реализации для 7070/72/74 и System/360; RPG II стал основным языком программирования для их линейки компьютеров среднего класса (System/3, System/32, System/34, System/38, System/36 и AS/400). Существовали также реализации для DEC 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, 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, Уилф Хей внес значительный вклад в разработку RPG, работая в IBM. FARGO (Fourteen o one Automatic Report Generation Operation) был предшественником RPG на IBM 1401. Оба языка были созданы для упрощения перехода техников, обслуживавших табуляционное оборудование IBM (Tab), к новым компьютерам того времени. Эти техники привыкли использовать проводные соединения на панелях управления для реализации операций ввода, вывода, управления и подсчета (сложение, вычитание, умножение, деление). Программы для табуляторов выполнялись посредством импульсов в машинном цикле, поэтому FARGO и RPG эмулировали машинный цикл в рамках программного цикла. RPG превзошел FARGO и быстро заменил его как предпочтительный инструмент для генерации отчетов. Позже IBM реализовала RPG (7070 RG 902), но не FARGO, на компьютерах IBM 7070/72/74. В качестве альтернативных языков в то время обычно использовались Assembler, COBOL или FORTRAN. Assembler и COBOL были более распространены в операциях с мейнфреймами (модели System/360 30 и выше), а RPG чаще применялся клиентами, переходившими с табуляционного оборудования (модель System/360 20).

РПГ II

RPG II был представлен примерно в 1969 году вместе с серией компьютеров System/3. Позже он использовался на System/32, System/34 и System/36, с улучшенной версией языка. RPG II также был доступен для более крупных систем, включая мэйнфрейм IBM System/370, работающий под DOS/VSE (затем VSE/SP, VSE/ESA и z/VSE). ICL также выпустила версию для своей операционной системы VME/K. В ранние годы RPG его основным преимуществом был цикл программы. Программист писал код для обработки отдельной записи, а цикл программы выполнял это изменение для каждой записи в файле, управляя потоком выполнения. В то время каждая запись (отдельная перфокарта) сравнивалась с каждой строкой программы, которая, в зависимости от того, был ли "индикатор" в этой строке включен или выключен, либо обрабатывала запись, либо пропускала ее. Индикатор состоял из набора логических переменных, пронумерованных от 01 до 99 для пользовательских целей, или других меньших наборов, основанных на функциях обработки записей, полей или отчетов. Концепция разрывов уровней и сопоставления записей уникальна для языка RPG II и изначально разрабатывалась с учетом карт. Функция сопоставления записей в цикле позволяла легко обрабатывать файлы с отношением "заголовок-детали". Программы RPG, написанные с использованием цикла программы, могли создавать сложные отчеты с гораздо меньшим количеством строк кода, чем программы, написанные на COBOL и других бизнес-ориентированных языках. В программе спецификации файлов перечислялись все файлы, в которые записывались, из которых читались или которые обновлялись, за которыми следовали спецификации определения данных, содержащие элементы программы, такие как структуры данных и многомерные массивы, подобно разделу "рабочей памяти" программы COBOL. Далее шли спецификации вычислений, содержащие исполняемые инструкции. Затем могли следовать спецификации вывода, которые можно было использовать для определения макета других файлов или отчетов. В качестве альтернативы файлы, некоторые структуры данных и отчеты могли быть определены внешне, что в значительной степени устраняло необходимость ручного кодирования спецификаций ввода-вывода ("I/O").

РПГ III

РПГ 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 были недоступны в версии RPG III для System/38.

РПГ IV и РПГ ILE

RPG IV, также известная как RPG ILE, была выпущена в 1994 году в составе выпуска V3R2 OS/400 (ныне известной как IBM i). С выпуском RPG IV название RPG официально перестало быть аббревиатурой. RPG IV предлагала большее разнообразие выражений в расширенной спецификации вычислений 2-го уровня и, позднее, в спецификациях вычислений и синтаксисе процедур в свободном формате. RPG IV в рамках интегрированной языковой среды известна как ILE RPG, и в руководствах пользователя объясняются нюансы обеих. RPG IV и ILE RPG поддерживаются IBM на текущей платформе IBM i. В 2001 году, с выпуском OS/400 V5R1, RPG IV предоставила большую свободу для вычислений, чем расширенная спецификация вычислений 2-го уровня: ввод исходного кода в свободном формате, в качестве альтернативы исходному формату, зависящему от столбцов. Вычисление "/FREE" не требовало размещения кода операции в определенном столбце; код операции является необязательным для операций EVAL и CALLP; и синтаксис в целом больше напоминает синтаксис основных языков программирования общего назначения. До ноября 2013 года свободный формат применялся исключительно к спецификациям вычислений. С обновлением языка IBM i V7R1 TR7 вычисления "/FREE" и "/END FREE" больше не требуются, и язык окончательно порвал с традициями перфокарт. IBM Rational Developer for i (RDi), интегрированная среда разработки на базе Eclipse, рекомендуется IBM для разработки RPG. Текстовый редактор Source Entry Utility (SEU) больше не рекомендуется для разработки RPG, и его разработка была прекращена после IBM i 6.1. Другие устаревшие инструменты для разработчиков включают CODE/400 (на основе IBM WorkFrame/2) и VisualAge для RPG.

Продолжающиеся улучшения языка

IBM продолжает совершенствовать язык RPG посредством программных релизов и обновлений технологий внутри релизов (TR). Добавлены новые встроенные функции (BIF). Он обеспечивает связь с Java-объектами и API IBM i; его можно использовать для написания CGI-программ с помощью веб-инструментария IBM Cgidev2, RPG Toolbox и других коммерческих пакетов с поддержкой веб-технологий. Даже с учетом внесенных изменений, язык сохраняет высокую степень обратной совместимости, поэтому программа RPG, написанная 37 лет назад, может быть запущена сегодня с минимальными или вообще без изменений. Прекомпилятор SQL позволяет современным разработчикам RPG использовать преимущества SQE (SQL Query Engine) от IBM. В отличие от традиционного подхода с использованием F-спецификаций, когда разработчику необходимо было указывать конкретный путь доступа к набору данных, теперь можно непосредственно в программе реализовывать стандартные встроенные 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 не предоставляет встроенной поддержки.