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

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

Я попытался cobc процессу cobc:

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

Чтобы скомпилировать файл и запустить его, выполните следующие действия:

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

Предположим, у меня нет файла, у меня есть только код где-нибудь (возможно, в переменной, как строка), могу ли я передать его в cobc? Было бы лучше, чем создать файл, а затем скомпилировать его и запустить.

В моем случае пользователь вводит исходный код программы COBOL и строковую переменную. В настоящее время я сохраняю код в файле, компилирую его, а затем выполняю его. Было бы неплохо, если бы cobc поддерживал бы передачу кода фрагмента в stdin или даже как параметр cli, а также генерировал бы двоичный файл или даже показывал результат напрямую (не уверен, что это хорошая или плохая идея). узел, например, имеет параметр -p: узел -p 'console.log(1)' - это будет выводить 1\nundefined. g++ имеет эту функцию -

Ответ 1

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

Два небольших изменения источника компилятора и - могут использоваться для указания 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, ограничиваются одним аргументом, поэтому -J -free не работает, а также -J -x ref и т.д., Но в пределах, это позволит сценарии cobc.

Эта другая строка изменяется на компилятор и 400 строк разбора и документирования параметров. ;-)

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

Ответ 2

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

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 с cobc /dev/stdin качестве входного и подходящего выходного файла, а затем подключить к нему свою программу COBOL.