Z/OS 中的 COBOL 嵌套程序与子例程有什么区别

What is the difference between COBOL Nested Program vs. Subroutine in Z/OS

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

谢谢。

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

内存使用的差异(如果有的话)将可以忽略不计。编译器将生成可重入代码,因此您的 Working-Storage 将在每次 CICS 事务首次执行时动态分配,而您的 Local-Storage 将在每次执行时动态分配。语言环境内存分配算法被设计为快速的。 CICS 区域中只会出现您的可执行代码的一份副本。

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

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

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

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

2002 年的 SHARE 演示文稿中提供了一些调整信息 S8213TR.PDF 当前可用 here (the information is still valid). Note that there are many tuning opportunities relative to Language Environment runtime options related to storage allocation. There exist a number of different mechanisms to set Language Environment options。您的 CICS 系统程序员可能对此事有意见。可能有关于语言环境运行时选项的商店标准。

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

除了cschneid提到的东西...

包含的程序可以引用包含程序的数据部分中使用 GLOBAL 属性声明的项目。包含的程序不需要为了引用它们而声明 GLOBAL 项。

无法使用 RECURSIVE 属性声明包含的程序。