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

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук

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

Широко використовувалася у ранніх версіях мов програмування, наприклад, BASIC, Fortran, Pascal. Також до сих пір широко використовується при програмуванні на мові низького рівня Assembler. Проте з ростом складності і розміру програм та розвитком структурного програмування використання даної інструкції стало небажаним через велику кількість помилок і плутанини, що виникає в процесі програмування з її використанням. В 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 впливають на нашу здатність розмірковувати про програму, особливо на наші можливості з розуміння динамічної поведінки програми через використання статичних тверджень.

Джерела[ред.ред. код]

Комп'ютер Це незавершена стаття про комп'ютери.
Ви можете допомогти проекту, виправивши або дописавши її.