Как запустить 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.