Опубликован: 11.02.2005 | Доступ: свободный | Студентов: 2763 / 211 | Оценка: 4.19 / 3.88 | Длительность: 16:12:00
ISBN: 978-5-9556-0023-X
Лекция 10:

Автоматное программирование: от таблицы к программе

< Лекция 9 || Лекция 10: 12345 || Лекция 11 >
Аннотация: Трансляция таблиц состояний и переходов. Различные методы представления таблиц как программ. Интерпретация таблиц переходов.

Анализ состояния дел

Построение таблиц заканчивает этап спецификации нашей программы. Таблицы 9.1 и 9.2-другое формализованное представление рисунков 9.6 и 9.7. Как всегда, разные формализмы отличаются по практической направленности. Граф в некоторых случаях может быть автоматизированно преобразован в прототип программы (попытайтесь сами проделать это со спецификацией на языке UML ), но получающиеся программы всегда требуют ручной доработки. Табличное же представление допустимо рассматривать как мини-язык программирования. Для него возможно построение транслятора или интерпретатора, которые в частных типах таблиц давно уже используются (их широкому применению мешает привязка к конкретным предметным областям и приложениям, поскольку профессиональные системные программисты свысока смотрели на столь простые задачи).

Обратимся к семантике вычислений на языке таблиц. Рассматривается контекст некоторой программы на языке C++ (или на другом языке традиционного типа). В этом контексте определяется значение переменной Entry (множество ее значений совпадает с множеством наименований состояний), далее выполняются следующие действия:

  1. Выбрать вход в таблицу, соответствующий значению Entry (текущее состояние).
  2. Если Условие отсутствует, то перейти к шагу 4.
  3. Вычислить совместно все Условия срабатывания переходов (клетки второй колонки для данного входа):
    • Если среди результатов есть значения True, то выбрать одну из строк, Условие которой истинно, и перейти к шагу 4 для выбранной строки1В этом пункте заложено недетерминированное поведение получаемой программы. Как правило, при применении метода таблиц переходов возможность недетерминированного поведения игнорируется. Вместо этого задается какое-либо произвольное детерминированное правило, например, выбирается текстуально первое из действий, для которого условие истинно. Это похоже на то, как определяются условные выражения и оператор переключения в традиционных языках. ;
    • Если все значения Условий ложны и есть строка failure, то выбрать эту строку и перейти к шагу 4 для нее;
    • Если все значения Условий ложны и нет строки failure, то завершить вычисления.
  4. Выполнить Действие.
  5. В качестве значения переменной Entry установить наименование состояния-преемника (из четвертой колонки таблицы). Перейти к шагу 1.

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

  • start - указание действий, которые выполняются до основных действий и проверок условий перехода (здесь таким действием является чтение очередного символа из файла);
  • finish -указание действий, которые выполняются после основных действий и проверок, но до перехода.

Можно также определять локальные данные для состояний (в примере такие данные определены только для начального состояния), но это должно быть согласовано с правилами локализации имен языка программирования и с общим стилем, в котором написана программа. Заметим, что локальные данные всех состояний конечного автомата должны быть помещены в общий контекст, а приписывание их к конкретным состояниям является ограничением видимости, подобным тому, которое используется в модульном программировании (если Вы уже программировали на Object Pascal Delphi, Java либо Oberon, то знакомы с модульностью). Это прагматически следует из того положения, что работа теоретического конечного автомата не требует привлечения памяти2Памятью можно считать номер текущего состояния (замечание проф. А. А.Шалыто). .

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

  1. Оттранслировать вручную.
  2. Отдать препроцессору для превращения в нормальную программу.
  3. Использовать интерпретатор.

Рассмотрим последовательно эти три возможности.

< Лекция 9 || Лекция 10: 12345 || Лекция 11 >
Илья Ардов
Илья Ардов

Добрый день!

Я записан на программу. Куда высылать договор и диплом?

Дарья Федотова
Дарья Федотова