让步,只是因为这个:“我想用它来更好地理解 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 编程指南中。在那里您还可以找到伪汇编器的文档(请注意,它在文档中显示为“伪汇编器”、“伪汇编器”和“伪汇编器”,没有充分的理由)。
当你看到伪汇编器时,你会发现它与汇编器语句的格式不同(我从来没有发现为什么,但据我所知,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) 的影响(并意识到,随着编译时间的增加,优化需要投入多少工作)。
实际上并没有大量关于内部结构的官方文档。搜索引擎会揭示一些东西。如果您想了解更多 V5+ 内部知识,IBM's Compiler Cafe:COBOL Cafe Forum - IBM 是一个好地方,因为那里有几个开发人员参加。对于 V4.2 之前的版本,这里可能是询问更多具体问题的好地方。