Обработчик сценариев
Обзор
Обработчик сценариев - это алгоритм интерпретации сценариев как подпрограмм. Каждый экземпляр обработчика сценариев - это обособленный процесс виртуальной машины.
Сценарий как декларация алгоритма высокого уровня состоит из компонентов. Обработчик сценариев как алгоритм интерпретации нижнего уровня включает в себя алгоритмы реализации функциональности компонентов.
Процесс обработчика сценариев является машиной состояний и производит обработку событий. События могут поступать в виде сообщений извне, либо генерироваться исполняемыми компонентами.
Процесс
Процесс работы обработчика сценария можно представить в следующей последовательности действий:
-
загружает сценарий,
-
создает области данных для хранения задекларированных сценарием переменных,
-
отыскивает в сценарии компонент Старт с типом основной ветки,
-
сопоставляет с декларацией компонента алгоритм его интерпретации,
-
передает управление алгоритму компонента, передавая на вход параметры для компонента из сценария и накопленный контекст,
-
направляет полученные во время работы компонента события в его очередь обработки и передает ему управление на обработку этой очереди,
-
обрабатывает ответ компонента:
-
продолжение работы компонента, тогда встает в ожидание поступления событий;
-
откладывание обработки очередного события, тогда перекладывает событие в другую очередь;
-
завершение работы компонента. По завершении работы компонента тот возвращает:
-
идентификатор следующего компонента, тогда процесс повторяется с новым компонентом начиная с этапа его поиска в сценарии, расширяясь однако применением отложенных событий;
-
код следующего сценария, тогда производится его загрузка и процесс повторяется с самого начала;
-
ошибка, тогда сценарий завершается и, возможно, производится запуск ветки пост-обработки;
-
команда возврата к предыдущему сценарию в стеке из вложенного, тогда восстанавливается контекст предыдущего сценария и позиция в нем;
-
команда остановки, тогда сценарий завершается, и, возможно, производится запуск ветки пост-обработки;
-
-
Таким образом, каждый компонент исполняется в процессе обработчика сценариев, принимает на вход накопленный контекст и декларацию компонента из сценария.
Выполнение компонента может протекать синхронно и асинхронно. В асинхронном случае все события, поступающие обработчику сценариев (изнутри и снаружи), передаются на обработку в текущий исполняемый компонент. Тот в свою очередь может:
-
обработать сообщение,
-
отбросить его,
-
отложить для следующего компонента.
В любой момент времени обработчик может получить извне команду на завершение, в этом случае текущий выполняемый компонент терминируется. При наличии соответствующей ветки пост-обработки управление передается на нее, а при отсутствии сценарий завершается.
Автозамыкание веток перехода
Компонент при завершении работы на основании полученного результата выбирает для передачи управления ту или иную ветку перехода. Большинство компонентов разделяют успешные и неуспешные результаты работы, сопоставляя им различные ветки перехода.
Если ветка альтернативного перехода не задана (не выбрано свойство), то компоненты как правило передают управление по основной ветке. Таким образом, сценарий имеет возможность продолжиться, если компонент отработал неудачно, но соответствующая ветка перехода не задана.
Такое поведение разветвляющих компонентов называется замыканием веток перехода. Разветвляющие компоненты делятся на замыкающие и прерывающие по незаданной ветке.
Пост обработка
Завершение сценария может произойти по нескольким причинам (описаны в компоненте Старт). Тем не менее, обработчик сценария может продолжить его выполнение в том же контексте на альтернативной ветке, созданной администратором на случай завершения сценария по той или иной причине.
Выполнение ветки пост-обработки при завершении уже не предполагает переключения на другую ветку.
Во избежание захламления процессорных мощностей и оперативной памяти, на время выполнения ветки пост-обработки накладывается ограничение. Оно может быть усилено в компоненте Старт, инициирующем соответвтующую ветку.
Подмена сценария
Обработчик сценариев предоставляет наружу интерфейс подмены сценария. С помощью него в любой точке исполнения и любой момент времени в текущий контекст может быть загружен новый сценарий, который начнет выполняться со своего начала. Исполняемый в момент подмены компонент терминируется.
Значения для переменных по умолчанию
Локальные переменные могут получить значения по умолчанию при создании сценария. Начальные значения передаются извне владельцем обработчика сценариев, то есть тем процессом, который его запустил.
Сам обработчик сценариев также может заполнить значения локальных переменных, если значения для них не установлены ранее.
Это происходит сразу после загрузки, если сущность сценария в опциях (opts.variables
) содержит значения по умолчанию для имен переменных, задекларированных сценарием. Эта операция происходит при загрузке каждого сценария, в том числе вложенных.
Далее компонент Старт может также заполнить значения локальных переменных, если значения для них не установлены ранее. Это производится при соответствующих настройках компонента.
Сценарий может содержать компонент Присвоение значений сразу после компонента Старт или позже.
В любом другом случае локальные переменные остаются незаполненными и не могут быть использованы в качестве поставщиков значений.