Cobol 通过改变执行:确切的行为?

Cobol 通过改变执行:确切的行为?,cobol,Cobol,我试图理解COBOL程序的行为,但我遇到了以下几行: PERFORM 525-NUMERIC THRU 525-EXIT VARYING K FROM 1 BY 1 UNTIL K > CAR-L. 我理解全局概念,即它是基于K值的某种循环,但我无法理解通过525-EXIT单词的影响?执行可以连续执行一系列段落或部分。这是通过使用THRU/THROUGH来命名该系列的最后一段/部分来完成的,执行者已

我试图理解COBOL程序的行为,但我遇到了以下几行:

PERFORM  525-NUMERIC    THRU  525-EXIT                       
    VARYING K FROM 1  BY 1   UNTIL  K > CAR-L.         

我理解全局概念,即它是基于
K
值的某种循环,但我无法理解
通过525-EXIT
单词的影响?

执行可以连续执行一系列段落或部分。这是通过使用THRU/THROUGH来命名该系列的最后一段/部分来完成的,执行者已经命名了起始点

段落的简单执行:

       PERFORM                      10-OPEN-INPUT-FILES
这为执行建立了一个“范围”,从10个打开的输入文件开始,到该段的最后一个语句结束

一个接一个地执行多个段落:

       PERFORM                      10-OPEN-INPUT-FILES
         THRU                       10-OPEN-INPUT-FILES-EXIT
这为PERFORM建立了更大的范围,从10-OPEN-INPUT-FILES开始,到最后一个语句10-OPEN-INPUT-FILES-EXIT结束

这并不是一件好事,也不是一件有用的事,但它在一种特定的方式中得到了广泛的应用,这也许就是你所拥有的。这是要有一个与执行的每个段落关联的“退出段落”。一个原始段落,后跟一个与该原始段落关联的唯一退出段落(第二段的位置,没有其他内容)

这从来都不是必需的,没有它们,程序工作得很好。然而,由于有一个“退出段落”,现在当然有一个标签,可以成为GO TO的目标。编写一些愚蠢的代码,或者遇到一些已经以这种方式编写的代码,然后只是插入一个GO-TO来让你(但可能不是下一个人)摆脱麻烦。这不是一件好事,尽管它通常被视为“权宜之计”。下一次在同一个代码中,我们将采取权宜之计,下一次,本来应该很简单的事情变成了。。。复杂的

令人震惊的是(我认为,对许多网站来说,这是正常的做法),超过几个网站在其当地标准中规定,每个执行的段落必须包含一个退出段落,并且执行。。。通过。。。必须进行编码

除了通过邀请使用GO TO来自找麻烦外,另一个问题是代码的物理位置现在是相关的。如果在退出段落之前放置新段落,则它将成为执行范围的一部分,无论是否有意。有些人甚至打算将几段代码编写在一次表演的范围内,使用方便的GO to作为他们的“摆脱混乱”工具

另一个问题是,当您遇到执行。。。通过。。。如果不查看段落(或章节)本身,您就不知道在PERFORM中包含了多少段落(或章节)

您还可以执行一个部分。这是一个过程标签,后跟单词部分,并以句号/句点结束

节可以包含段落。执行节时,节中的所有段落都在执行范围内,直到该节的最后一条语句为止。这就像一场表演。。。通过。。。没有通透。。。一点它与执行程序有相同的问题。。。通过。。。另外一个问题是,如果将独特的段落用作GO-TO的目标,那么在复制某个章节以创建新的章节时,必须非常小心。从一节(或一段)中跳出来是完全合法的,但这通常是无意的,可能会导致混乱,因为程序控制会在其他地方游荡。如果在一节中使用“转到”退出段落,最好是对退出段落使用相同的名称。一节中的任何GO TO都将由编译器自动“限定”到该节中的段落(如果一节中引用了非唯一的段落名称,但该节本身中没有该名称的段落,编译器将发现错误)

使用您的代码,找到正在执行的段落,然后按顺序搜索THRU上指定的段落。这可能只是一个愚蠢的退出(一个只有退出语句和句号的段落)。如果你运气不好的话,这两段之间可能还有其他段落。任何此类段落都包含在PERFOR的范围内,在PERFOR语句中没有明确说明。

值得注意的是,EXIT语句本身没有任何作用。这是一个“无操作”或NOP(或NOOP)。在执行的段落末尾,将生成许多指令来执行退出处理,这是自动的,不依赖(也从来没有)退出语句的存在

在1985年的标准之前,过去的情况是,出口必须单独在一个段落中编码。现在已经不是这样了。您可以用退出语句(比如20)填充段落,然后用显示完成段落。执行段落,您将看到显示输出

不带“通过”的段落不应包含“转到”。如果它确实包含GO TO,则不是编译错误。这是一场等待发生的事故

觉得需要使用的人必须使用PERFORM。。。通过。。。或者使用一段的执行。不幸的是,即使原始编码器不使用GO-TO,使用PERFORM。。。通过。。。或者执行某个部分确实可以让将来的人更容易地使用GO to。如果有一个GO-TO去的地方,那么GO-TO很可能会出现在某个点上。如果没有GO-TO的现有目标,那么下一个编码器将不得不进行额外的更改,从而推迟使用GO-TO

在当前标准中,从2014年开始,有一些新版本的EXIT。(EXIT的
EXIT程序
版本已经存在很长时间了,尽管这些天受IBM启发的
GOBACK
更可能用于返回调用程序)

新的可能性包括退出段落和退出部分
         Perform Proc-A thru Proc-D.
         ...

     Proc-A. 
        ....

     Proc-B.
        ....

     Proc-C.
        ....

     Proc-D.
        ....
     Perform Proc-A
     Perform Proc-B
     Perform Proc-C
     Perform Proc-D
 Perform B100-Load-From-DB thru B500-Save-To-Db
 Perform B100-Load-From-DB
 Perform B200-Adjust-Stock-for-Purchases
 Perform B300-Adjust-Stock-for-Sales
 Perform B400-Calculate-Markdowns
 Perform B500-Save-To-Db
 Proc-B.
    ....

 Proc-in-wrong-position.
    ....

 Proc-C.
    ....
    Perform B100-Load-From-DB thru B500-Save-To-Db
...
B100-Load-From-DB
...
B200-Adjust-Stock-for-Purchases
...
B300-Adjust-Stock-for-Sales
...
Some-Danged-Ol-Thing
...
B400-Calculate-Markdowns
...
B500-Save-To-Db
    Perform B100-Load-From-DB thru B500-Save-To-Db
...
B100-Load-From-DB
...
    GO TO B400-Calculate-Markdowns
...
B200-Adjust-Stock-for-Purchases
...
B300-Adjust-Stock-for-Sales
...
    GO TO B200-Adjust-Stock-for-Purchases
...
Some-Danged-Ol-Thing
...
B400-Calculate-Markdowns
...
B500-Save-To-Db
    Perform B200-Adjust-Stock-for-Purchases thru B300-Adjust-Stock-for-Sales
...
    Perform B100-Load-From-DB thru B200-Adjust-Stock-for-Purchases
...
    Perform B100-Load-From-DB thru Some-Danged-Ol-Thing