LINUX.ORG.RU

All hail GOTO


0

0

Великолепный комментарий по поводу того, что в PHP >= 5.3 добавляют оператор GOTO:

GOTO is what your CPU is actually doing 80% of the time.
You can pump up your ego by imagining that using a language without something explicitely called "GOTO" makes your code "up with the time". But what you actually do is nothing but GOTOs, just written in a different manner.
Ironically, the VM that PHP uses is completely GOTO-based (well, you can pick several methods at compile-time, but GOTO is what a lot of distributions chose because performance is often better than CALL and it's very stable nowadays).
Oh and even JAVA has GOTO and relies a lot on it. The compiler hides an explicit thing called "GOTO", but what you get after compilation is full of GOTO. And it's actually why apps can actually do something.
Laughing at "GOTO" is ignorance, or just blind trolling because you read somewhere that BASIC had a "GOTO" keyword. I guess in a few years your children will laugh at those horrible "$", "$this", "->", ":" and "\" symbols, that would remind them the old time of a language called PHP. Though you are proud of them now.
Using temporary variables like "$should_exit", dummy loops just to "break" at the right place, or named loops to work around "break" that would only exit the first loop is nothing but writing "GOTO" in an obfuscated and inefficient way. "GOTO" is not synonym for "spaghetti code" (the famous keyword always used by people blindly repeating that GOTO is bad).
Oh and grep for "goto" in your Linux kernel or in any BSD operating system. Wow, tons of them. Really. But I guess this is just because these source codes are shits written by people who can barely write GW-BASIC, and of course none of these operating systems actually work. Glad you are there to help. Teach them how to code, tell them that their code is so passé.
Or shut up.

anonymous

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

Все IMHO.

Ian ★★
()
Ответ на: комментарий от Ian

16-17 лет назад, перейдя на Quick Basic, я себя насильно заставил отказаться от привычки юзать GOTO. И с тех пор - не использовал его больше нигде. Даже не насилуя себя. Просто надобности не было :) Дело привычки...

KRoN73 ★★★★★
()

И с goto пишется читабельный код и без goto пишется ужасающий индусокод. Имхо - он должен быть в языке.

Legioner ★★★★★
()
Ответ на: комментарий от KRoN73

У меня тоже есть история с goto. Даже история и продолжение. Я сам когда-то писал на Pascal.

История: Была у меня простенькая прога, не важно что она делала, важно то что я в коде довольно часто использовал goto. Как-то мне понадобилось что-то в ней изменить и тут я попал. Я думаю ясно как. В итоге пару дней работы и все goto я убрал. В итоге код стал намного понятнее.

Продолжение: Не очень давно на ЛОРе в очередной раз проскакивали комментарии про goto. Кто-то уж очень его защищал. В итог я решил покапаться в интернете и поискать, а вдруг действительно есть такие задачки, которые с goto решаются проще, красивее, etc. Наткнулся на одном из форумов как раз на подобное обсуждение. Человек рассказывал о ситуациях, где goto выигрывает у других решений. В комментариях все его поддерживали, пока один из участников дискуссии не прислал решение всех этих задач. Так вот это решение было в разы элегантнее и проще для восприятия нежели решение с goto.

Если не ошибаюсь, в одной из задачек надо было выделить несколько раз память и в конце метода ее очистить. Проблема если в середине метода появляется ошибка. В итоге получается дублированный код очистки памяти.

Ian ★★
()
Ответ на: комментарий от Ian

>В итоге получается дублированный код очистки памяти.

Ну, Чарльз Мур (кажется) по этому поводу просто говорил: в редакторе настоящего программиста должна отсутствовать функция копирования блоков кода :)

KRoN73 ★★★★★
()
Ответ на: комментарий от Sectoid

дада, авторы этого предложения явно не боятся велоцерапторов. а зря!

jtootf ★★★★★
()
Ответ на: комментарий от true_admin

>Подскажи как добавить в C аналог эксепшенов без goto и я его выкину :)

А в ассемблере даже цикл нормальный или развилку без jxx/jmp не организуешь :)

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

А вот займись кодогенерацией - сразу goto захочешь. Пользователю - да, лучше goto руками не писать, а вот в сгенерённом автоматически коде от него вреда не будет, одна только польза.

Учитывая, что на PHP код часто генерится автоматом, то goto там уместен.

anonymous
()
Ответ на: комментарий от Ian

Ну реши задачку - написать эффективную реализацию интерпретатора байткодов простой виртуальной машины. С goto, с goto и gcc-расширениями и без goto. Посмеёмся.

anonymous
()
Ответ на: комментарий от Ian

Ясно. Ламер слил. Ну, что ж, если у тебя не хватает силёнок написать сто строк кода на Си, хотя бы головой подумай, как этот код следует написать.

Все вы, фанатики-ненавистники goto, оказываетесь при проверке редкостным ламьём.

anonymous
()
Ответ на: комментарий от anonymous

Более того,

> Oh and even JAVA has GOTO and relies a lot on it. The compiler hides an explicit thing called "GOTO", but what you get after compilation is full of GOTO. And it's actually why apps can actually do something.

И читай комментарий крона про ассемблер и jmp.

Да, goto действительно много где внутри живет, и вполне понятно почему. Речь идет о явном его использовании, которое зачастую к добру не приводит.

Ian ★★
()
Ответ на: комментарий от anonymous

Тебе видно сказать больше нечего. Может у тебя есть реализация того что ты просил? Давай покажи нам исходники, мы посмотрим и, как ты говоришь, посмеемся.

Так, что давай, любитель лапши, отваливай.

Ian ★★
()
Ответ на: комментарий от Ian

> http://adomas.org/excc/

круто, буду знать :). Но от goto не откажусь т.к. он просто
проще в использовании, гораздо быстрее и весь код перед
глазами. А тут сотни строк кода который, по сути, делает
тоже самое, только через несколько longjmp. Плюс
там нет механизма наследования эксепшенов, а это плохо.

Кстати, что то подобное можно сделать гораздо проще:

#define except goto
#define try __EMPTY_LABEL
#define raise(exception) goto(exception)


try:
    raise(EXCEPTION);
except EXCEPTION:
    //your handler code here

С ходу тока не придумал как сделать finally и как перехватывать
вообще все эксепшены а не какой-то один.

true_admin ★★★★★
()

>Oh and grep for "goto" in your Linux kernel or in any BSD operating system. Wow, tons of them. Really. But I guess this is just because these source codes are shits written by people who can barely write GW-BASIC, and of course none of these operating systems actually work.

Гы, а вы тут про гоуту. Надо Линусу послать, лулзов ради - он язык за зубами держать тоже не будет.

redgremlin ★★★★★
()
Ответ на: комментарий от anonymous

Круто! Много умных слов написал.

Блин, сколько на лоре развелось знатоков виртуальных машин. Пора проредить популяцию.

Ты давай не метанируй, а конкретный пример приведи.

Ian ★★
()
Ответ на: комментарий от Ian

Ламеряшечко, тебе КОНКРЕТНЫЙ пример показали. Тебя рыльцем в файл ткнуть, раз мозга не хватило найти самостоятельно?

В исходниках ocaml смотри, дурик, в byterun/interp.c

Ну блин, я так никогда и не пойму, почему ламеры всегда так упорно отказываются признавать себя ламерами? Ведь это так просто - быть всего лишь честным.

anonymous
()
Ответ на: комментарий от anonymous

Ты не нужен. У тебя нет мозга.

anonymous
()
Ответ на: комментарий от anonymous

Идиот убогий, я не собираюсь качать исходники и искать что-то только потому что ты тут что-то вякнул. Пальцем в небо и я могу ткнуть. Если ты так радеешь за goto просто возьми и приведи пример. Напиши код, или словами опиши, а не воняй тут. Имей хоть малейшее уважение к людям с которыми общаешься на форуме.

А теперь пшел нах.

Ian ★★
()
Ответ на: комментарий от Ian

> Идиот убогий, я не собираюсь качать исходники и искать что-то только потому что ты тут что-то вякнул.

Ламеришко, вякнул то чушь ты. Ты вякнул, что нет такой задачи, которая наиболее эффективно бы с goto решалась. А я ничего не "вякал", я конкретно тебе указал на твою ошибку. И теперь ты, примитивненький и глупенький, пытаешься защищать своё право на ошибку. Скачать исходники и посмотреть - дело трёх минут, но, поскольку ты считаешь себя заранее правым, ты этого делать не станешь. Ты, как и все прочие чрезмерно самоуверенные ламеры, не верящие в свой ламеризм, подсознательно боишься всего, что может пошатнуть твою самоуверенность.

> Имей хоть малейшее уважение к людям с которыми общаешься на форуме.

Те, кто с такой убеждённостью несут чушь, те, кто совершенно не по статусу самоуверенны, никакого уважения не заслуживают.

Если у тебя есть какие-то зачатки разума, то примени их прямо сейчас - подумай, разумно ли приводить здесь столь длинный пример, тогда как проще всего указать на то, где его можно посмотреть. На маленьком же примере преимущества goto будут просто не видны.

http://github.com/thelema/ocaml-community/tree/master/byterun/interp.c

anonymous
()
Ответ на: комментарий от anonymous

> На маленьком же примере преимущества goto будут просто не видны.

> http://github.com/thelema/ocaml-community/tree/master/byterun/interp.c

Это все что ты сказал по делу за все посты. Удивительно сколько из тебя дерьма льется.

В твоем примере можно было обойтись и без goto. Аккуратно разбив по методам. Видимо тут дело в быстродействии. goto выполнится быстрее чем вызов. Хотя не берусь судить. Возможно, что при оптимизации такого рода задач его применение вполне оправдано.

Ian ★★
()
Ответ на: комментарий от anonymous

Критика

Оператор GOTO в языках высокого уровня является объектом критики, поскольку чрезмерное его применение нарушает иерархическую структуру программы и приводит к созданию нечитаемого «спагетти-кода». Впервые эта точка зрения была отражена в статье Эдсгера Дейкстры «Доводы против оператора GOTO»[2], который заметил, что качество программного кода обратно пропорционально количеству операторов GOTO в нём. Статья приобрела широкую известность как среди теоретиков, так и среди практиков программирования, в результате чего взгляды на использование оператора GOTO были существенно пересмотрены. В своей следующей работе Дейкстра обосновал тот факт, что для кода без GOTO намного легче проверить формальную корректность.

Код с GOTO трудно форматировать, так как он может нарушать иерархичность выполнения, и потому отступы, призванные отображать структуру программы, не всегда могут быть выставлены правильно. GOTO аннулирует многие возможности компилятора по оптимизации управляющих структур, из-за чего исполняемый код становится медленней и объёмней[3].

Доводы против оператора GOTO оказались столь серьёзны, что в структурном программировании его стали рассматривать как крайне нежелательный. Это нашло своё отражение при проектировании новых языков программировании. Например, GOTO был намеренно полностью запрещён в Java и Ruby. Вместе с тем, в Аде — одном из наиболее продуманных с точки зрения архитектуры языке за всю историю[4], GOTO всё же был оставлен.

Формально доказано, что применение GOTO не является обязательным (то есть не существует такой программы с GOTO, которую нельзя было бы переписать без этого оператора с полным сохранением функциональности). Одним из доводов против GOTO является то, что в некоторых случаях программисты ставят GOTO, чтобы быстрее достичь желаемого результата (написать фрагмент программы с определёнными свойствами), в то время как отсутствие GOTO заставило бы их провести более внимательный анализ задачи, который обычно приводит к получению более ясного, эффективного и лучше организованного кода.

[править] Оправданное применение

Тем не менее, в практическом программировании применение GOTO в некоторых случаях можно считать допустимым. Поскольку GOTO — «простейший», «атомарный» оператор перехода, а все остальные являются «составными», производными от него, то применение GOTO допустимо и оправданно, когда другие средства языка не реализуют или недостаточно эффективно реализуют нужную функциональность.

Думаю на этом тему можно закрыть.

Ian ★★
()
Ответ на: комментарий от Ian

> В твоем примере можно было обойтись и без goto. Аккуратно разбив по методам.

Ты читать умеешь, что тебе пишут? Можно то оно можно, без goto всегда можно обойтись. Но! С goto этот пример, во первых, читабельнее для человека, а во вторых, гораздо, в разы эффективнее чем без goto.

> Видимо тут дело в быстродействии. goto выполнится быстрее чем вызов.

Намного быстрее. В разы.

Но дело не только в быстродействии. С goto оно ещё и читается легче.

Вот тебе ещё один пример, на этот раз от и вовсе крутого авторитета:

http://literateprogramming.com/adventure.pdf

anonymous
()
Ответ на: комментарий от anonymous

> С goto этот пример, во первых, читабельнее для человека

Можешь сколь угодно брызгать слюной, с этим я не соглашусь.

> Намного быстрее. В разы.

Согласен. Но уровень программиста для таких задач нужно поднять.

> Вот тебе ещё один пример, на этот раз от и вовсе крутого авторитета:

Хватит примеров. Все и так ясно.

Мы рассматриваем goto с разных сторон. Прочитай мой пост из википедии. Там в разделе критика хорошо описано, где goto применять не стоит - это то о чем говрою я, а в разделе оправданное применение хорошо написано где его применять стоит - это то о чем говоришь ты.

Ian ★★
()
Ответ на: комментарий от Ian

> с этим я не соглашусь.

Тебя никто и не заставляет. Ты свой уровень знаний (да и интеллекта) уже показал, никто от тебя не ждёт проявлений разума.

> Но уровень программиста для таких задач нужно поднять.

Уровень программиста по любому поднять не мешало бы. Паршивые программисты не нужны.

> Хватит примеров. Все и так ясно.

Зря не посмотрел. Это, всё ж таки, Дон Кнут, не какой либо хмырь с горы.

> Прочитай мой пост из википедии.

Он примитивен. В википедии писали весьма неграмотные люди.

Обрати внимание - те применения, о которых я говорю, имеют одно общее свойство - код "плоский". Нет выходов из глубоко вложенных контекстов, тех самых, против которых так ругался Дийкстра (понимая, что он говорит) и его последователи (слепо повторяющие слова Мастера, не осознавая их смысла).

anonymous
()
Ответ на: комментарий от anonymous

> Ты свой уровень знаний (да и интеллекта) уже показал, никто от тебя не ждёт проявлений разума.

Что есть тем и пользуюсь и стараюсь развивать.

А вот ты может и умен, но как человек ты - дерьмо, уж извини.

> Обрати внимание - те применения, о которых я говорю, имеют одно общее свойство - код "плоский". Нет выходов из глубоко вложенных контекстов, тех самых, против которых так ругался Дийкстра (понимая, что он говорит) и его последователи (слепо повторяющие слова Мастера, не осознавая их смысла).

Вот это по делу сказал, молодец. Еще что-нибудь сможешь?

> Обрати внимание - те применения, о которых я говорю, имеют одно общее свойство - код "плоский".

А ты, интеллектуал, так и не допер, что я говорю о других применениях?

> Зря не посмотрел. Это, всё ж таки, Дон Кнут, не какой либо хмырь с горы.

Посмотрю.

Ian ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.