Структурна теорема Бьома — Якопіні
Базові алгоритмічні структури — це основні структурні елементи, за допомогою яких створюють алгоритм для розв'язування певної задачі. Існують три основні (базові) алгоритмічні структури: слідування (лінійна), розгалуження та повторення, за допомогою поєднання яких може бути представлено логічну структуру будь-якого алгоритму. Основна особливість базових алгоритмічних структур — це їх повнота, тобто цих структур достатньо для створення найскладнішого алгоритму, та наявність у кожної з них одного входу та одного виходу. Графічні зображення структур називають блок-схемами. Теорема Бьома — ЯкопініТеорема Бьома — Якопіні — положення структурного програмування, згідно з яким виконуваний алгоритм можна втілити з використанням лише трьох конкретних структур керування:
Цю теорему сформулювали та довели італійські математики Коррадо Бьом і Джузеппе Якопіні (Giuseppe Jacopini) в їхній статті 1966 року[1], де описано методи перетворення неструктурованих алгоритмів на структуровані на прикладі створеної Бьомом мови програмування P′′. Через 2 роки після публікації теореми, 1968 року вийшла стаття Едсгера Дейкстри «Go To Statement Considered Harmful»[2], в якій він критикував використання оператора GOTO й висловлювався на користь поліпшення стилю програмного коду за рахунок використання структур керування та відмови від інших інструкцій, що керують виконанням алгоритму. Структурна теорема Бьома — Якопіні була початком структурного програмування — парадигми програмування, яка виключає команди безумовного переходу (goto) й використовує виключно підпрограми, послідовне виконання, розгалуження (вибір) і цикли (ітерації). Ця теорема є науковим положенням, яке Дейкстра застосував для обґрунтування його ідеї про використання в програмах лише трьох структур керування: послідовного виконання, розгалужень і циклів[3]. Доведення в праці Бьома та Якопіні проведено за індукцією в структурі блок-схеми[4]. Оскільки в графах використовувалося зіставлення зі зразком, доведення, запропоноване Бьомом і Якопіні не було дійсно практичним як алгоритм перетворення програми до структурованого вигляду, і, таким чином, відкрило двері для додаткових досліджень у цьому напрямку[5]. Базова структура «слідування»Структура слідування (лінійна, послідовне виконання) — це алгоритмічна структура, яка забезпечує отримання результату шляхом одноразового виконання послідовності дій, незалежно від параметрів вхідних даних та проміжних результатів. Дії в таких структурах виконуються послідовно, одна за одною, тобто лінійно.
Базова структура «розгалуження»Розгалуження (умова, структура вибору) — вибір дій у разі виконання або невиконання заданої умови. Забезпечує, залежно від результату перевірки умови (так чи ні), вибір одного з альтернативних шляхів роботи алгоритму. Кожен із шляхів веде до загального виходу, тож робота алгоритму продовжиться незалежно від того, який шлях буде обрано. Розгалуження бувають повними і неповними. Повне розгалуження — це розгалуження, в якому певні дії визначено й у разі виконання, і в разі невиконання умови. Неповне розгалуження — це розгалуження, в якому дії визначено лише в разі виконання (або в разі невиконання) умови. Структура розгалуження існує в чотирьох основних варіантах:
Приклади структури розгалуження Базова структура «повторення»Повторення (цикли, структура повторення) — структура, в якій передбачено повторення деякої команди чи послідовності/серії команд. За допомогою цієї структури описують однотипні дії, що повторюються декілька разів. Такі алгоритми забезпечують виконання довгої послідовності дій, записаних порівняно короткою послідовністю команд. Використання циклів дозволяє у повній мірі реалізувати швидкодію комп'ютерів. Повторення забезпечує багаторазове виконання деякої сукупності дій, яку називають тілом циклу. Основні різновиди циклів наведено в таблиці: Приклади структур повторення
Наслідки та уточненняТеорема Бьома — Якопіні не розв'язує питання про те, чи слід застосовувати структурне програмування для розробки програмного забезпечення, почасти тому, що конструкція швидше за все «затінює» програму, ніж поліпшує її. Навпаки, це стало сигналом до початку обговорення. Знаменитий лист Едсгера Дейкстри «Go To Statement Considered Harmful» 1968 року поклав початок цій дискусії[6]. Деякі науковці використовували пуристській підхід до результату Бьома — Якопіні й стверджували, що навіть такі інструкції, як Едвард Юдон зазначає, що в 1970-х роках була навіть філософська опозиція перетворенню неструктурованих програм на структуровані за допомогою автоматизованих засобів, ґрунтована на аргументі, що потрібно від самого початку думати в стилі структурованого програмування. Прагматичним контрапунктом було те, що такі перетворення принесли користь великій кількості наявних програм[8]. Серед перших пропозицій з автоматизованого перетворення була стаття Едварда Ешкрофта і Зохара Манни, опублікована 1971 року. Пряме застосування теореми Бьома — Якопіні може призвести до додавання до структурованої програми додаткових локальних змінних, а також до деякого дублювання коду. Останнє питання в цьому контексті називають проблемою циклу з половиною. На Паскаль впливають обидві ці проблеми, і, згідно з емпіричними дослідженнями, на які посилається Ерік С. Робертс, учням, які навчаються програмування, досить складно формулювати правильні розв'язки на Паскалі для кількох простих завдань, включно з написанням функції для пошуку елемента в масиві. Дослідження, проведене 1980 року Генрі Шапіро та цитоване Робертсом, показало, що з використанням лише структур керування, наданих Паскалем, правильний розв'язок знайшли лише 20 % випробовуваних, у той час як жоден з випробуваних не написав неправильного коду для цієї задачі, якщо йому було дозволено написати вихід із середини циклу[7]. 1973 року С. Рао Косараджу довів, що можливо уникати додавання додаткових змінних в структурну програму, якщо допускаються багаторівневі виходи довільної глибини з циклів[9][10]. Крім того, Косараджу довів, що існує строга ієрархія програм, нині звана ієрархією Косараджу, в якій для кожного цілого числа n існує програма, яка містить багаторівневий вихід глибини n, який неможливо переписати як програму з багаторівневими виходами глибини менше n (без уведення додаткових змінних)[9]. Косараджу посилається на багаторівневу конструкцію виходу в мові програмування BLISS. Багаторівневі виходи у формі ключового слова
Маккейб фактично виявив, що ці чотири графи не є незалежними при відображенні як підграфи, а це означає, що необхідною і достатньою умовою для неструктурованої програми є наявність в її підгрупі однієї з підмножин будь-якого з трьох з цих чотирьох графів. Він також виявив, що якщо неструктурована програма містить один з цих чотирьох підграфів, вона повинна містити ще один відмінний від набору з чотирьох. Цей останній результат допомагає пояснити, як потік керування неструктурованою програмою заплутується в так званому «коді спагетті». Маккейб також розробив числову міру, яка, з огляду на довільну програму, кількісно визначає, наскільки вона далека від ідеалу структурованої програми; Маккейб назвав свою міру істотною складністю[12]. До 1990 року було запропоновано досить багато методів для виключення команди безумовного переходу Див. також
Примітки
Посилання
|
Portal di Ensiklopedia Dunia