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

4
我最近开始学习COBOL,在此之前我只在主机上使用过z/OS汇编语言。我知道COBOL会被翻译成主机机器码,但是我想知道是否能够查看生成的代码?我希望通过这种方式更好地理解COBOL。例如,如果我编译一个COBOL程序,我想看到从编译中产生的汇编代码。是否有可能做到这一点?

2
在编译时使用LIST和NOOFFSET作为选项。如果无法直接更改选项,请在程序开头(在第七列之后的ID DIVISION或IDENTIFICATION DIVISION之前)添加“CBL LIST,NOOFFSET”。 - Bill Woodger
2
@BillWoodger会打印汇编程序清单(还是只有COBOL源代码清单)?如果是的话,这个应该是一个答案,而不是一个评论。 - Simon Sobisch
1
@SimonSobisch 不,这不应该是一个答案。询问同事只需要两秒钟,查阅企业COBOL编程指南只需要五秒钟。使用“LIST”编译器选项生成源代码汇编语言扩展的列表。如果您想要指定源代码的列表...请使用“SOURCE”。这需要超过五秒钟才能成为答案,因此对任何人都没有好处。 - Bill Woodger
@SimonSobisch 最后我花了超过五秒钟... - Bill Woodger
1个回答

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语句。
以上的原因是标准化。有些编译器选项会影响代码生成,在同一系统中使用不同的代码生成选项可能会导致意外后果。即使在不同系统之间,如果程序员倾向于期望“正常”的选项,则不希望使用不同的代码生成选项。
列出仅限列表的选项不太可能被“固定”,但是如果您无法指定选项,则可能需要提出特殊请求。这不常见,但您可能很不幸。如果对您不起作用,那不是我的错。
您特定版本的 Enterprise COBOL 编程指南中记录了这些编译器选项以及如何指定它们。您还将在其中找到伪汇编程序的文档(请注意,由于没有充分理由,它在文档中出现为“伪汇编程序”,“伪汇编程序”和“伪汇编程序”)。
当你看到伪汇编代码时,你会发现它的格式与汇编语句不同(我从未发现为什么,但据我所知,它已经存在了40多年)。伪汇编代码所在的行还将包含机器码,其格式与您已经熟悉的汇编输出相同。
不要期望看到编译后的COBOL程序看起来像您编写的汇编程序。Enterprise COBOL遵循语言标准(1985)和IBM扩展。对于“为什么会这样做”,答案可能是“因为”,除了优化(稍后再看)。
您看到的内容将严重取决于您编译器的版本,因为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的编译器咖啡厅:COBOL咖啡厅论坛-IBM是一个很好的地方,因为有几位开发人员会参与其中。对于V4.2及以下版本,这里可能是询问更多具体问题的好地方之一。

在我上大学的时候,这就是我学习 System/370(当时)最好的方式,特别是当我比较优化和未优化的代码时。(那时是 OS Full ANS COBOL V4,这让我感到有些老了。)这不仅仅是汇编器,还包括 COBOL,因为你可以从生成的代码中学到很多关于编译器的知识。我已经朝着一个以汇编为重点的系统程序员职业发展,而 LIST 帮助我成为了更好的汇编程序员,以及 COBOL、PL/I 和 C。如果你有访问 C 编译器的权限,它可以提供更多的见解,特别是对于调优和架构方面。 - zarchasmpgmr
@GrapeSoda3 我对你感兴趣的事情也很感兴趣。请发送电子邮件至我的 Stack Exchange 用户名@gmail.com。现在这种兴趣非常罕见,有些人会很乐意培养这种兴趣。 - zarchasmpgmr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接