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

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

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

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

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

Нижче наведено cирцевий код програми на мові програмування 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 впливають на нашу здатність розмірковувати про програму, особливо на можливість зрозуміти динамічну поведінку програми через використання статичних тверджень.

Джерела

Wikiwand in your browser!

Seamless Wikipedia browsing. On steroids.

Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.

Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.