1. Предыстория
Месяц тому назад я реализовал интерпретатор Forth на Elixir, о чем поведал на Хабре (https://habr.com/ru/articles/985894/). Этот гибрид получил составное имя Forth-ibE в честь своих родителей (Forth in-build Elixir).
Следующим шагом разработки стало определение API обмена сообщениями в распределенной команде движков Forth для совместной работы.
У читателя обязательно возникнут вопросы типа зачем и почему. Поэтому сейчас необходимо описать разрешение пары исходных затруднений.
Во–первых, в [1] говорится, что
«наряду с однозадачными существуют и мультизадачные Форт-системы. Они могут работать с произвольным числом задач. Задача может быть либо терминальной, при выполнении которой вся интерактивная мощь Форта передается оператору, сидящему за терминалом, либо управляющей, которая обеспечивает управление аппаратным средством, не имеющим терминала.
Управляющая задача имеет пару стеков и небольшой набор пользовательских переменных. Так как при выполнении управляющей задачи не используется терминал, ей не требуются ни собственный словарь, ни рабочая область, ни буфер входного текста.»
Внешне, формально это похоже на мою задумку команды движков Forth, но понятно, что в [1] описаны движки, размещенные в памяти одного компьютера. В Elixir/Erlang процессы движков Forth получают в распоряжение виртуальные машины BEAM, а следовательно, и узлы.
«Узлы можно запускать как на одном хосте, так и на нескольких. После установления связи между узлами процессы одного узла могут взаимодействовать с процессами других узлов с помощью стандартного механизма обмена сообщениями.»[2]