查看由 IBM 的企业 COBOL 编译器生成的代码

View code generated by IBM's Enterprise COBOL compiler

我最近开始使用 COBOL 进行一些工作,之前我只在 z/OS 大型机上的汇编程序中做过工作。

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

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

例如,如果我要编译一个 COBOL 程序,我想查看编译产生的程序集。这样的事情可能吗?

心软,只因:"I want to use this to better understand the under workings of Cobol".

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

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

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

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

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

以上原因是标准化。有些编译器选项会影响代码生成,并且在同一系统中使用不同的代码生成选项可能会导致不必要的影响。即使跨系统,如果程序员倾向于期望 "normal" 选项,不同的代码生成选项也可能不是理想的。

仅列出选项不太可能是 "nailed",但如果您无法指定选项,那么您可能需要提出特殊要求。这并不常见,但你可能不走运。如果它不适合你,那不是我的错。

此编译器选项,以及如何指定它们,都记录在适用于您的特定版本的企业 COBOL 编程指南中。在那里您还可以找到伪汇编程序的文档(请注意,它在文档中显示为 "pseudo-assembler"、"pseudoassembler" 和 "pseudo assembler",没有任何理由)。

当你看到伪汇编程序时,你会发现它的格式与汇编程序语句的格式不同(我从未发现原因,但据我所知它已经超过40 年)。带有伪汇编程序的行还将包含您已经从汇编程序的输出中熟悉的格式的机器代码。

不要指望看到编译后的 COBOL 程序看起来像您要编写的汇编程序。 Enterprise COBOL 遵循带有 IBM 扩展的语言标准 (1985)。 "why does it do it likely that" 的答案将是 "because",除了优化(见后面)。

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

然后是优化。到了V4.2,有一级可能的优化,优化后的代码一般是"recognisable"。使用 V5+,有三个优化级别(您无需请求即可获得零级别)并且优化更加极端,包括极端的东西。如果你有 V5+,想知道更多关于正在发生的事情,使用 OPT(0) 来掌握正在发生的事情,然后注意 OPT(1) 和 OPT(2) 的影响(并意识到,随着编译时间的增加,优化投入了多少工作)。

内部的官方文档并不多。搜索引擎会揭示一些东西。如果您想了解更多 V5+ 内部知识,IBM's Compiler Cafe:COBOL Cafe Forum - IBM 是个好地方,因为那里有几个开发人员。对于 V4.2 及更高版本,这里可能是提出更多具体问题的好地方。