Z/OS 中 COBOL 嵌套程序与子程序有啥区别

Posted

技术标签:

【中文标题】Z/OS 中 COBOL 嵌套程序与子程序有啥区别【英文标题】:What is the difference between COBOL Nested Program vs. Subroutine in Z/OSZ/OS 中 COBOL 嵌套程序与子程序有什么区别 【发布时间】:2018-04-07 18:41:30 【问题描述】:

在 COBOL 中,您可以将子例程封装为嵌套程序或独立模块。我想知道这两种方法在执行速度、内存使用以及 CICS 中是否允许这两种方法方面有什么区别。任何参考都会很棒。运行环境为 Z/OS。

谢谢。

【问题讨论】:

【参考方案1】:

CICS 中允许使用这两种方法。

内存使用的差异(如果有的话)将可以忽略不计。编译器将生成可重入代码,因此您的工作存储将在每个 CICS 事务的第一次执行时动态分配,而您的本地存储将在每次执行时动态分配。语言环境内存分配算法旨在快速。 CICS 区域中只有一份可执行代码副本。

将子例程打包为嵌套程序或在绑定时将模块静态链接在一起可以避免调用子例程时的 LOAD 开销。

将您的子例程打包为嵌套程序可防止它被其他程序调用除非您将嵌套程序打包为副本并使用COPY 编译器指令将其引入您的程序。这种技术可能会导致一些有趣的问题,例如对嵌套程序 copybook 的更改可能需要使用 copybook 重新编译所有程序才能获得新版本;但这取决于您的源代码管理系统。子程序的静态链接也有类似的问题。

如果您将子例程打包为一个单独的模块,您可以选择通过EXEC CICS LINK 或COBOL 动态CALL 执行它。前者导致创建新的语言环境飞地,因此后者更有效,特别是在第二个和后续CALL 以及如果您指定语言环境运行时选项CBLPSHPOP(OFF)。

以上大部分内容都是从SHARE 多年来的演讲中收集到的。

在 2002 S8213TR 的 SHARE 演示文稿中提供了一些调整信息。PDF 当前可用 here(该信息仍然有效)。请注意,有许多与存储分配相关的语言环境运行时选项相关的调整机会。 There exist a number of different mechanisms to set Language Environment options。您的 CICS 系统程序员可能对此事有意见。可能有关于语言环境运行时选项的商店标准。

一般而言,大型机 CICS COBOL 应用程序调优与使用高效算法、变量定义、编译选项和语言环境运行时选项有关,而不是与应用程序打包有关。

【讨论】:

值得一提的是,嵌套子程序只能由包含程序调用。【参考方案2】:

除了cschneid提到的东西……

包含的程序可以引用在包含程序的数据部中使用 GLOBAL 属性声明的项。包含的程序无需声明 GLOBAL 项即可引用它们。

包含的程序不能用 RECURSIVE 属性声明。

【讨论】:

以上是关于Z/OS 中 COBOL 嵌套程序与子程序有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

z/OS 如何调用 Web 服务? [关闭]

COBOL 程序不会在我的报告中输出详细信息行

如何从 z/OS 调用远程服务器上的 python 脚本?

Enterprise Cobol 5.2 调试器行数超出

程序中使用嵌套的sql语句和在数据库中写存储过程调用它,有啥区别?

在 Angular 2+ 中,使用路由器插座和嵌套组件有啥区别