Безумовний перехід

Безумовний перехід (англ. unconditional branch) - перехід в задану точку програми без перевірки виконання будь-яких умов. В багатьох мовах програмування такому переходу відповідає спеціальна інструкція goto, в деяких BRANCH або JUMP[1].

У мові асемблера безумовні і умовні переходи є одними з найбільш вживаних інструкцій. Безумовні переходи широко використовувалися у деяких ранніх мовах програмування високого рівня, наприклад, BASIC, COBOL, Фортран. Проте з ростом складності і розміру програм та розвитком структурного програмування використання даної інструкції стало небажаним через велику кількість помилок і плутанини, що виникає в процесі програмування з її використанням. В 1968 Едсгер Дейкстра написав листа до Communications of the ACM (CACM) початково під назвою «Справа проти інструкції GO TO.» CACM перейменував лист у «Інструкція Go To вважається шкідливою[2].» На сьогодні використання оператора безумовного переходу вважається поганим стилем програмування, а в деяких сучасних мовах високого рівня він взагалі не підтримується (наприклад, в Python, Java).

У невеликих програмах, goto може полегшити і спростити написання програмного коду. Хоча зазвичай її використання можна замінити іншими інструкціями, наприклад, циклом.

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

Приклад програми з безумовним переходом

Нижче наведено вихідні коди програми на мові програмування C++, знаходження N-го числа Фібоначчі:

 #include <iostream>
 using namespace std;
 int main() {
   int N;
   cout << "Задайте номер N: ";
   cin >> N;
   int a = 1, b = 0, c;
 label: // Мітка (місце в програмі куди здійснюється перехід)
   if (N == 0) {
     cout << "Шукане число: " << a << endl;
     return 0;
   }
   N--;
   c = b;
   b = a;
   a += c;
   goto label; // Оператор переходу
 }

Порівняння з програмою без безумовного переходу

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

Для розуміння значення властивостей програми для можливості вказати на точку в програмі і подумати: «Кожного разу коли програма дістається цього місця певні умові істині.» Наприклад:

if (n < 0)
      n = 0;

Припустимо, що n це змінна вбудованого числового типу, ми знаємо, що по виконанні цього коду вона невід'ємна.

А тепер уявімо переписану ділянку коду:

if (n >= 0) goto nonneg;
n = 0;
nonneg: ;

Теоретично, цей змінений код має працювати так само. Однак, змінилось дещо важливе: тепер існує можливість передати контроль до nonneg з іншого місця в програмі. Інакше кажучи, ми більше не можемо сказати, що по досягненні наступної за цим шматком коду інструкції n невід'ємне.

Також goto ускладнює можливість зрозуміти програму статично через ускладнення розуміння який поступ відбувся в програмі під час виконання. Якщо програма використовує лише структури керування подібні до if і while, тоді можемо говорити про те який шлях виконання обрав кожен if і скільки разів тіло кожного while було виконане, і так вибудувати повну історію виконання програми. Така картина дає нам можливість зрозуміти програму через твердження такі як «Кількість ітерацій в циклі однакова з кількістю записів на вході.» goto ускладнює відстеження виконання програми, бо немає можливості сказати як сильно кожне goto може змінити перебіг програми. Як наслідок, історія виконання програми стає важчою для описання.

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

Джерела


This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.