Как запустить cobc без входного исходного файла, но через канал?

можно ли выполнить код COBOL без предоставления входных файлов? Я использую cobc.

Я попытался передать код в

2 ответов


Это было невозможно вчера, но это сегодня, и я получу изменения в дереве источника, как только ведущий одобрит изменение.

два небольших изменения в источнике компилятора и - могут использоваться для указания stdin.

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 (создать исполняемый файл), но также будет выполнять двоичный файл в конце обработки. Тогда у нас будет доступ к "скриптам" cobc в POSIX. В настоящее время все, что разрешено, - это сборка, и запуск должен быть отдельной командой.

и присущие ограничения, что строки POSIX hashbang ограничены одним аргументом, поэтому-J-free не будет работать, ни - j-Xref и т. д., Но в пределах, это позволит скрипты cobc.

это еще одно изменение строки в компиляторе,и 400 строк разбора опций и документации. ;-)

должен быть готов к тестированию через несколько часов. Снова, эти изменения потребуют одобрения всех других сопровождающих компилятора, но я не вижу причин не допускать улучшений. Два коммита, один для-as stdin и-J-j для выполнения задания в конце компиляции.


С некоторой скрытностью это можно сделать. Сначала создайте файл, который мы можем использовать для тестирования:

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.