Безумовний перехід (англ. unconditional branch) - перехід в задану точку програми без перевірки виконання будь-яких умов. В багатьох мовах програмування такому переходу відповідає спеціальна інструкція goto, в деяких BRANCH або JUMP.
У мові асемблера безумовні і умовні переходи є одними з найбільш вживаних інструкцій. Безумовні переходи широко використовувалися у деяких ранніх мовах програмування високого рівня, наприклад, BASIC, COBOL, Фортран. Проте з ростом складності і розміру програм та розвитком структурного програмування використання даної інструкції стало небажаним через велику кількість помилок і плутанини, що виникає в процесі програмування з її використанням. В 1968 Едсгер Дейкстра написав листа до Communications of the ACM (CACM) початково під назвою «Справа проти інструкції GO TO.» CACM перейменував лист у «Інструкція Go To вважається шкідливою.» На сьогодні використання оператора безумовного переходу вважається поганим стилем програмування, а в деяких сучасних мовах високого рівня він взагалі не підтримується (наприклад, в Python, Java).
У невеликих програмах, goto може полегшити і спростити написання програмного коду. Хоча зазвичай її використання можна замінити іншими інструкціями, наприклад, циклом.
Зловживання операціями безумовного переходу у високорівневих мовах зазвичай називають "кодом-спагеті".
Приклад програми з безумовним переходом
Нижче наведено вихідні коди програми на мові програмування , знаходження 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 впливають на нашу здатність розмірковувати про програму, особливо на наші можливості з розуміння динамічної поведінки програми через використання статичних тверджень.
Джерела
- . Архів оригіналу за 23 березня 2011. Процитовано 4 липня 2011.
- (PDF). Архів оригіналу (PDF) за 13 травня 2014. Процитовано 9 січня 2012.
Ця стаття потребує додаткових для поліпшення її . (березень 2017) |
Це незавершена стаття про програмування. Ви можете проєкту, виправивши або дописавши її. |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Bezumovnij perehid angl unconditional branch perehid v zadanu tochku programi bez perevirki vikonannya bud yakih umov V bagatoh movah programuvannya takomu perehodu vidpovidaye specialna instrukciya goto v deyakih BRANCH abo JUMP U movi asemblera bezumovni i umovni perehodi ye odnimi z najbilsh vzhivanih instrukcij Bezumovni perehodi shiroko vikoristovuvalisya u deyakih rannih movah programuvannya visokogo rivnya napriklad BASIC COBOL Fortran Prote z rostom skladnosti i rozmiru program ta rozvitkom strukturnogo programuvannya vikoristannya danoyi instrukciyi stalo nebazhanim cherez veliku kilkist pomilok i plutanini sho vinikaye v procesi programuvannya z yiyi vikoristannyam V 1968 Edsger Dejkstra napisav lista do Communications of the ACM CACM pochatkovo pid nazvoyu Sprava proti instrukciyi GO TO CACM perejmenuvav list u Instrukciya Go To vvazhayetsya shkidlivoyu Na sogodni vikoristannya operatora bezumovnogo perehodu vvazhayetsya poganim stilem programuvannya a v deyakih suchasnih movah visokogo rivnya vin vzagali ne pidtrimuyetsya napriklad v Python Java U nevelikih programah goto mozhe polegshiti i sprostiti napisannya programnogo kodu Hocha zazvichaj yiyi vikoristannya mozhna zaminiti inshimi instrukciyami napriklad ciklom Zlovzhivannya operaciyami bezumovnogo perehodu u visokorivnevih movah zazvichaj nazivayut kodom spageti Priklad programi z bezumovnim perehodomNizhche navedeno vihidni kodi programi na movi programuvannya C znahodzhennya N go chisla Fibonachchi include lt iostream gt using namespace std int main int N cout lt lt Zadajte nomer N cin gt gt N int a 1 b 0 c label Mitka misce v programi kudi zdijsnyuyetsya perehid if N 0 cout lt lt Shukane chislo lt lt a lt lt endl return 0 N c b b a a c goto label Operator perehodu Porivnyannya z programoyu bez bezumovnogo perehoduPidib yemo argumenti Dejkstri Lyudi krashe rozumiyut statichni zv yazki nizh dinamichni bo ostanni vimagayut postijnoyi zmini rozuminnya Otzhe legshe zrozumiti yak programa pracyuye v terminah vlastivostej programi nizh cherez te yak programa vikonuyetsya V pershomu vipadku znannya yak pracyuye programa zalishayetsya dijsnim dopoki htos ne zminit kod programi ale v drugomu vipadku vono mozhe zminyuvatis pri kozhnomu zapusku programi Dlya rozuminnya znachennya vlastivostej programi dlya mozhlivosti vkazati na tochku v programi i podumati Kozhnogo razu koli programa distayetsya cogo miscya pevni umovi istini Napriklad if n lt 0 n 0 Pripustimo sho n ce zminna vbudovanogo chislovogo tipu mi znayemo sho po vikonanni cogo kodu vona nevid yemna A teper uyavimo perepisanu dilyanku kodu if n gt 0 goto nonneg n 0 nonneg Teoretichno cej zminenij kod maye pracyuvati tak samo Odnak zminilos desho vazhlive teper isnuye mozhlivist peredati kontrol do nonneg z inshogo miscya v programi Inakshe kazhuchi mi bilshe ne mozhemo skazati sho po dosyagnenni nastupnoyi za cim shmatkom kodu instrukciyi n nevid yemne Takozh goto uskladnyuye mozhlivist zrozumiti programu statichno cherez uskladnennya rozuminnya yakij postup vidbuvsya v programi pid chas vikonannya Yaksho programa vikoristovuye lishe strukturi keruvannya podibni do if i while todi mozhemo govoriti pro te yakij shlyah vikonannya obrav kozhen if i skilki raziv tilo kozhnogo while bulo vikonane i tak vibuduvati povnu istoriyu vikonannya programi Taka kartina daye nam mozhlivist zrozumiti programu cherez tverdzhennya taki yak Kilkist iteracij v cikli odnakova z kilkistyu zapisiv na vhodi goto uskladnyuye vidstezhennya vikonannya programi bo nemaye mozhlivosti skazati yak silno kozhne goto mozhe zminiti perebig programi Yak naslidok istoriya vikonannya programi staye vazhchoyu dlya opisannya Obidva ci riziki instrukciyi goto vplivayut na nashu zdatnist rozmirkovuvati pro programu osoblivo na nashi mozhlivosti z rozuminnya dinamichnoyi povedinki programi cherez vikoristannya statichnih tverdzhen Dzherela Arhiv originalu za 23 bereznya 2011 Procitovano 4 lipnya 2011 PDF Arhiv originalu PDF za 13 travnya 2014 Procitovano 9 sichnya 2012 Cya stattya potrebuye dodatkovih posilan na dzherela dlya polipshennya yiyi perevirnosti Bud laska dopomozhit udoskonaliti cyu stattyu dodavshi posilannya na nadijni avtoritetni dzherela Zvernitsya na storinku obgovorennya za poyasnennyami ta dopomozhit vipraviti nedoliki Material bez dzherel mozhe buti piddano sumnivu ta vilucheno berezen 2017 Ce nezavershena stattya pro programuvannya Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi