CRTPGM 和 UPDPGM 有什么区别

What is the defference between CRTPGM and UPDPGM

假设我的模块发生了一些变化,所以我不得不更新服务程序,结果签名被改变了。那么我不应该选择哪个选项?我应该使用 CRTPGM 还是 UPDPGM 来重新创建使用服务程序的程序。在这种情况下,您能说出 CRTPGM 和 UPDPGM 之间的区别吗?

首先,您不应该仅仅因为 *SRVPGM 已更改就需要 CRTPGM 或 UPDPGM。由于 *SRVPGM.

的变化,需要 *PGM re-compiles 应该是一个非常罕见且非常有意的决定

听起来您可能正在使用 CRTSRVPGM EXPORT(*ALL),请不要那样做。而是使用活页夹源 CRTSRVPGM EXPORT(*SRCFILE) SRCFILE(..) 来控制导出的过程和服务程序签名。硬编码签名的简单方法

STRPGMEXP SIGNATURE('MYSRVPGM Sig v1')
  export symbol('Proc1')
  export symbol('Proc2')
ENDPGMEXP

现在您可以加入并向服务程序添加过程,只要将导出添加到末尾,您就可以保持相同的签名并且不会强制重新编译任何使用该服务程序的程序。

STRPGMEXP SIGNATURE('MYSRVPGM Sig v1')
  export symbol('Proc1')
  export symbol('Proc2')
  export symbol('Proc3')
  export symbol('Proc4')
ENDPGMEXP

在这种情况下,您不能删除,也不能 re-order 导出。

如果您确实需要确保所有调用程序的 re-compile,那么您只需更新硬编码签名。

STRPGMEXP SIGNATURE('MYSRVPGM Sig v2')
  export symbol('Proc1')
  export symbol('Proc3')
  export symbol('Proc4')
ENDPGMEXP

另一种方法是让系统生成签名,并使用 *CURRENT*PRV 块。但是您仍然无法在不破坏现有呼叫者的情况下删除或 re-order 导出。所以社区的共识是简单地硬编码签名。 IBM 本身也遵循这种做法,在 OS.

中包含 *SRVPGM 对象

要认识到的两件重要的事情是

  • 过程签名(参数的数量和类型)与 *SRVPGM 签名无关。
  • 过程名称被解析为 *PGM 对象的“绑定”时间,在执行期间调用实际上是按位置进行的。

例如,如果我有这个

dcl-pr Proc1 extproc(*dclcase);
  parm1 char(10);
end-pr;
dcl-pr Proc2 extproc(*dclcase);
  parm1 char(20);
end-pr;

带活页夹源

STRPGMEXP SIGNATURE('MYSRVPGM Sig v1')
  export symbol('Proc1')
  export symbol('Proc2')
ENDPGMEXP

我能做到

dcl-pr Proc1 extproc(*dclcase);
  parm1 char(10);
  parm2 char(20) option(*nopass);
end-pr;
dcl-pr Proc2_depreciated extproc(*dclcase);
  parm1 char(20);
end-pr;
dcl-pr Proc2 extproc(*dclcase);
  parm1 varchar(100) const;
end-pr;

带活页夹源

STRPGMEXP SIGNATURE('MYSRVPGM Sig v1')
  export symbol('Proc1')
  export symbol('Proc2_deprecated')
  export symbol('Proc2')
  export symbol('Proc3')
ENDPGMEXP

现有 *PGM 的调用 Proc2() 将继续调用现在重命名的代码 Proc2_deprecated()。调用 Proc2() 的新的或重新编译的现有 *PGM 将调用名为 Proc2().

的新添加代码

现在对您的问题提供一个不完整的答案,

what is the difference between CRTPGM and UPDPGM?

我很确定存在差异,我知道当使用 UPDSRVPGM 而不是 CRTSRVPGM 时,*SRVPGM 对象中的某些 meta-data 不会更新。我敢打赌 UPDPGM 也是如此。此外,CRTPGM 有一个参数
Allow *SRVPGM library update . . ALWLIBUPD 默认为 *NO 因此如果您更新的服务程序在另一个库中,您可能必须使用 CRTPGM。

老实说,在这个平台上工作了 30 年,我从未使用过 UPDPGM 或 UPDSRVPGM。大多数时候,我的 *PGM 是单个模块并使用绑定目录来查找 *SRVPGM,因此通过 CRTBNDRPG 重新创建非常简单。 *SRVPGM 要么是单个模块,要么具有特定于其创建的唯一绑定目录。

我在职业生涯中使用的变更管理工具也重新创建了对象,而不是使用 UPDPGM 或 UPDSRVPGM。

最后,如果您是 ILE 的新手,*SRVPGM 的 Scott Klement 的 ILE Concepts (for the Impatient RPG Programmer) 演示是老歌,但很不错。