为什么在更改服务程序后不需要重新编译程序



我正在努力了解服务程序如何帮助减少重新编译的工作量。我读过一些文章说,与模块不同的是;"副本装订";一个服务程序被"插入"到一个程序对象中;通过引用绑定";。这就是为什么使用服务程序的程序不需要重新编译以反映更改的原因吗?

如果程序只有对服务程序的引用,那么它不是一种动态绑定吗??

还有,服务程序签名是怎么回事。什么时候才真正改变?

您是对的,对服务程序的调用也可以被视为"动态绑定";,但一般来说;动态绑定";用于调用程序。

服务程序的签名何时更改取决于您是否使用绑定源。如果创建的srvpgm没有绑定源(EXPORT(*ALL((,则在有新导出时,签名会发生更改。如果使用绑定源(EXPORT(*SRCFILE((创建,则只有在绑定源中STRPGMEXP命令指定的签名更改时,签名才会更改。

通常的建议(也是我的建议(是向

  • 使用绑定源
  • 永远不要更改签名
  • 总是在活页夹源的末尾添加新导出

如果签名发生更改,那么您确实需要重新编译调用程序,或者如果您已经有了模块,则至少需要再次执行CRTPGM。

但是,如果签名没有更改,导出的顺序也没有更改,则不需要重新编译程序来获取服务程序中的更改。

但请注意,在您的程序看到服务程序的更改之前,您可能需要结束工作并开始新的工作。旧版本的服务程序可能已被激活到激活组中,因此它可能不会使用新版本的服务计划。

您有几个问题,让我来看看绑定。这里有两个不同的概念:通过复制绑定与通过引用绑定,以及静态绑定与动态绑定。第一个只处理代码所在的位置。它是在程序中(通过副本绑定(,还是在程序本身外部的某个地方(通过引用绑定(。在这两种情况下,调用都会跳转到其他位置来执行代码,因此在这两个情况下都使用了引用或指针,但在按副本绑定中,代码实际上也会复制到程序对象中。正如您所认为的,通过引用绑定的优点是,在通过引用绑定场景中,可以在不重新编译所有调用方的情况下修改服务程序,并且任何使用服务程序的程序都可以立即使用新代码。

接下来是静态绑定和动态绑定之间的区别。根据计算机科学的定义,静态绑定发生在编译时,而动态绑定发生在运行时。这两种类型总是有一个引用。问题是这个问题何时解决。也就是说,过程调用是静态的,程序调用是动态的。让我们从基础知识开始:

**free
ctl-opt Main(testcallp);
dcl-pr Prog        ExtPgm('PGMA');
parm1            Char(10) const;
parm2            Char(10) const;
end-pr;
dcl-proc testcallp;
callp Prog('1': '2');
end-proc;

这是一个动态调用。PGMA不是在编译时解析的,而是在执行callp时的运行时解析的。PGMA可能看起来是静态解析的,因为它只解析了一次,但事实上,在编译此代码时,PGMA甚至不必存在。尝试一下,代码会编译成一个程序对象,但当该程序执行时,它找不到PGMA。因此,必须进行动态绑定。

让我们用过程调用重试:

**free
ctl-opt DftActGrp(*No) ActGrp(*New)
Main(testcallp);
dcl-pr Proc        ExtProc('PROCA');
parm1            Char(10) const;
parm2            Char(10) const;
end-pr;
dcl-proc testcallp;
callp Proc('1': '2');
end-proc;  

这一次,代码编译时没有语法错误,但由于绑定步骤失败,因此没有创建任何程序对象。找不到过程PGMA。静态绑定。但是等等,RPG文档说你可以通过使用过程指针来动态调用过程。

让我们试试:

**free
ctl-opt DftActGrp(*No) ActGrp(*New)
Main(testcallp);
dcl-pr Proc        ExtProc(Procp);
parm1            Char(10) const;
parm2            Char(10) const;
end-pr;
dcl-pr Proca       ExtProc('PROCA');
parm1            Char(10) const;
parm2            Char(10) const;
end-pr;
dcl-s Procp        Pointer(*proc) Inz(%paddr(Proca));
dcl-proc testcallp;
callp Proc('1': '2');
end-proc;

程序再次编译时没有语法错误,但在绑定步骤中由于过程PROCA不存在而挂起。静态绑定。即使我们可以通过交换Procp指向的过程来更改运行时调用的实际过程,该过程也必须在编译时存在,因为所有过程都在编译时静态绑定到程序中。

至于活页夹源代码建议,我只会在Barbra的回答中添加一个建议,即始终向服务程序添加模块,并且只引用程序对象中的服务程序。

注意:有一些API可以让您在运行时解析过程并绑定它,但它们远远超出了本文的范围。

相关内容

最新更新