Автоматне програмування для початківців

Теорію автоматів викладають не скрізь. У технічних ВНЗ викладають цю теорію стосовно синтезу цифрової апаратури, але не стосовно до програмування (Такі висновки зроблені моїм колегою Шалит А. А. для провідних Пітерських ВНЗ).

Автоматне програмування для початківців

Життя - штука тонка. Багатьом, хто закінчив технічні ВНЗ на початку (середині) вісімдесятих, довелося не один раз міняти сферу діяльності. Схемотехник раптом починав займатися тонкопленочной технологією виробництва інтегральних схем, фахівець з електровакуумним приладів «втручався» в мікропроцесорну схемотехнику. Виручало отримане в радянських ВНЗ «широке» освіту, «нічого про все». Спасибі дорогому Леоніду Іллічу за наше щасливе дитинство.

Однак після його [автоматного програмування] освоєння виникає питання: як я міг програмувати інакше? Автоматне програмування дозволяє вирішувати практично будь-які складні циклічні завдання з мінімальними витратами на налагодження.

Так і є. Інші технології програмування варто рекомендувати лише тим, хто схильний до садомазохізму.

Актуальність автоматного програмування

Чому ж прийоми автоматного програмування особливо актуальні зараз? Мають місце дві проблеми:

  1. непередбачувана поведінка коду програми, розробленої засобами RAD;
  2. згасання «культури програмування».

Непередбачувана поведінка коду програми, розробленої засобами RAD

На початку дев'яностих з'явилися кошти швидкої розробки додатків (RAD - Rapid Application Development), до яких відносяться, зокрема, такі відомі продукти від Borland, як Delphi і C ++. Перераховані системи програмування дозволяють не тільки програмувати в звичному сенсі слова, а й фактично малювати програми, перестасківая в віконні форми візуальні компоненти з VCL.

Будь-візуальний об'єкт VCL характеризується рядом властивостей, методів і подій. Здавалося б, простий маніпуляцією перерахованими атрибутами можливо змушувати розроблювану програму робити те, що вимагає від неї програміст-розробник. Не тут то було.

Чарлз Калверт у вступній главі «Візуальне програмування - це RAD» своєї книги «Delphi 2. Енциклопедія користувача» чесно зізнається:

Одна з іронічних сторін середовищ, подібних Delphi, полягає в тому, що вона являє собою величезне благо для початківців, але іноді плутає досвідчених програмістів. Так, VCL має тенденцію приховувати точну реалізацію певних об'єктів, тим самим не даючи стороннім міняти замовчувана поведінку коду,

Таким чином, іронічна сторона і величезне благо декому виходять боком. бо замовчувана поведінку коду - підступність і таємна підлий засобів RAD. Класичний приклад непередбачуваної поведінки коду наочно продемонстрував поет, «основоположник» об'єктно-орієнтованого програмування. Поет, який для нас - «все».

«Мій дядько - найчесніших правил

Коли не в жарт занедужав,

Він поважати себе примусив

І краще вигадати не міг. »

Що являє собою «дядько Пушкіна» з позиції об'єктно-орієнтованого програмування:

Автоматне програмування для початківців

Яке ж поведінку TUncle? Як тільки значення властивості Health було змінено кодом програми (на целочисленное «занедужав»), «вистрілила» функція Respect ( «поважати себе змусив»). А чи повинна була? Необов'язково, оскільки є функція Think, за допомогою якої дядько міг би вигадати щось і краще. Можливо, інтерпретація не цілком коректна, зате наочна.

Культура програмування

Про культуру програмування можна сказати лише те, що вона, культура, повільно, але вірно згасає. (Програмісти-професіонали радянської школи скинулися, напевно, скупу чоловічу сльозу). Зараз все більше кодировщики. що відрізняються від програмістів-розробників тим, що нездатні як поставити задачу. так і описати її в програмних документах.

  1. поведінка коду програми, розробленої виключно засобами RAD, спочатку непередбачувано;
  2. щоб поведінка коду програми стало передбачуваним, слід навчитися управляти поведінкою коду.

Як навчитися керувати поведінкою коду програми?

Дуже просто - прийомом автоматного програмування - розстановкою «контрольних точок» з використанням оператора case - програмною реалізацією кінцевого автомата.

Реалізація кінцевого автомата

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

Лижний крос - розстановка контрольних точок

Автоматне програмування для початківців

На малюнку вище зображено лижна траса. Точка 0 - старт і фініш, точки 1-7 - контрольні. У контрольних точках знаходяться судді, здатні фіксувати час проходу і нагрудний номер лижника.

За такої організації здачі нормативу з лижного кросу лижник виявляється «затиснутим» контрольними точками в траєкторію лижної траси. Якщо на фініші з'ясовується, що лижник не пройшов хоча б одну з контрольних точок - перездача неминуча. А якщо «зрізу ть кути» між контрольними точками?

Одного разу життя поставило перед вибором: або кілометрів десять по кривій, розбитою, але асфальтованій дорозі, або «зрізати» і пройти безпосередньо, через лісок, кілометрів зо три. Три кілометри «по прямій» виявилися драговиною (справа була в Білорусії) і були подолані години за чотири. Життя спростувала твердження, що «найкоротшим відстанню між двома точками є пряма», і підтвердила інше - «суха теорія, мій друг, але древо життя пишно зеленіє».

Спроба «зрізати кути» між контрольними точками по «червоній» траєкторії або не дасть істотного виграшу в часі, або призведе до істотної втрати оного. Чи не вклався в норматив - перездача.

Програмно реалізувати «здачу нормативу з лижного кросу» нескладно у вигляді кінцевого автомата.

Програмна реалізація кінцевого автомата

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

Автоматне програмування для початківців

Кінцевий автомат реалізований за допомогою Delphi 7. На форму скинуті 8 кнопок, 0 іменується btnStart, інші - cp1-cp7 (cp - control point). Натискання кнопки еквівалентно проходу лижником контрольної точки. Оброблювачем подій OnClick всім восьми кнопок призначена єдина. заздалегідь підготовлена ​​процедура Release.

Мітки Label1-3 підказують лижнику-користувачеві. яку кнопку доведеться натискати наступної, показують залишок часу до натискання і результат. Фрагменти тексту програми кінцевого автомата наведені нижче.

Текст програми кінцевого автомата

Автоматне програмування для початківців

Як працює кінцевий автомат

Програма відразу після свого запуску відобразить повідомлення користувачу - «Жми кнопку 0». Які можуть бути дії у відповідь:

  1. користувач з пустотливими рученятами буде жати все, що завгодно, крім кнопки 0;
  2. слухняний користувач натисне кнопку 0.

Реакція кінцевого автомата на пустотливі рученята

Слід зазначити, що неслухняний користувач може тиснути кнопки до кінця світла, але нічого у нього не вийде. Натискання будь-якої з кнопок cp1-cp7 до натискання кнопки btnStart кінцевий автомат просто проігнорує, оскільки в процедурі Release є рядки:

Автоматне програмування для початківців

У фрагменті коду кінцевого автомата відсутня «пастка» для змінної mode, що дорівнює 0. Код, розташований всередині оператора case, виконуватися не буде. Програма просто його обійде. Покажчик поточної рядки коду в режимі відладчика (просто покажчик) буде вперто повертатися до початку процедури.

Реакція кінцевого автомата на слухняного користувача

Як тільки користувач натисне кнопку 0 (btnStart), змінні режиму mode і s_mode приймуть значення 1 і 0 відповідно. Покажчик «провалиться» в процедуру проходу «контрольної точки» і виявиться всередині гілки 0 case s_mode of.

Автоматне програмування для початківців

Далі, після виконання коду

кінцевий автомат чекатиме події OnClick кнопки cp1, якій і відповідає стан s_mode = 1. Ніякими вмовляннями користувач не зможе змусити кінцевий автомат відреагувати на натискання будь-який інший кнопки, крім cp1, оскільки при нерівності змінних o_mode ( «очікуваної» кнопки) і s_mode (реально натиснутою кнопки) покажчик буде тупо повертатися до початку процедури -ждать події OnClick саме кнопки cp1 .

Більш того, зазначений вище код кінцевого автомата запускає таймер. Таймер тихо відраховує п'ять секунд і зупиняє «лижний крос», якщо користувач так і не натиснув кнопку cp1.

Зазначеним способом особливо зручно «будувати» комунікаційні програми, що реалізують протоколи обміну. Припустимо, кінцевий автомат А зі стану 1 відправив байтовую послідовність (1) кінцевому автомату В, перейшов в наступний стан (2) і чекає чіткої відповіді (2) від автомата В. Автомат В може слати в лінію все, що завгодно (протягом п'яти секунд). Але, якщо протягом п'яти секунд автомат А не отримає очікуваної відповіді (2) від автомата В - все, триндец. Таймер сповіщає, що очікувана відповідь від автомата У в заданому інтервалі часу не отримана. Користувач чітко бачить, де, на якому етапі кінцевого автомата стався збій при обміні даними. І приймає командирську рішення.

Модифікація кінцевого автомата

Автоматне програмування для початківців

При внесених в код зміни кінцевий автомат послідовно «прожене» покажчик по гілках програми і зупиниться, чекаючи чергового натискання кнопки 0. Іншими словами, кінцевий автомат після «стусана» користувача самостійно пройде всі гілки програми, всі контрольні точки, які явно вказав програміст і, як всі нормальні автомати, повернеться в свій початковий стан.

Аналогія з автоматом для газованої води. Згодували автомату три копійки, націдив він стакан газованої води з грушевим сиропом і повернувся в початковий стан - чекати, коли хтось згодувати йому чергову монетку.

Такий прогін зручно дивитися засобами налагодження.

Примітка - Після end; в програму варто додати оператор else. який дозволить обробляти тупикові ситуації.

Кінцевий автомат працює за принципом «крок у бік - розстріл» (перездача нормативів з лижного кросу). «Ухилитися» або «схитрувати» кінцевий автомат не дасть ні користувачеві (вихідний варіант коду), ні самій програмі (модифікований варіант коду). Автомат змусить і того, і іншого пройти «контрольні точки» саме так, як розписав програміст.

Код кінцевого автомата рясніє ветвлениями, але розгалужень - логічних структур «вибір» - в явному вигляді як ніби й немає. Оператор case робить текст програми настільки «прозорим», що на питання «а що буде, якщо» будь-тикне пальцем і потрапить в саму точку. А наскільки «прозора» конструкція if a> 0 then b: = 0 else if a<0 then b:=a else if a<>b then (і так далі.)? Це до питання про культуру програмування - написання легко читається коду.

Код кінцевого автомата взаємно-ортогонален. При модифікації коду, при додаванні в код нових case-фрагментів змінювати вихідний код не буде потрібно. Програма не «поповзе» - знижується ймовірність помилок при кодуванні.

висновок

Коль скоро було згадано про Пушкіна, гріх не згадати про Маяковського, передбачив «народження» оператора case (але без його фірмової «драбинки»).

«Від ворони карапуз

Хлопчик цей просто боягуз.

Це дуже погано .

Цей, хоч і сам з вершок,

сперечається з грізною птахом.

Хоробрий хлопчик, добре,

в житті знадобиться ».

Ось, що виходить:

case хлопчик of

Тепер, коли з прикладів стало ясно, як кінцевий автомат керує поведінкою коду програми, можна сміливо приступати до читання статей професора Б. П. Кузнєцова і до розбору «довільних циклічних алгоритмів, представлених у вигляді графа переходів кінцевого автомата». Успіхів!

Замовити послуги ТОВ «Технічна документація» можна по ел. поштою admin @ tdocs. su (без пробілів), по тел. 8-910-468-09-28, 8-916-631-48-82 або в формі Контакти.

Схожі статті