Solace — экспериментальный язык программирования и набор виртуальных машин для моделирования вычислений на основе:
- комбинаторной логики (hardware-узлы);
- стековой машины (software-узлы);
- сетей Кана (network), управляющих взаимодействием всех узлов.
Язык описывается грамматикой ANTLR4 (Solace.g4) и исполняется на трёх VM, реализованных на Kotlin (с использованием корутин и каналов для сети Кана).
-
Узел (node) — единица вычисления. Бывает двух типов:
hardware— модель комбинаторной логики;software— модель стековой машины.
-
У каждого узла есть:
- сигнатура каналов:
in,out,self(петля); - две секции кода:
init { ... }— выполняется один раз при старте;run { ... }— запускается в бесконечном цикле.
- сигнатура каналов:
-
Сеть Кана (
network):- описывает соединения между каналами узлов;
- в языке существует одна глобальная сеть;
- сеть задаёт топологию обмена данными.
-
Три уровня:
- фронтенд: язык Solace → AST (ANTLR4);
- бэкенд: AST → байткод для конкретной VM;
- рантайм: запуск сети и узлов на Kotlin (каждый узел — корутина, ребро сети — канал).
С точки зрения реализации проект делится на три слоя:
-
Язык и компилятор (
compiler)- читает исходный
.solace, парсит грамматикой ANTLR и проверяет корректность сети (узлы, порты, соединения); - генерирует байткод для hardware/software‑узлов и упаковывает его вместе с описанием сети в единый бинарный пакет
*.solpkg(формат см.FILE_FORMATS.md).
- читает исходный
-
Узловые виртуальные машины (
vm/sim,vm/harv)- исполняют байткод конкретных узлов, реализуя семантику hardware‑ и software‑узлов;
- не знают о структуре всей сети, работают только с собственными портами и FIFO‑каналами.
-
Сетевая ВМ (
vm/network)- читает пакет
*.solpkg, восстанавливает список узлов и соединений между ними; - создаёт каналы сети Кана и запускает для каждого узла отдельную ВМ (stub/sim/harv или смешанную) в своей корутине.
- читает пакет
Жизненный цикл программы:
- Компилятор:
program.solace → program.solpkg(один файл с метаданными сети и байткодом всех узлов). - Сетевая ВМ: загружает
program.solpkg, строит сеть, создаёт ВМ узлов и для каждого узла выполняетinitодин раз, затем бесконечный циклrun, обмениваясь данными только через FIFO‑каналы.
Два типа узлов:
hardwarenodesoftwarenode
Общее для обоих типов:
- FIFO-очереди для обмена данными:
write <-— запись в FIFOread$— чтение из FIFO
- Инициализация:
initвыполняется один раз при запуске (аналогsetupв Arduino).
- Типы данных:
int. - Аритметика:
+,-,*,/. - Логика:
!,&&,||. - Битовые операции:
<<,>>. - Поток исполнения:
ifдля условных веток. - FIFO-ввод/вывод:
write <-(запись),read$(чтение). - Блокировка:
read$— блокирующее чтение (ждёт, если FIFO пусто);write <-может блокироваться при переполнении, синхронизация идёт через сами каналы.
- Типы данных:
int,string. - Ввод/вывод:
printдля логов/отладки/общения с внешним миром. - FIFO-ввод/вывод:
write <-,read$. - Аритметика:
+ - * /надint; опционально+для конкатенацииstring. - Логика:
! && ||. - Поток исполнения:
if.
Компонент network задаёт схему соединения FIFO между узлами.
- Определяет топологию: какие
write-выходы соединены с какимиread$-входами. - Узлы (
hardware/software) — вершины графа, FIFO-каналы — ориентированные рёбра.
- Параллельные/распределённые процессы: каждый узел — независимый процесс с собственным состоянием и обменом по FIFO.
- Совместное проектирование hardware/software: первый ближе к аппаратной логике, второй — к обычному коду со строками/печатью.
- Синхронизация через каналы: блокирующие
read$/write <-дают синхронизацию без общей памяти. - Выразительность: примитивы арифметики, логики, условий и FIFO позволяют строить конвейеры, протоколы обмена, управляющие алгоритмы и взаимодействие ПО с виртуальным «железом».
- Формат выходных файлов компилятора
- Сборка демо-пакета:
./gradlew :compiler:run --args "path/to/program.solace --out build/solace"- На выходе появится
build/solace/program.solpkgс мета-инструкциями и заглушечным байткодом для всех узлов. - Если запускаете из каталога
compiler, указывайте путь относительно корня репозитория (например,../pseudocode.solace); CLI также попробует найти файл на уровень выше.
- На выходе появится
- Запуск «немой» сети:
./gradlew :vm:network:run --args "build/solace/program.solpkg"- Загружает пакет, строит сеть Кана, создаёт заглушки hardware/software ВМ и логгирует их «живость» в корутинах.
- Компилятор (
compiler) — разбор.solaceи генерация пакета*.solpkg. - Сетевая ВМ (
vm/network) — загрузка пакета, построение сети Кана и запуск узловых ВМ. - Симулятор hardware‑узлов (
vm/sim) — исполнение байткода аппаратных узлов. - Стековая ВМ Harv (
vm/harv) — стековая машина для software‑узлов и программных сетей.