RPG字帖和程序的区别

difference between RPG copybook and program

你能告诉我一些关于查看文件的想法吗?我如何区分 RPG 字帖和程序?

比如在c中,如果你的文件中有main,你就知道它可以作为程序使用。

提前致谢。

这是个有趣的问题...通常很明显。

我想快速的回答是复印簿不会包含不同类型的规范。 RPG IV 程序可以有 H、F、D、I、C、O 和 P 规格,或它们的自由格式等价物。 (规范类型由固定格式来源第6栏中的字母确定)。顺序很重要,您不能混合使用这些类型。如果您查看的源代码只有一种类型的规范,那么它可能被设计为一本抄写本。由于可执行代码包含在 C(计算)and/or P(过程)规范中,因此没有任何 C 或 P 规范的源代码是一本抄写本。虽然在字帖中使用 C 或 P 规格通常是不好的做法,但 RPG 确实允许这样做,而且我已经看到这样做了。但同样,副本中唯一的东西就是 C 或 P 规格。

编辑 你可以有一本带有例如 F & D 规范的抄写本,但它唯一可以包含的地方是在程序的 F 的末尾规格先于任何 D 规格。 您可以拥有一个使用编译器指令 /IF DEFINED 来控制副本的哪一部分包含在何处的抄写本。

EDIT2 事实证明,IBM 在 7.1 及更高版本中添加了混合 F & D 规范的功能。仅具有 F 和 D 规范的源成员将是一本抄写所以简短的回答是,具有定义(H,F,D,I,O)规范和可执行(C&P)规范的源成员被设计为被编译.

较长的答案,RPG程序也有"main"。最初,唯一的选择就是现在所知道的 "cycle-main"。 IE。 "main" 过程是内置于 RPG 程序中的隐式生成的 "cycle" 代码。

随后出现了 RPG IV 和 ILE。 IBM 添加了控制规范关键字,NOMAIN.

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

这导致没有 "main" 过程的不可执行模块;通常由编译器为 "cycle" 生成的代码被排除在外。生成的 *MODULE 对象需要与另一个提供主过程的 *MODULE 绑定到 *PGM 对象中。

或者它可以与零个或多个其他 *MODULE 对象绑定到 *SRVPGM 对象中; *SRVPGM 只是程序的集合。将它们想象成 Windows DLL。

然后 IBM 添加了具有 "linear-main" RPG IV 程序的选项。

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

因此,主程序就是您指定的任何程序。生成的 "cycle" 代码再次被排除在可执行文件之外。

因此 NOMAINMAIN 关键字的存在将表明源代码成员被设计为可编译;假设还有更多来源。可能有一个 "standard options" 包含文件,其中包含其中之一。

缺少这两个关键字表明您正在处理循环主文件或包含文件。

如果是循环主程序,以参数为输入,可以看到入口参数列表

  //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 的 "cycle-main" 程序与线性主程序之间的源代码主要区别在于线性主程序被显式程序定义包围。

  // 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 开始(使用 2013 年的自由格式 PTF),您可以混合使用 F 和 D 规范(甚至在固定格式代码中)。

rpg copy book 在现代编程语言中非常接近imports

抄本更应该像C或C++中的头文件一样使用。不幸的是,它没有有用的 .h 扩展器来保持分离。商店标准在这里很有帮助。您可以将字帖保存在单独的源文件中,甚至可以使用特定的前缀或后缀命名它们以表明它是字帖。我看到像 _ 或 _h 这样的后缀用在 copybook 上,其中基本名称与它作为头文件的源成员相同。或者如果copybooks和程序源文件存放在不同的源文件中,一个程序和它的头文件将具有相同的名称。

与 C 一样,RPG4 可以有可以编译成程序的源文件和可以编译成模块的源文件(模块是 IBM i 术语,很像 C 编译器生成的未链接的 .obj 文件在其他平台上)或完全链接可执行文件的程序。为了将 RPG 源代码编译为完全链接的可执行文件,它需要一个主程序。 Charles 解释了 h 规范的 main 和 nomain 关键字。如果程序源没有 nomain 关键字,则可以生成全链接程序。不过要小心,即使它不常见,h 规范也可以在其他地方,比如在他们自己的抄写本中,或者在数据区域中。