Cobol 这个程序的流程是什么?

Cobol 这个程序的流程是什么?,cobol,Cobol,我遇到一个cobol程序,它让我感到困惑,是包含代码的页面,它试图证明ALTER有多糟糕,但同时我不理解程序流程 PERFORM 2100-PROCESS-RECORD THRU 2199-EXIT. ... 2100-PROCESS-RECORD. GO TO 2110-PROCESS-HEADER. * 2110-PROCESS-HEADER. * code to process a file header ALTER 2100-PROCESS-RECOR

我遇到一个cobol程序,它让我感到困惑,是包含代码的页面,它试图证明ALTER有多糟糕,但同时我不理解程序流程

     PERFORM 2100-PROCESS-RECORD THRU 2199-EXIT.
...
 2100-PROCESS-RECORD. 
     GO TO 2110-PROCESS-HEADER.
*
 2110-PROCESS-HEADER.
* code to process a file header
     ALTER 2100-PROCESS-RECORD TO 2120-PROCESS-DETAIL.
     GO TO 2199-EXIT.
*
 2120-PROCESS-DETAIL.
* code to process a detail record 
     GO TO 2199-EXIT.
...
*
 2199-EXIT.
     EXIT.
在我看来,流程是这样的:

     PERFORM 2100-PROCESS-RECORD THRU 2199-EXIT.
...
 2100-PROCESS-RECORD. 
     GO TO 2110-PROCESS-HEADER.
*
 2110-PROCESS-HEADER.
* code to process a file header
     ALTER 2100-PROCESS-RECORD TO 2120-PROCESS-DETAIL.
     GO TO 2199-EXIT.

 2199-EXIT.
     EXIT.
如果ALTER要更改GO-to的目的地,那么如果GO-to已经执行并且程序退出,它怎么会有用呢?

对此进行了解释。第一次执行是正确的,但在后续运行中,行为会发生更改:

“我们第一次执行PERFORM时,控件通过2110-PROCESS-HEADER。但是,该段末尾的ALTER更改了2100-PROCESS-RECORD中GO TO的目的地。因此,在执行的所有后续执行中,控件不会通过2110-PROCESS-HEADER。而是通过2120-PROCESS-DETAIL

潜在的混淆是显而易见的。更改后的GO-TO并不是去它声称要去的地方,而是去某个远程代码段中指定的地方。要理解代码的工作原理,您需要知道ALTER是存在的,并且需要知道执行ALTER的所有情况

这叫做自修改代码,很难理解和调试。对于睡前的轻松阅读,我推荐梅尔的故事


在Cobol中,EXIT语句并不意味着“退出程序”:

通过2199-EXIT执行2100-PROCESS-RECORD只执行一次,不是吗?如果执行,则没有问题。但很可能有很多记录,所有记录都需要处理。你只是在学习COBOL吗?EXIT语句并不意味着它在许多其他语言中所起的作用。因此,是EXIT什么也不做,还是EXIT让程序知道这是段落的结尾,并将控制权转移回下一个要执行的语句?@jcomeau-Ha!丢失的+1不是软件问题。。。只是注意力不足。解决:)你用谷歌搜索“cobol出口”了吗?我已经更新了我的答案。ALTER被COBOL85标准折旧了(大约25年前)。如果你在《荒野》中遇到ALTER,你会看到一些非常古老的代码。ALTER在50年代和60年代初才有“生命”,我不会花很多时间研究它。