Pull to refresh

STDIO плагины или как совместить несовместимое

Reading time1 min
Views708
Идея проста — подключаем к программе внешний модуль через pipe (STDIO или TCP/IP).
Обмен текстовыми командами в формате командной строки: <команда> [параметр [параметр [...]]]<CR/LF>
В качестве параметров могут быть любые сериализованные данные. Как в протоколах POP3/SMTP.
image
Таким образом, можно подключать к программе, например, проверку синтаксиса или переводчик, который реально находится где-то в интернете. Можно подключать плагины, написанные на любых скриптовых языках (батники, например) и платформах. Можно даже подключить программу саму к себе. =)

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


Еще из плюсов — падение такого «плагина» никак не повлияет на работу программы. Плагины могут работать в отдельных задачах или на отдельных машинах, можно легко строить многозадачные вычислительные облака.

Я попробовал такое реализовать — получилось. Правда, есть некоторые сложности в работе STDIO под Windows. Например, неуправляемая буферизация, когда плагин «кеширует» свой вывод в буфер и отдает его только при переполнении буфера или при закрытии канала. Природу этого явления я до конца не изучил, но если плагин делает flush buffers для каждой команды, то все работает как надо.

Другая проблема — работающие плагины «засоряют» список процессов. Хотя, возможно, это и плюс… =)

Скорость работы вполне приличная, в эпоху «карманных гигафлопсов» и тотального засилья XML затраты на парсинг строки с пробелами незначительны.
Tags:
Hubs:
-4
Comments30

Articles