Разница между тетрадью RPG и программой

Не могли бы вы дать мне некоторое представление о том, как посмотреть файл, как я могу различить тетрадь RPG и программу?

Например, в c, если у вас есть main в файле, вы знаете, что его можно использовать как программу.

Заранее спасибо.

4 ответа

Решение

Это интересный вопрос... это обычно довольно очевидно.

Я полагаю, что быстрый ответ заключается в том, что копии книг не будут содержать различные типы спецификаций. Программа RPG IV может иметь спецификации H, F, D, I, C, O и P или их эквиваленты в свободной форме. (Тип спецификации определяется буквой в столбце 6 источника фиксированного формата). Порядок важен, и вы не можете смешивать типы. Если вы смотрите на источник, который имеет только один тип спецификаций, он, вероятно, разработан как тетрадь. Поскольку исполняемый код содержится в спецификациях C (вычисления) и / или P (процедуры), источник без каких-либо спецификаций C или P является тетрадью. В то время как обычно плохая практика иметь спецификации C или P в тетради, RPG разрешает это, и я видел, как это было сделано. Но опять же, единственное, что есть в книге, это спецификации C или P.

РЕДАКТИРОВАТЬ У вас может быть тетрадь с, например, спецификациями F & D, но единственное место, где она может быть включена, находится в конце F-спецификаций программы перед любыми D-спецификациями. Вы могли бы иметь тетрадь, которая использует директивы компилятора /IF DEFINED контролировать, какая часть тетради включена, где.

EDIT2 Оказывается, IBM добавила возможность смешивать спецификации F & D в версии 7.1 и выше. Элемент-источник, имеющий только спецификации F & D, был бы тетрадью. Таким образом, краткий ответ становится: исходный элемент со спецификациями определений (H, F, D, I, O) и исполняемых (C & P) предназначен для компиляции,

Чем дольше ответ, тем RPG-программа также имеет "основную". Первоначально единственным вариантом было то, что сейчас известно как "главный цикл". IE. "основная" процедура - это неявно генерируемый "циклический" код, который встроен в программы RPG.

Затем появились RPG IV и ILE. IBM добавила ключевое слово спецификации управления, NOMAIN,

H NOMAIN
  //or in freeform
  ctl-opt nomain;

Это привело к неисполняемому модулю без "основной" процедуры; код, который обычно генерируется компилятором для цикла, не учитывается. Результирующий объект *MODULE должен быть связан с объектом *PGM с помощью другого *MODULE, который предоставляет основную процедуру.

Или это может быть связано с нулем или более других *MODULE объектов в *SRVPGM объект; *SRVPGM - это просто набор процедур. Думайте о них как о Windows DLL.

Затем IBM добавила возможность иметь "линейно-основную" программу RPG IV.

H MAIN(MYMAIN)
  // or freeform
  ctl-opt main(MYMAIN);

Таким образом, основной процедурой является процедура, которую вы назначаете. Сгенерированный код "цикла" снова остается вне исполняемого файла.

Так что существование либо NOMAIN или же MAIN ключевые слова означают, что исходный элемент предназначен для компиляции; при условии, что есть еще источник. Возможно, есть "стандартный файл", включающий один из них.

Отсутствие этих двух ключевых слов указывает на то, что вы имеете дело либо с основным циклом, либо с включаемым файлом.

Если это основная программа цикла и она принимает параметры в качестве входных данных, вы сможете увидеть список параметров ввода

  //Fixed format, old school RPG III, IV
C     *ENTRY        PLIST                                       
C                   PARM                    LCMPNO            2 
C                   PARM                    LNTACT            1

 // fixed format, RPG IV using a "Procedure Interface (PI) to replace *ENTRY PLIST
D CheckDate       PI               
D  lDateIs                       4a

  // free format RPG IV
dcl-pi CheckDate;
  lDateIs   char(4);
end-pi;

Обратите внимание, что ключевое различие в источнике между программой "главный цикл", которая использует PI вместо *ENTRY PLIST и линейная основная состоит в том, что линейная основная процедура окружена явным определением процедуры.

  // linear main
h main(CHECKDATE)
p CheckDate       b
d CheckDate       PI               
d  lDateIs                       4a
  //do something
  *INLR = *ON
  return;
p CheckDate       e

   //cycle main with PI
d  lDateIs                       4a
  //do something
  *INLR = *ON
  return;

Начиная с версии 7.1 (с PTF свободной формы с 2013 года), вы можете смешивать спецификации F и D (даже в фиксированном коде формы).

RPG Copy Book довольно близко к imports в современных языках программирования

Тетрадь должна использоваться скорее как заголовочный файл на C или C++. К сожалению, у него не будет такого полезного расширителя.h, который будет держать вещи отдельно. Стандарты магазина могут быть полезны здесь. Вы можете хранить тетради в отдельном исходном файле или даже назвать их с определенным префиксом или суффиксом, чтобы указать, что это тетрадь. Я видел суффиксы, такие как _ или _h, используемые в тетрадях, где базовое имя совпадает с исходным элементом, для которого он действует как файл заголовка. Или в том случае, если тетради и исходный код программы хранятся в разных исходных файлах, программа и ее заголовочный файл будут иметь одно и то же имя.

Как и C, RPG4 может иметь исходные файлы, которые могут быть скомпилированы в программы, и исходные файлы, которые могут быть скомпилированы в модули (модуль - это термин IBM i, во многом как несвязанный файл.obj, созданный компилятором C на других платформах) или программы, которые являются полностью связанными исполняемыми файлами. Для того, чтобы источник RPG был скомпилирован в полностью связанный исполняемый файл, ему нужна основная процедура. Чарльз объяснил основные и неосновные ключевые слова для h спецификаций. Если исходный код программы не имеет ключевого слова nomain, его можно сгенерировать как полностью связанную программу. Будьте осторожны, хотя, хотя это не распространено, спецификации h могут быть где-то еще, например, в их собственной тетради или в области данных.

Другие вопросы по тегам