Персональные инструменты
Счётчики

GOTO

Материал из Lurkmore
Перейти к: навигация, поиск

10

Сферичнее только 10 GOTO 10

GOTO (гоуту, гото) — причина лютых срачей между программистами. Споры о том «дозволено ли GOTO или нет» идут с самого начала существования структурного программирования.

Содержание


Оператор безусловного перехода к указанной после него метке/строке программы. При ненадлежащем использовании в коде этот самый код станет непонятен даже создателю. При годном использовании может сильно облегчить код и исключить использование более сложных конструкций. Собственно срач подразумевает первый случай использования.

20 GOTO 50

30 Срач

Вы удивитесь, но первый троллинг GOTO возник ещё в 1968 году, когда Эдсгер Дейкстра написал высер «Go To Statement Considered Harmful» («Оператор GOTO считается опасным»). Прочесть его крайне рекомендуется — там тонны лулзов (несмотря на то, что переводил явно надмозг). Чего только стоит первое же предложение: «За многие годы я утвердился во мнении о том, что квалификация программистов — функция, обратно зависящая от частоты появления операторов go to в их программах».

Еще более доставляет тот факт, что фраза «Considered Harmful» сама по себе стала мемом. Так, ответ на статью Дейкстры назывался «'GOTO Considered Harmful' Considered Harmful», ответ на неё назывался «'„GOTO Considered Harmful“ Considered Harmful' Considered Harmful?» и так далее (всего 78(!) статей с данной фразой).

Вообще, в двух словах критика GOTO выражается очень просто: «Хуй поймешь, в каком порядке выполняется этот код». Отладка кода, щедро усыпанного GOTO, напоминает распутывание клубка ниток, причем состоящего из разных кусочков ниток, которые надо собрать в определенном порядке. Кстати, согласно этому оператору, данную статью следует читать начиная со второго раздела, а потом перейти к первому, и если вы это читаете, не прочтя первый, то вы ламер, лол.

Так вот, упомянутый во втором разделе язык Basic подвергался отдельной критике Дейкстры: «Студентов, ранее изучавших Бейсик, практически невозможно обучить хорошему программированию. Как потенциальные программисты они подверглись необратимой умственной деградации». А ещё он назвал копирования отечественными компостроителями архитектуры IBM «Величайшей диверсией Запада против СССР», и, ЧСХ, отчасти оказался прав!

Вернемся к GOTO. Любопытный факт: несмотря на массовую нелюбовь, он есть в большинстве современных языков программирования (хотя в Яве и Питоне его, например, нет, точнее, в Яве есть, но абсолютно ничего не делает). И выстрелить себе в ногу с его помощью могут многие, под здоровый смех более просветленных быдлокодеров. Но, что интересно, оператор GOTO имеется в исходниках весьма популярных программ, вроде ядра линукса или гугловского «Андроида». Почему? Потому что существуют редкие случаи, когда его использование несколько упрощает код. Другое дело, что использование его вне этих случаев немедленно приводит к полному пиздецу. Впрочем, случаи этого, в последнее время, не так уж часты — вероятно, по той причине, что многие ньюфаги, не знавшие раннего Бейсика, просто не знают о том, что такой оператор существует (для PHP-быдла он, как правило, и не нужен, потому что там редко встретишь сколь-либо сложные алгоритмы).

Все это, однако, не мешает периодически выходить новым статьям, доказывающим или опровергающим то, о чем Дейкстра и его оппоненты написали полвека назад. Под любой такой статьей немедленно начинается спор между GOTO-фагами и GOTO-ненавистниками. Вторые обычно аргументируют «GOTO нельзя, потому что GOTO нельзя, и вообще можно ту же задачу решить без него», а первые осторожно замечают, что иногда это все-таки можно, к тому же в некоторых языках не хватает адекватных заменителей (например, выход из многовложенных циклов на Си — можно извращаться с return-ами, или делать флаги выхода, но, бля…) Немного соображающий в кодинге тролль может вызвать немало ненависти, выступая за ту или другую сторону.

Но надо сказать, что современные языки с GOTO все-таки стараются ограничить его применение — так, обычно нельзя так просто прыгать между функциями. Так что GOTO уже не тот, что был раньше. Но мы помним!

40 GOTO 70

50 Суть

Последствия использования

Оператор GOTO — древнейший оператор. Используется он для безусловного перехода из одной точки кода в другую. До появления процедур и функций был по сути единственным способом запустить один и тот же код несколько раз. В ассемблере этому оператору соответствует JMP, и он вместе с JZ, JNZ и несколькими другими аналогичными операторами является единственным способом построения цикла.

Люди, начинавшие программировать на раннем Basic-е, безусловно помнят, что каждая строчка на нем нумеровалась (10:, 20: и т. д.). Соответственно, написав GOTO 10, можно было скакнуть в самое начало программы. Или ещё куда-нибудь. В более современных языках появились символьные метки, так что стало возможным писать goto nahuy; или еще что-то в этом роде.

60 GOTO 30

70 См. также

Рекурсия

80 GOTO 10