87
Главная программа изменилась гораздо сильнее. Как уже известно читателю,
пассивная автоматная модель работает не постоянно (такт за тактом), а совершает
очередной такт работы по инициативе внешней среды. Поэтому для таких моделей
главная программа уже не является частью реализации автомата. Эта программа
описывает функционирование внешней среды, и из нее в определенных местах
может вызываться подпрограмма, реализующая такт работы автомата. В прикладных
событийных системах функция главной программы, как правило, состоит в
извлечении сообщений из очереди и передаче их соответствующим обработчикам.
Однако это лишь вершина айсберга: прикладная программа работает под
управлением операционной системы, которая берет на себя всю работу по приему
событий от внешних устройств и передачи их программе. Поэтому само понятие
главной программы в современных прикладных программных системах является
относительным и неопределенным.
Кроме того, при переходе к прикладному программированию событийных систем
изменились и критерии оптимальности реализации автоматов. Изоморфизм
программного кода графу переходов по прежнему остается на первом месте, однако
эффективность по времени и памяти для данного класса задач не столь критична.
Напротив, большее значение приобретают гибкость и способность
эволюционировать, адаптируясь к новым требованиям.
Напомним, что в данном разделе обсуждаются вопросы реализации в контексте
процедурного программирования. Объектно-ориентированный подход обладает
более широким арсеналом методов и шаблонов для реализации автоматов, часть из
них обсуждаются далее в этой книге (разд. 3.3). А пока мы остаемся наедине с
языком C и двумя способами реализации автоматов, перечисленными выше: с
помощью таблиц и с помощью инструкций выбора.
Существует ряд задач, в которых необходимо модифицировать автомат во время
выполнения программы. Для таких случаев следует использовать реализацию
автомата в виде таблицы. Однако опыт показывает, что такие задачи встречаются
довольно редко. Поэтому наиболее употребительным остается шаблон реализации,
описанный в предыдущем разделе: использование инструкции выбора в сочетании с
инструкцией ветвления (тем более что такой способ упрощает изоморфное
преобразование графа переходов в программный код).
Шаблон реализации такта работы автомата изменился по сравнению с листингом 2.2
несущественно. Поскольку вместо автомата Мура теперь используется автомат
Мили, то блок формирования выходного воздействия переместился внутрь
инструкции ветвления. Кроме того, в этом блоке вместо присваивания значений
выходным переменным теперь выполняются вызовы подпрограмм, соответствующих
командам объекта управления.
Более интересный вопрос – взаимодействие функции такта автомата с вызывающим
контекстом, иначе говоря, передача автомату событий. Существуют три основных
варианта такого взаимодействия.
1. События, как и входные переменные, являются глобальными переменными
программы или модуля программы, в котором находится автомат (отметим, что
второй вариант менее вероятен, так как в отличие от входных переменных,
которые являются локальными для автоматизированного объекта, события, как
правило, предназначены для межмодульного взаимодействия). В том случае,