如何在没有输入源文件但通过管道的情况下 运行 cobc?

How to run cobc without an input source file, but via a pipe?

是否可以在不提供输入文件的情况下执行 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++ 具有此功能 –

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

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 "file" 来获取信息,调整输出文件所以它给你你想要的:

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

它来自一个文件,但它不是 cobc 打开文件进行编译,因此您可以将 cat hello.cob 替换为任何生成 COBOL 源文件到其标准输出的命令。

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

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

对编译器源代码进行了两处小改动,并且 - 可用于指示标准输入。

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

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

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

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

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