Tick-tock, v1.0, описание
Posted on

Tick-tock — интерпретируемый высокоуровневый язык программирования. Представляет собой конкурентную (по модели акторов) машину Тьюринга.
Общее описание
Структура программы
Программы на данном языке представляют собой список акторов. Каждый актор имеет текущее состояние (по умолчанию — __initialization__) и список всех поддерживаемых состояний. Каждое из состояний характеризуется именем (уникальным в пределах актора) и списком обработчиков сообщений. Обработчик сообщений так же имеет имя (уникальное в пределах состояния) и список команд. Например:
actor
state __initialization__
message __initialize__
out "Hello, world!\n"
;
;
;
Работа программы заключается в обмене сообщениями между акторами, переключении их состояний и выполнении соответствующих принятым сообщениям команд.
У каждого актора есть очередь входящих сообщений, имеющая некоторый размер. Актор по очереди забирает по одному сообщению из очереди, выбирает список обработчиков, соответствующий текущему состоянию, и ищет среди них соответствующий принятому сообщению. После чего выполняет команды из него.
Ключевых команд две:
sendотправляет сообщение всем акторам;setпереключает состояние у того актора, в котором она указана.
Выполнение скрипта начинается с автоматической рассылки всем акторам сообщения __initialize__.
Гарантии выполнения
Акторы работают независимо друг от друга — конкурентно.
Акторы обрабатывают строго по одному сообщению за раз — обработка принятого сообщения будет обязательно полностью завершена до начала обработки следующего.
Команда send выполняется асинхронно. Таким образом побочные эффекты последующей команды (в том числе другой команды send) могут возникнуть до побочных эффектов предыдующей команды send.
Команда set выполняется синхронно. Таким образом следующее сообщение обязательно будет обрабатываться уже одним из обработчиков того состояния, которое будет установлено данной командой.
Каждый актор обрабатывает все рассылаемые сообщения. Так что, если в его текущем состоянии имеется подходящий обработчик, сообщение обязательно будет обработано. В этом случае потерь сообщений быть не может.
Исходники
Файлы исходного кода должны быть в кодировке UTF-8 и иметь концы строк как в UNIX (LF).
Ключевые слова
8 ключевых слов: actor, state, message, send, set, out, sleep, exit.
Сущности
Числа
Поддерживаются только числовые константы.
Определение:
- целые —
/\b((0x[\da-f]+)|(0[0-7]+)|(\d+(e\d+)?)|(\d+e[\+\-]\d+))\b/i; - вещественные —
/(\.\d+(e[\+\-]\d+)?)\b|\b\d+\.\d*((e[\+\-]\d+)?\b)?/i.
Строки
Поддерживаются только строковые константы.
Определение:
- интерпретируемые —
/"(\\x[\da-f]{2}|\\.|[^"\n])*?"/i; - сырые —
/`[^`]*?`/.
В интерпретируемых преобразуются управляющие последовательности.
Обработчики сообщений
Содержат имя обрабатываемого сообщения и список команд, которые необходимо выполнить при получении данного сообщения.
Объявление:
"message", identifier,
command, {command},
";"
Здесь identifier — имя обрабатываемого сообщения.
Состояния
Содержат имя состояния актора и список обработчиков сообщений, относящихся к этому состоянию.
Объявление:
"state", identifier,
message, {message},
";"
Здесь identifier — имя состояния актора.
Акторы
Представляют собой зелёные (легковесные) потоки. Содержат список поддерживаемых состояний. По умолчанию находятся в состоянии __initialization__.
Объявление:
"actor",
state, {state},
";"
Команды
Команда send
Отправляет указанное сообщение всем акторам. Операция асинхронная.
Синтаксис:
"send", identifier
Здесь identifier — имя сообщения.
Команда set
Устанавливает указанное состояние текущему актору. Операция синхронная.
Синтаксис:
"set", identifier
Здесь identifier — имя состояния.
Команда out
Выводит указанную строку в stdout. Операция синхронная.
Синтаксис:
"out", STRING
Здесь STRING — строковая константа.
Команда sleep
Приостанавливает работу актора на случайное время из указанного диапазона. Операция синхронная.
Синтаксис:
"sleep", MINIMUM, ",", MAXIMUM
Здесь MINIMUM и MAXIMUM — числовые константы, обозначающие время в секундах. Диапазон имеет вид [MINIMUM, MAXIMUM).
Команда exit
Завершает выполнение скрипта с кодом возврата 0. Операция синхронная.
Синтаксис:
"exit"
Точка входа
Интерпретатор асинхронно запускает все предоставленные акторы. После чего отправляет всем сообщение __initialize__.
Комментарии
Однострочные: /\/\/.*/.
Многострочные: /\/\*.*?\*\//s.
Полная грамматика
program = actor list;
actor list = actor, {actor};
actor = "actor", state list, ";";
state list = state, {state};
state = "state", identifier, message list, ";";
message list = message, {message};
message = "message", identifier, command list, ";";
command list = command, {command};
command = send command | set command | out command | exit command;
send command = "send", identifier;
set command = "set", identifier;
out command = "out", string;
sleep command = "sleep", number, ",", number;
exit command = "exit";
number = INTEGER NUMBER | FLOATING-POINT NUMBER;
string = INTERPRETED STRING | RAW STRING;
identifier = IDENTIFIER - key words;
key words = "actor" | "state" | "message" | "send" | "set" | "out" | "exit";
LINE COMMENT = ? /\/\/.*/ ?;
BLOCK COMMENT = ? /\/\*.*?\*\//s ?;
INTEGER NUMBER = ? /\b((0x[\da-f]+)|(0[0-7]+)|(\d+(e\d+)?)|(\d+e[\+\-]\d+))\b/i ?;
FLOATING-POINT NUMBER = ? /(\.\d+(e[\+\-]\d+)?)\b|\b\d+\.\d*((e[\+\-]\d+)?\b)?/i ?;
INTERPRETED STRING = ? /"(\\x[\da-f]{2}|\\.|[^"\n])*?"/i ?;
RAW STRING = ? /`[^`]*?`/ ?
IDENTIFIER = ? /[a-z_]\w*/i ?;