GNU COBOL
好吧,他们说这不可能完成。实际上,是我说无法完成。现在已完成,并使用所应用的方法重新实现了过时的语言功能。
问题指出:
如果将任何其他空格或语句(不会中断代码流)添加到源代码,则应在运行时(如果适用,在编译之后)将其反映出来。
的东西任何量可以前三个插入DISPLAY
S的引起输出的开始,和任何后的DISPLAY
s都会“中断代码流”,所以可以。
COBOL曾经有一个TRACE
动词(语句),该动词仅在执行时列出源行号(无法访问程序中的行号)。尽管用途有限,但我包含了TRACE的实现。
ID Division.
Program-ID. HIWHERE.
ENVIRONMENT DIVISION.
configuration section.
source-computer. TinkerToy with debugging mode.
Procedure Division.
Declaratives.
Debug-Declaratives Section.
Use For Debugging on a b
.
Debug-Declaratives-Paragraph.
Display Debug-Line "!"
.
End Declaratives
.
Main-Program Section.
DISPLAY "Perform"
Display "Hello World, from line " no advancing Perform b
display "GO TO"
Display "Hello World, from line " no advancing GO TO a
.
a.
dISPLay "Fall through"
Display "Hello World, from line " no advancing. b.
The-Last-bit-OF-the-PROGRAM.
GOBACK
.
输出是
Perform
Hello World, from line 18!
GO TO
Hello World, from line 20!
Fall through
Hello World, from line 23!
为了展示编写语言的能力和灵活性,本示例同时使用了混合大小写,完全小写和完全大写的形式。没关系,因为在处理时,所有内容都“折叠”为大写。
从正在运行的程序中获取正在运行的程序中源行号的唯一标准COBOL方法是使用DEBUGGING
DECLARATIVE
。在此类声明的a SECTION
内(严格在a内的一段内)SECTION
,您可以访问特殊寄存器DEBUG-LINE
。它包含动词(语句)的源行号,该动词导致将控制权转移到特定的过程名称(段落或SECTION
)。
因此,使用PERFORM
,或GO TO
,或“掉线”将SECTION
执行调试声明中的段落。
好的但是 DISPLAY
不会导致控制权的转移。
没问题。将其与控制权转移放在同一行。
问题在于,如果“将任何其他空格或语句(不会中断代码流)添加到源代码中,则应在运行时(如果适用,在编译之后)将其反映出来”。
因此,将其放在同一行上但在控制权转移之前,将其内容DISPLAY
分成两部分(请记住,“在这种情况下,我们希望显示输出字符串的语句的第一行号” )并在控制权转移之前输出第一部分,第二部分则从DEBUG-LINE
在调试过程中。
最后一个棘手的地方是“掉线”(可以PERFORM
编辑“过程” ,可以是a的目标GO TO
,也可以简单地通过下一行输入)。在这种情况下,将放到DISPLAY
定义过程的行上,但在定义的前面。
“过程”(a
和b
)的名称已被严格缩短,以使它们可以与放在同一源代码行中DISPLAY
。严格来说,COBOL过程名称应从第8列到第11列之间的某个位置开始。但是,如今的语法对此要宽松得多。在某种程度上,我可以在与某些代码相同的行上定义过程名称。甚至嵌入到代码中。需要保养,偶尔需要停止。
在显示的PROCEDURE DIVISION
每个句号中,是必需的,不再需要。
编译:
cobc -x -g hiwhere.cbl
要执行(Linux):
COB_SET_DEBUG=Y ./hiwhere
最后,返回TRACE(没有READY / RESET)。
ID Division.
Program-ID. tRacE.
ENVIRONMENT DIVISION.
configuration section.
source-computer. TinkerToy with debugging mode.
Procedure Division.
Declaratives.
Debug-Declaratives Section.
Use For Debugging on a
.
Debug-Declaratives-Paragraph.
Display Debug-Line
.
End Declaratives
.
Main-Program Section.
* Just append "perform a" to a single-line statement.
DISPLAY "1" . perform a
Display "2" . perform a
display "3" . perform a
* Or prepend "perform a." for a multi-line statement, or a
* statement which won't "come back".
perform a. GOBACK
.
a.
CONTINUE
.
输出为:
1
17
2
18
3
19
20
其中三个DISPLAY语句输出1、2和3,17、18、19和20是“可执行”(非调试)行的行号。