我最近开始使用COBOL进行一些工作,之前我只在大型机上的z / OS汇编程序中完成了工作。
我知道COBOL会被翻译成大型机的机器代码,但我想知道是否可以看到生成的代码?
我想用它来更好地理解COBOL的工作原理。
例如,如果我要编译COBOL程序,我希望看到编译产生的程序集。这样的事情可能吗?
答案 0 :(得分: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多年了)。带有伪汇编程序的行还将包含您从汇编程序输出中已熟悉的格式的机器代码。
不要期望看到编译的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's Compiler Cafe:COBOL Cafe Forum - IBM是一个很好的地方,如果你想要更多的V5 +内部知识,因为有几个开发人员参加。对于V4.2,这里可能会提出更多具体问题。