594
ГЛАВА 10. МЕТОДЫ ПРОГРАММИРОВАНИЯ ОТ СОСТОЯНИЙ
Мы рассмотрим только одну из этих стратегий, которая допускает интер-
претацию, сохраняющую прежний смысл конечного автомата. Вместо явной
дополнительной памяти в системе одновременно действует несколько про-
цессов: экземпляров различных автоматов, подчиняющихся стековой дис-
циплине: активизация нового экземпляра автомата приводит к приостанов-
ке предыдущего автомата (запоминанию его состояния), а окончание работы
автомата — к возобновлению приостановленного автомата с передачей ему
сведений о том, как отработал завершающийся процесс. Внимательный чи-
татель тут же заметит, что эта трактовка повторяет то, что ранее мы называли
процедурным механизмом, но только для процедур специального вида, кото-
рые реализуют конечные автоматы.
Эти сведения (значение True, если вызванный автомат распознал строку
успешно, и False в противном случае) используются для выбора очередно-
го состояния, в которое переходит автомат. Использование автоматов со сте-
ковой памятью частично нарушает инвариант стиля программирования от
состояний: Действия глобальны, условия локальны, поскольку передава-
емая через стек информация, которая управляет поведением автомата, дела-
ется локальной. Конечно же, регламентированный отход от стиля не является
крамолой, и именно на этом пути появляются различные стили программи-
рования как варианты базовых стилей. Но в настоящей главе нас в первую
очередь интересует направление, в максимальной степени соответствующее
стилю программирования от состояний. По этой причине мы и рассматрива-
ем системы конечных автоматов, связанных стеком.
На первый взгляд может показаться, что такие системы еще дальше уво-
дят от программирования от состояний, чем автоматы со стековой памятью.
Однако требование корректно определять вычисления системы неизбежно
приводит к тому, что потоки, которые перерабатываются вызываемыми в од-
ном состоянии экземплярами автоматов, должны быть строго локальными
для них. В самом деле, если допустить, что передаваемый поток является
общим, то чтение из него должно быть независимым для каждого из экзем-
пляров, а это противоречит дисциплине обработки потока. При успешном
окончании работы экземпляра очередной читаемый символ должен следо-
вать за подстрокой, которая распознана отработавшим экземпляром, т. е. для
продолжения действий используется тот поток, который был передан этому
экземпляру. Что же касается неуспешно завершившихся экземпляров, то их
локальные потоки ликвидируются. Обычным способом реализации такого
расщепления потока и локализации его потомков по вызываемым экземпля-
рам автоматов является организация возвратов по обрабатываемой строке.