查看IBM的Enterprise COBOL编译器生成的代码

Gra*_*da3 3 cobol mainframe zos

我最近开始用COBOL做一些工作,之前我只在大型机上的z/OS汇编程序中完成了工作.

我知道COBOL将被翻译成大型机的机器代码,但我想知道是否可以看到生成的代码?

我想用它来更好地理解COBOL的工作原理.

例如,如果我要编译COBOL程序,我希望看到编译产生的程序集.这样的事情可能吗?

Bil*_*ger 8

只是因为这个:"我想用它来更好地理解Cobol的工作原理".

简单的答案是,对于z/OS上的Enterprise COBOL,有一个编译器选项LIST.LIST将在您的编译列表中提供所谓的"伪汇编程序"输出(以及用于理解可执行程序的一些其他有用的东西).另一个编译器选项OFFSET显示从为每个COBOL动词生成的代码的程序开始的位移.LIST(本身具有偏移量)和OFFSET是互斥的.所以你需要指定LIST和NOOFFSET.

编译器选项可以在EXEC PGM =的PARM上为编译器指定.由于PARM限制为100个字符,因此也可以在数据集中指定编译器选项,其中DDName为SYSOPTF(反过来,您使用编译器选项指定其使用).

指定编译器选项的第三种方法是将它们包含在程序源中,使用PROCESS或(更常见的,因为它更短)CBL语句.

您可能有一个"面板"来编译您的程序.这可能有一个允许指定选项的字段.

但是,请注意以下几点:在安装编译器时,有可能"装入"编译器选项(这意味着应用程序员无法更改它们); 安装编译器时,可以防止使用PROCESS/CBL语句.

上述原因是标准化.存在影响代码生成的编译器选项,并且在同一系统中使用不同的代码生成选项会导致不必要的影响.即使跨系统,如果程序员倾向于期望"正常"选项,则可能不希望使用不同的代码生成选项.

仅列出选项的选项不太可能"钉",但如果您无法指定选项,则可能需要发出特殊请求.这不常见,但你可能不走运.如果它不适合你,那不是我的错.

有关特定版本的"企业COBOL编程指南"中介绍了此编译器选项以及如何指定它们.在那里你还可以找到伪汇编程序的文档(请注意它在文档中显示为"伪汇编程序","伪汇编程序"和"伪汇编程序",没有充分的理由).

当你看到伪汇编程序时,你会发现它与Assembler语句的格式不同(我从未发现过为什么,但据我所知,它已经有40多年了).伪装配器的行还将包含您从Assembler输出中已熟悉的格式的机器代码.

不要期望看到编译的COBOL程序看起来像你要编写的汇编程序.Enterprise COBOL遵循IBM Extensions的语言标准(1985)."为什么它可能会这样做"的答案将是"因为",除了优化(见后文).

您所看到的将在很大程度上取决于编译器的版本,因为在2013年夏天,IBM推出了V5,全新的代码生成和优化.直到V4.2,代码生成器可追溯到"ESA",这意味着自ESA以来引入的600多个机器指令不可用于Enterprise COBOL程序和扩展寄存器.使用V4.2和V6.1(编写时的最新版本)编译的相同COBOL程序将明显不同,不仅因为不同的指令,还因为可执行COBOL程序的结构也经过重新设计.

然后是优化.对于V4.2,有一个可能的优化级别,优化的代码通常是"可识别的".使用V5 +,有三个级别的优化(没有要求它就会达到零级别),并且优化更加极端,包括极端的东西.如果您有V5 +,并且想要了解更多有关正在发生的事情,请使用OPT(0)来控制正在发生的事情,然后记下OPT(1)和OPT(2)的影响(并实现随着编译时间的增加,优化工作量增加了多少.

内部的官方文档确实不多.搜索引擎将揭示一些东西.IBM的编译器咖啡馆:COBOL咖啡馆论坛 -如果您想要更多V5 +内部知识,IBM是一个好地方,因为有几个开发人员参加.对于V4.2,这里可能会提出更多具体问题.