Онлайн-компилятор - перехватывает программу, когда она ожидает ввода, и автоматически вводит ее - PullRequest
0 голосов
/ 05 июля 2019

Контекст

Я написал игрушечный компилятор для проекта колледжа.Сейчас я делаю веб-сайт для компилятора и хочу, чтобы посетители могли писать код на своем языке на своем веб-сайте, а затем запускать его в своего рода виртуальном терминале в браузере.Вроде как Go язык и язык Haskell веб-сайтов.

Виртуальный частный сервер (VPS) или некоторая облачная функция может компилировать написанный пользователем код с помощью моего компилятора,Затем сервер также может запустить его, но он должен будет контролировать программу, чтобы:

  1. Если программа что-либо записывает в STDOUT, сервер отправит данные во внешний интерфейс, которыйотобразит его на виртуальном терминале.Одним из способов может быть перенаправление вывода с помощью >.

  2. Каждый раз, когда программа запрашивает ввод, сервер уведомляет интерфейс.Затем интерфейс отправляет обратно текст, набранный в виртуальном терминале, который сервер вводит в STDIN.

Я думаю, что я буду использовать NodeJS для сервера.

Вопрос

Как узнать, когда исполняемый файл ожидает ввода и как его подавать, когда он поступает? Существует ли какой-либо предварительно созданный механизм или мне нужно написать программу мониторинга?.

Вот несколько способов, о которых я подумал:

  1. Наличие виртуальной машины в стиле Valgrind, которая запускает сгенерированный исполняемый файл.Я определенно не собираюсь идти так далеко.

  2. Измените мой компилятор так, чтобы для каждой «входной» команды на языке он генерировал ассемблерный код для фактической записи в файл, который требует ввода (который опрашивается сервером)и посмотрите другой файл на предмет изменений (куда сервер будет записывать входящие данные).

Я надеюсь, что есть более простой способ.Кроме того, если то, что я пытаюсь сделать, имеет более описательное имя и документацию, пожалуйста, дайте мне знать.

1 Ответ

1 голос
/ 06 июля 2019

Как узнать, когда исполняемый файл ожидает ввода

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

Так работает любой реальный или виртуальный терминал в каждой Unix-подобной системе.Это то, что вы бы сделали, если бы написали обычный эмулятор терминала.Нет необходимости делать это иначе, потому что вы подключены к эмулятору терминала через HTTP.

...