Введение

Диаграмма поведения конечных автоматов

Диаграмма состояний используется в информатике и смежных областях для описания поведения систем. Диаграммы состояний предполагают, что система состоит из конечного числа состояний. Иногда это действительно так, а иногда это разумное упрощение. Существует множество разновидностей диаграмм состояний, которые незначительно отличаются друг от друга и имеют различную семантику.

Обзор

Диаграммы состояний предоставляют абстрактное описание поведения системы. Это поведение анализируется и представляется серией событий, которые могут произойти в одном или нескольких возможных состояниях. При этом "каждая диаграмма обычно представляет объекты одного класса и отслеживает различные состояния этих объектов в системе". Диаграммы состояний могут использоваться для графического представления конечных автоматов (также называемых конечными автоматами). Эта концепция была введена Клодом Шенноном и Уорреном Уивером в их книге 1949 года «Математическая теория коммуникации». Другим источником является Тейлор Бут в его книге 1967 года «Последовательные машины и теория автоматов». Альтернативным представлением является таблица переходов состояний.

Альтернативная семантика

Существуют и другие наборы семантики, позволяющие представлять диаграммы состояний. Например, существуют инструменты для моделирования и разработки логики для встраиваемых контроллеров. Эти диаграммы, подобно оригинальным машинам состояний Харела, поддерживают иерархически вложенные состояния, ортогональные регионы, действия состояний и действия переходов.

Диаграммы состояния против блок-схемы

Новички в формализме машины состояний часто путают диаграммы состояний с блок-схемами. На рисунке ниже показано сравнение диаграммы состояний и блок-схемы. Машина состояний (панель (a)) выполняет действия в ответ на явные события. В отличие от этого, блок-схема (панель (b)) автоматически переходит от узла к узлу после завершения операций. Узлы блок-схемы являются ребрами в порожденном графе состояний. Причина в том, что каждый узел в блок-схеме представляет команду программы. Команда программы – это действие, которое должно быть выполнено. Команда не является состоянием, но при применении к состоянию программы вызывает переход в другое состояние. Более подробно, исходный код представляет собой граф программы. Выполнение графа программы (разбор и интерпретация) приводит к графу состояний. Таким образом, каждый граф программы порождает граф состояний. Преобразование графа программы в соответствующий граф состояний называется "развертыванием" графа программы. Граф программы – это последовательность команд. Если переменных не существует, то состояние состоит только из счетчика команд, который отслеживает местоположение программы во время выполнения (какая следующая команда будет применена). Перед выполнением команды счетчик команд находится в определенной позиции (состояние перед выполнением команды). Выполнение команды перемещает счетчик команд к следующей команде. Поскольку счетчик команд и есть все состояние, выполнение команды изменило состояние. Таким образом, сама команда соответствует переходу между двумя состояниями. Теперь рассмотрим полный случай, когда существуют переменные, на которые влияют выполняемые команды программы. Не только счетчик команд меняется между различными позициями, но и переменные могут менять значения из-за выполняемых команд. Следовательно, даже если мы повторно посетим какую-то команду программы (например, в цикле), это не означает, что программа находится в том же состоянии. В предыдущем случае программа была бы в том же состоянии, потому что все состояние – это просто счетчик команд. Таким образом, если счетчик команд указывает на ту же позицию (следующую команду), достаточно указать, что мы находимся в том же состоянии. Однако, если состояние включает переменные, которые меняют значение, мы можем быть в одном и том же месте программы с разными значениями переменных, то есть в другом состоянии в пространстве состояний программы. Термин "развертывание" происходит от этого умножения позиций при создании графа состояний из графа программы. Самопереход – это переход, когда начальное и конечное состояние одинаковы. Типичным примером является цикл do, увеличивающий какой-то счетчик до тех пор, пока он не переполнится и снова не станет 0. Хотя цикл do выполняет одну и ту же команду инкремента итеративно, его пространство состояний не является циклом, а линией. Это происходит из-за того, что состояние определяется местоположением программы (здесь циклическим) в сочетании со значением счетчика, которое строго возрастает (до переполнения). Таким образом, различные состояния посещаются последовательно, пока не произойдет переполнение. После переполнения счетчик снова становится 0, поэтому начальное состояние возобновляется в пространстве состояний, замыкая цикл в пространстве состояний (при условии, что счетчик был инициализирован нулем). Рисунок выше пытается показать обращение ролей, выравнивая дуги диаграмм состояний с этапами обработки блок-схемы. Можно сравнить блок-схему с конвейером в производстве, поскольку блок-схема описывает прогрессию какой-либо задачи от начала до конца (например, преобразование исходного кода во входные данные в объектный код на выходе компилятором). Машина состояний, как правило, не имеет представления о такой прогрессии. Пример машины состояний двери, приведенный выше, не находится в более продвинутой стадии в "закрытом" состоянии, чем в "открытом". Скорее, он просто по-разному реагирует на события открытия/закрытия. Состояние в машине состояний – это эффективный способ определения поведения, а не этап обработки.

Другие расширения

Интересное расширение заключается в том, чтобы позволить дугам переходить из любого числа состояний в любое число состояний. Это имеет смысл только в том случае, если системе разрешено одновременно находиться в нескольких состояниях, что означает, что отдельное состояние описывает лишь условие или другой частичный аспект общего, глобального состояния. Получающийся формализм известен как сеть Петри. Другое расширение позволяет интегрировать блок-схемы в диаграммы состояний Харела. Это расширение поддерживает разработку программного обеспечения, которое управляется как событиями, так и потоками работ.