Кінцевий автомат - js автоматне програмування

Здебільшого автоматне програмування пов'язане з поняттям кінцевий автомат. Не вдаючись в математичні нетрі, кінцевий автомат можна визначити наступним чином:

Модель, за допомогою якої зручно представляти процес, який має кінцеве число дискретних керуючих станів

Друге, що ми бачимо в цьому визначенні, це слово "стан". Стан, основа будь-якого кінцевого автомата, і, по життю, ми періодично користуємося цим поняттям. Той сенс, який закладається в нього на інтуїтивному рівні, ідентичний змістом, який закладається в нього при роботі з кінцевими автоматами. Наприклад, людина буває ситим або голодним, сплячим, хворіє, і навіть, прости господи, мертвим, а вода буває рідкої, твердої (лід) і газоподібної. Це їхні капітали різних процесів.

У визначенні уточнюється, що стану повинні бути дискретними, іншими словами, ми повинні мати можливість проводити чіткі відмінності між різними станами процесу. Процес нагріву води не можна уявити як кінцевий автомат, якщо ми не виділимо в ньому конкретні точки (стану), наприклад, тепла вода (50 градусів), гаряча вода (80 градусів) і холодна вода (10 градусів).

І останнє, що означає "керуючі стану"? Поняття стану не є чужорідним для світу програмування. В одній з перших лекцій я розповідав про те, що стан програми це, грубо кажучи, зліпок її пам'яті, іншими словами, значення всіх змінних в конкретний момент часу. Це, звичайно, так, але можна піти ще далі і помітити, що стан можна поділити на два типи. Перший тип це стан, що відповідає за всі можливі шляхи руху даних крізь програму. Другий, це дані самі по собі або так зване обчислювальний стан.

Їх кількість не дуже велике

Їх число або нескінченно, або звичайно, але дуже велике

Кожне з них має цілком певний сенс і якісно відрізняється від інших

Більшість з них не має сенсу і відрізняється від інших лише кількісно

Вони визначають дії, які здійснює сутність

Вони безпосередньо визначають лише результати дій

Розглянемо найпростіший кінцевий автомат на прикладі телевізора і процесу включення. У цьому процесі беруть участь два стану "включено" і "вимкнений", які змінюються по подіях "включити" і "вимкнути".

Вище видно так звану діаграму станів. Це графічне відображення, що допомагає візуально уявити собі схему переходів між станами і побачити все обмеження системи (не з усіх станів можна перейти в усі). Як бачите, з телевізором все досить просто і інтуїтивно зрозуміло. Давайте поглянемо на більш цікавий приклад:

Цей автомат описує процес приготування кави в кавомашині. Не так тривіально як з телевізором. Що ще може бути описано кінцевим автоматом?

  • Стан замовлення
  • світлофор
  • Активація сімки
  • Запуск практики на Хекслете
  • Призначені для користувача інтерфейси (UI)

Особисто мені здається, що простіше перерахувати те, що не описується кінцевим автоматом, ніж навпаки.

Реальний світ сповнений процесів, які описуються кінцевими автоматами, іншими словами, кінцеві автомати завжди присутні незалежно від того, знаємо ми про них чи ні

Акцентую на цьому вашу увагу. У моїй практиці часто зустрічається переконання у вже досвідчених програмістів, що кінцеві автомати ускладнюють життя і / або вони потрібні тільки для написання компіляторів. Це велика помилка, викликане відсутністю належної базової підготовки. Якщо у вашій програмі є сутність зі складною поведінкою, то за визначенням найпростішим способом опису її процесів є кінцевий автомат.

Розпізнати сутність зі складною поведінкою в вихідному коді програми можна наступним чином: при традиційній реалізації таких сутностей використовуються логічні змінні, звані прапорами, і численні заплутані конструкції розгалуження, умовами в яких виступають різні комбінації значень прапорів. Такий спосіб опису логіки складного поведінки погано структурований, важкий для розуміння і модифікації, схильний до помилок.

Одна з центральних ідей автоматного програмування полягає в відділенні опису логіки поведінки (за яких умов необхідно виконати ті чи інші дії) від опису його семантики (власне сенсу кожного з дій). Крім того, опис логіки при автоматної підході жорстко структуроване. Ці властивості роблять автоматне опис складного поведінки наочним і зрозумілим.