14

是否可以在不提供输入文件的情况下执行 COBOL 代码?我正在使用cobc.

我试图通过管道将代码传递给cobc进程:

$ cat my-input.cbl | cobc
cobc: No input files

要编译一个文件并运行它,我这样做:

cobc -x di.cbl -o a && ./a

假设我没有文件,我只有某处的代码(可能在变量中,作为字符串),我可以将它传递给cobc吗?这比创建文件然后编译并运行它要好。

在我的例子中,用户输入了 COBOL 程序的源代码,这是一个字符串变量。目前,我将代码保存在一个文件中,编译它然后执行它。如果 cobc 支持在 stdin 甚至 cli 选项中管道化代码片段,并生成二进制文件甚至直接显示结果(不确定这是一个好主意还是坏主意),那就太好了。例如,node 有 -p 选项: node -p 'console.log(1)' - 这将输出 1\nundefined。g++ 有这个特性——

4

2 回答 2

6

昨天不可能,但今天是这样,一旦领导批准更改,我就会将更改放入源代码树。

编译器源代码的两个小改动和 - 可用于指示标准输入。

prompt$ echo 'program-id. test. display "hello".' | cobc -free -frelax -x -o thing -
-: 1: Warning: PROCEDURE DIVISION header missing - assumed
prompt$ ls -l
-rwxrwxr-x. 1 btiffin btiffin 13192 Jul 31 17:27 thing
prompt$ ./thing
hello

然后,这将适用于任何操作系统,而不仅仅是那些支持 /dev/stdin 的操作系统(目前,正如 paxdiablo 所写,对于 GNU/Linux 等来说,这是一个非常有效的选择)。

顺便说一句;cobc 已经可以用作 POSIX 解释器。

#!/usr/local/bin/cobc -xvg
       identification division.
       program-id. SAMPLE.

       procedure division.
       display "scripted" end-display
       goback.

       end program SAMPLE.

prompt$ chmod +x interp.cob
prompt$ ./interp.cob

给予

Command line:   /usr/local/bin/cobc -xvg ./interp.cob 
Preprocessing:  ./interp.cob -> interp.i
Return status:  0
Parsing:        interp.i (./interp.cob)
Return status:  0
Translating:    interp.i -> interp.c (./interp.cob)
Executing:      gcc -std=gnu99 -c -I/usr/local/include -pipe -Wno-unused
                -fsigned-char -Wno-pointer-sign -g -o "/tmp/cob25113_0.o"
                "interp.c"
Return status:  0
Executing:      gcc -std=gnu99 -Wl,--export-dynamic -o "interp"
                "/tmp/cob25113_0.o" -L/usr/local/lib -lcob -lm -lgmp
                -lncursesw -ldb -ldl
Return status:  0

可悲的是,这只是为了构建。执行需要额外的步骤。

prompt$ ./interp
scripted

“立即运行代码”没有编译器选项,因此将添加 -J(固定形式)和 -j(自由形式)选项。运行作业,成为 -x 的一种新形式(创建可执行文件),但也会在处理结束时执行二进制文件。然后我们将可以访问 POSIX 中的 cobc “脚本”。目前只允许构建,并且运行必须是单独的命令。

POSIX hashbang 行的固有限制仅限于单个参数,因此 -j -free 不起作用, -j -Xref 等也不起作用,但在限制范围内,它将允许使用 cobc 脚本。

这是对编译器的另一行更改,以及 400 行选项解析和文档。;-)

应该在几个小时内准备好进行测试。同样,这些更改将需要所有其他编译器维护者的批准,但我看不出有任何理由不允许这些改进。两次提交,一次用于 - 作为标准输入,-J -j 用于在编译结束时运行作业。

于 2015-07-31T22:39:50.270 回答
3

有一点偷偷摸摸,这是可以做到的。首先创建一个我们可以用来测试的文件:

000100 * HELLO.COB OpenCOBOL FAQ example
000200 IDENTIFICATION DIVISION.
000300 PROGRAM-ID. Hello.
000400 PROCEDURE DIVISION.
000500    DISPLAY "Hello world!".
000600    STOP RUN.

现在您已经知道我们可以编译并运行它:

pax> cobc -x hello.cob ; hello
Hello world!

但是,如果你不希望它在文件中,你可以简单地使用/dev/stdin“文件”来获取信息,调整输出文件,让它给你你想要的:

pax> cat hello.cob | cobc -x /dev/stdin -o hello2 ; hello2
Hello world!

这是来自一个文件,但它没有cobc打开文件来编译它,所以你可以cat hello.cob用任何生成 COBOL 源文件的命令替换它的标准输出。

您在程序中需要做的就是打开一个cobc/dev/stdin文件作为输入和合适的输出文件运行的进程,然后通过管道将您的 COBOL 程序导入其中。

于 2015-07-31T09:25:58.083 回答