【问题标题】:View code generated by IBM's Enterprise COBOL compiler查看 IBM Enterprise COBOL 编译器生成的代码
【发布时间】:2017-04-06 20:00:12
【问题描述】:

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

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

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

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

【问题讨论】:

  • 使用 LIST,NOOFFSET 作为编译选项。如果您无法直接更改选项,请在程序开头添加CBL LIST,NOOFFSET(在ID DIVISIONIDENTIFICATION DIVISION 之前从第7 列开始。
  • @BillWoodger LIST 是否会真正打印汇编程序列表(或仅打印 COBOL 源代码列表)?如果是的话,这应该是一个真正的答案,而不是评论。
  • @SimonSobisch 不,这不应该是一个答案。询问同事需要 2 秒钟,查阅 Enterprise COBOL 编程指南需要 5 秒钟。 Use the LIST compiler option to produce a listing of the assembler-language expansion of your source code. 如果您想要列出您指定的来源...SOURCE。这需要超过 5 秒才能得出答案,因此对任何人都没有好处。
  • @SimonSobisch 最后我花了超过五秒...

标签: cobol mainframe zos


【解决方案1】:

让步,只是因为这个:“我想用它来更好地理解 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 之前的版本,这里可能是询问更多具体问题的好地方。

【讨论】:

  • 在我的大学时代,这就是我了解 System/370(当时)如何工作的最佳方式,尤其是当我比较优化代码和未优化代码时。 (这是 OS Full ANS COBOL V4,那是我的日期。)它不仅仅是汇编程序,它也是 COBOL,因为您可以从生成的代码中学到很多关于编译器的知识。我已经开始从事以汇编为重点的 sysprog 职业,LIST 帮助我成为了更好的汇编程序员,以及 COBOL、PL/I,然后是 C。如果您可以访问 C 编译器,它可以提供更多洞察力,尤其是在调优和架构方面。
  • @GrapeSoda3 我对这种事情感兴趣的事实很感兴趣。用我在 gmail 的 Stack Exchange 用户名给我发一封电子邮件。这些天你对这方面的兴趣非常罕见,有些人愿意培养这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-22
  • 1970-01-01
相关资源
最近更新 更多