singlepost

GoTo – За и Против << На главную или назад  

Много разговоров ходит вокруг безусловного перехода: мол, "не по-пацански это, использовать его", "всегда можно обойтись без него" и т.д…=) И тем не менее, в некоторых ситуациях это практически единственный вариант… например: выход сразу из нескольких вложенных циклов. Хотелось бы услышать мнения, по вашему опыту ухудшает ли производительность использование GoTo?

63 ответов в теме “GoTo – За и Против”

  1. 62
    Ленар Хайруллин ответил:

    лично я всегда стараюсь писать без goto. но не всегда удается. но не удается не потому что нет другого способа, а потому что влом расписывать ветки if/else

  2. 61
    Юрий Черезов ответил:

    незамарачиваитесь на том что юзать goto ни в коем случае нельзя, если ваш компилятор его поддерживает то невижу никаких препятствии.
    только
    1) нестоит им пользоваться очень часто, поскольку это деиствительно запутывает, усложняет чтение…
    2) непрыгать куда попало(между функцими например… если даже компилятор и поддерживает, то это просто ужасно). желательно чтобы метка и goto находились на одном экране…
    3) в некоторых языках есть другие аналоги безусловному переходу типа break и continue, их использование более логично, если есть возможность то конечно лучше использовать их вместо goto.

    ps всегда обхожусь без goto, хотя и у меня нет предрассудков по этому поводу, и я знаю что в некоторых случаях код получается более компактным и наглядным(можно даже сказать логичным)
    pss если в хелпе по языку не написано что нибудь типа "goto – оставлен для совместимости с предыдущими версими…" то все ОК

  3. 60
    Алексей Орлов ответил:

    Думаю что про хвостатую рекурсию все знают мо я даже при её рреализации на делфах идина ниразу не использооовал так что это не аргумент.

  4. 59
    Александр Потапенко ответил:

    К тем кто говорит "путает с скомпилированной версией", то есть для тех до кого туго доходит, объясню, что я привел всего лишь пример как исполняется код в скомпилированном виде. Те кто говорит про различия между jmp и goto, что с ними говорить, для них семантика важнее чем принцип. Выше я не говорил что нужно использовать оператор goto повсюдно, можно лишь в редких исключениях. Мой аргумент был хвостовая рекурсия, а не скомпилированный код. Кто не знает что это такое,тот только и может сказать что jmp это не goto.

  5. 58
    Геннадий Музыкантов ответил:

    GoTo переводиться как идти на …. или идти в …. или идти к ….
    Однозначно против использования такого злобного оператора.

  6. 57
    Глеб Сорокин ответил:

    Кхм… Позвольте вставить и свои три копейки.
    Да бытовало и дытует (может и по инерции) мнение что goto – это плохо.
    Пример с циклами приведенный в начале топика действительно не самый лучший, но это для Си и ко.

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

    Далее народ, думаю что asm тут еще помнят, и думаю помнят как организуется обыкновенный цикл на нем.
    если flaga то иди туда
    если ax = 15 то иди сюда
    и т.д.
    Так что как таковой goto есть и без него не обойтись.

  7. 56
    Леонид Максимов ответил:

    не понимаю, чем goto может существенно мешать оптимизации, кроме как создавая одну-единственную связь в графе исполнения (возможно с условием).

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

  8. 55
    Алексей Орлов ответил:

    Причём мои слова подкреплены чёткой, красивой, элегантной, математически строго доказанной теорией по данному поводу.

  9. 54
    Алексей Боголюбский ответил:

    GoTo очень затрудняет чтение программ, а к этому надо стремится…
    Можно все цыклы добавить в фкнкцию и выходить сразу из функции, как зависит на чем пишешь и с условием в цикле тоже отлицная идея…

  10. 53
    Алексей Орлов ответил:

    Не нада путать компилированную версию с исходным кодом. Я сомневаюсь что кто то в её ползает. То что делает компилятор с исходниками это совсем другая история. Да и какие компилиррованные фрагменты ты имеешь в виду? Нормальные компиляторы дают на выходе исполняемый машинный код. Если же ты про результат компиляции интерпритат (что нить типа пи кода) то эт совсем другая тема. Да и такие промежуточные коды нужны тока машине и она их подготавливает как ей угодно. Оставим это на совести разработчиков компилятора. А для анализа нормальных исходников goto кривой оператор.

  11. 52
    Алексей Орлов ответил:

    Нет и не может существовать нормальных веских доводов в пользу идина! Да и реальной пользы кроме гемора и лени от него никакой нет!

  12. 51
    Андрей Петров ответил:

    Никто сейчас не говорит про уже скомпилированный код. Я вынужден уже второй раз обращаться внимание, что на низком уровне нету ничего кроме ассемблерного jmp. Сейчас идет разговор о коде более-менее высокого уровня т.е. хотя бы Си. Там goto неприемлем. Goto в высокоуровневом коде – признак лени. Goto не ускоряет исполнение программы, а только затрудняет компилятору работу по оптимизации. В большинстве случаев программы с goto работают медленнее, чем без них. Я не знаю, какие доводы можно привести за goto, в чем его реальная польза?

  13. 50
    Александр Потапенко ответил:

    Есть случаи когда использование Goto уместно, например хвостовая рекурсия. Так что не надо говорить что оператор умер. Также, компилированная версия любого существенного фрагмента программного кода содержит сотни операторов Goto.

  14. 49
    Станислав Марков ответил:

    goto – бессмертен, и не надо считать чуваков из //www.zaebalo.com
    галимыми.
    goto не умрёт.

  15. 48
    Алексей Орлов ответил:

    Так что неодного весомого аргумента в ползу ИДИНА я для себя такне обноружил а посему ему давно поставлен вердикт ДОЛЖЕН УМЕРЕТЬ!!!!!

  16. 47
    Алексей Орлов ответил:

    Чем бейсик не угодил незнаю. Просто его ненавижу. Видимо сказываеться старая память. Хотя на спектруме в своё время на нём прикольные вещи писал. Но я вообще ненавижу разного рода интерпретаторы. И не нада дальше реплик что VB это не интерпретатор. Он таким былостался просо название поменялось на более красивое а суть и подход прежний. Вообще концепция средств разработки от мелкомягкого почему то заточена под интерпретаторы (как бы они это та не называли).А коменты тоже не всегда спасают да и их избыток начинает больше вредить чем помоогать загромождая код.

  17. 46
    Александр Золотаревский ответил:

    №46
    и возле бреков и континусов советую писать, шо дальше произойдётЪЪЪ
    // ИМХО

  18. 45
    Михаил Сергеевич ответил:

    #42
    Я когда пишу код, то пишу к нему коменты, чтобы не забыть и чтобы через некоторое время было проще разобраться…

    #43
    Чем вам всем бэйсик то неугодил? 0_о нормальный язык…

  19. 44
    Леонид Максимов ответил:

    #43, Алексей Орлов

    кстати, по поводу бейсика: в vb6 (и предыдущих) обработка ошибок либо построчная, либо goto (в соответствии с концепцией один вход – один выход).

    ЗЫ: еще Марк Твен подметил, что "go to" уже в шестом веке использовался в качестве насмешки.

  20. 43
    Алексей Орлов ответил:

    #37 респект!!!

  21. 42
    Алексей Орлов ответил:

    #25 я НЕНАВИЖУ бейсик но иногда приходиться на нём писат (курсач кому нить наклепать, репетиторство и т.д. и т.п.) и в нём (даже в старых версиях) я всегда с лёгкоостью обхожуть без ИДИНА… без усложнения кода и неплохой читаемости а для новичков как элемент синтаксиса он полюбому должен обясняться чтоб они могли читать чужие коды и не чесать репу типа чё за нах за такой. Но если человек его использует он для меня просто мега лузер (хотя я и сам не профессионал). #29 и #42 полностью с вами согласен. Во как в кайф сидеть и ломать мозг даже через месяц над тем как этот кусок кода работал. Зачастую даже коменты не помогают. Тем паче если в погине 4000-5000 тысяч строк кода (бывает такое извращение когданезя использовать библиотеки да и с разбивкой на модули париться не охота).

  22. 41
    Александр Золотаревский ответил:

    №41
    Главное, шоб самому себя за ламера не принять, вернувшись через пол-года к своей же проге… :-Р

  23. 40
    Михаил Сергеевич ответил:

    каждый пишет, как ему удобно… че демогогию то развели? а на счет того, что примут за ламера увидев GoTo, вот это отожгли =)))

  24. 39
    Андрей Паславский ответил:

    "представьте,что Вам попалась здоровая чужая программа со своей логикой, и Вам надо БЫСТРО ее подправить"
    гггг Рефакторинг рулит! Учите матчасть!!!
    У меня такие случае были не раз и легко обходился без goto

  25. 38
    Андрей Паславский ответил:

    2 Cyber Max
    Мне Мелкософт работы не давал. Я пишу мультиплатформенные проекты. На работе правда лиценхионку ХР поставили, а дома сижу под Debian

  26. 37
    Александр Золотаревский ответил:

    #37
    Натаха Mogilka
    17 ноя 2008 в 14:56
    ============
    Молодчина!!! +65536!!!
    ============
    А если надо быстро подправить чей-то код, не разбираясь долго, шо там написсано, то всегда дешевле поймать за шкварник автора и заплатить ему, шоб ето он сам здеалЪЪЪ… ИМХО (глубокое… и шоб нихто неслышалЪЪЪ))) :-Р

  27. 36
    Натаха Mogilka ответил:

    "быстро подправить" потому что "концепция поменялась" )))) забавное сочетание

    Ну, допустим, если действительно нужно быстро внести дополнения в уже существующий код, может, твой вариант и приемлем. Если это единичный случай

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

  28. 35
    Алексей Некрашенко ответил:

    Для тех, кто против GoTo – представьте,что Вам попалась здоровая чужая программа со своей логикой, и Вам надо БЫСТРО ее подправить (в дальнейшем она правиться скорее всего не будет), потому что "концепция поменялась", т. е. внести какую-нибудь новую ветку. Чем переписывать алгоритм старой программы – иногда проще добавить goto по условию иписать уже по ней новую логику. Сохраняется и старый подход и добавляются новые возможности.
    А по поводу красоты кода – уж очень это надумано самими програмистами. Заказчику главное, чтобы программа работала, ему пофиг, что там у Вас внутри. Если один это сделает за день, но "кривым способом", а другому понадобится месяц, но все будет "сверкать чистотой" – что выберет заказчик (при одинаковой видимости работы кода снаружи)?
    А самое фиговое, когда в пользу красоты или устоявшимся "правилам работы" в жертву приносятся скорость работы программы и удобство для пользователя.

  29. 34
    Александр Золотаревский ответил:

    Знаете, шо будет делать билгейтс в аду? – дебажить виндос… :-Р

  30. 33
    Cyber Max ответил:

    to Андрей φoίνιξ Паславский
    > ггг Вспомни Милениум XD

    Между прочим – эти ламеры, если ты их таковыми считаешьдали тебе, и всему остальному мируработу!!!
    + беда Милениума была на в goto.

  31. 32
    Андрей Паславский ответил:

    2 Cyber Max
    > Я конечно извиняюсь, но Вы код примеров драйверов в Microsoft DDK
    > видили? там очень даже встречается этот оператор – и я бы не сказал
    > что программеры Microsoft ламеры!
    ггг Вспомни Милениум XD

    2 Дмитрий Гайдамович
    Что ты понимаешь под "жутко ведь неструктурный он"???

    А вообще я уже 5 лет пишу на Java в области J2EE. За все это время не возникло ни разу мысли использовать goto. А если код запутан, проводите рефакторинг! ЗЫ кстати о рефакторинге: если в коде есть оператор goto, то чтобы провести рефакторинг Вам однозначно в первую очередь прийдеться избавиться от него

  32. 31
    DELETED DELETED ответил:

    Хотите получить бесплатно семизначный номер ICQ? Тогда вам сюда – //www.semiznak.net/index.php?ref=7znakfree

  33. 30
    Cyber Max ответил:

    to Максим Fallen Angel Донцов:
    > Не видел примеры таких программ, в которых его используют (в
    > современных)

    Вот народ пошел… Вы когда кнопки давите на клавиатуре вас обслуживает kbdclass.sys драйвер! Там тех goto…
    Мобилки подключаете через USB – работает USB to COM переходник – в итоге за дело берется serial.sys драйвер, там тоже goto немеренно.. даже в ISR (обработчике прерываний) продцерудах… Еще примеры нужны?
    Кто не верит – может посмотреть тут!
    %DDKDIR%\3790\src\…
    или в другом подобном DDK

  34. 29
    Mer Lin ответил:

    2 Alexander Cyborg Zubakov
    про такую фишку я тоже думал….но вы представляете сколько будет дополнительных проверок? у меня ооочень много проходов… поэтому я и спрашивал, будет ли оптимальным использовать GoTo именно с точки зрения производительности… А с точки зрения читабельности кода… я и так один пишу))) +комменты руляд))) главное чтоб работало быстрей!

  35. 28
    Андрей Петров ответил:

    goto – пережиток прошлого. Не следует его путать с jmp оператором асма! Асм низкоуровневый язык, там кроме jmp (jne, jnz и т.п.) ВООБЩЕ ничего другого нет условного, поэтому его там используют, но ТОЛЬКО внутри коротких кусков кода, иначе любая программа превращается в "написал и забыл" т.е. неподдерживаемую. Если вы встречаете goto в программах наязыках более высокого уровня то это либо _очень_старая_программа, либо программисту было лень думать, либо он недоучка :-\

    Вообще, один уважаемый мной человек говорил, что goto это как мат. Не следует разговаривать матом, но когда тебе на заводе роняют на ногу станок…

  36. 27
    Макс Донцов ответил:

    goto не бессмертен, он как таковой давно умер. Не видел примеры таких программ, в которых его используют (в современных)

  37. 26
    Артур Булакаев ответил:

    Брр, Есть такое понятие, как удобство чтения кода, да. Если вы работаете в огромной фирме, где вы пишете сотую часть одного модуля, и на основе вашего кода люди вникают, и пишут свой, то это дело одно…

    А есть такое понятие, как удобство его написания. Так вот, когда надо ,что бы программа работала, а кто её будет читать – пофигу*(А этот случай, ручаюсь, наиболее частый для тех, кто просматривает данную тему), то использование goto очень даже допустимо, в необходимых ситуациях.

  38. 25
    Олег Кириченко ответил:

    Goto Лучше не использовать, т.к. если в программах программирования более высокого уровня поставить выход из цикла при помощи GoTo или из других структур можно пропустить, например восстановление стёка, но если программа пишется на Assembler-е, то без них там бывает не обойтись(Goto аналогична команде Jmp в Assembler-е)…

  39. 24
    Александр Золотаревский ответил:

    "This is a road… to hell…" (c)
    (песня такая есть…)
    :-Р
    А исходный код ваще лучче никамУ не показывать, зачем снимать штаны перед заказчиками??? (ИМХО)

  40. 23
    Алексей Гридин ответил:

    А разве ваш брейк не есть тот же goto с заведомо заданной меткой перехода?
    И что значит для новичков? Если им про него не говорить, они и пользоваться не будут.
    Запутываемость кода при использованиии рассматриваемого оператора решается банальными комментарями. А других аргументов против как таковых и нет.

  41. 22
    Станислав Марков ответил:

    Vitaly ViLco Martynovich
    Да! я написал только что goto бессмертен, а ты прям выразил мою мысль))

  42. 21
    Vitaly Martynovich ответил:

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

  43. 20
    Алексей Орлов ответил:

    В современных языках он оставляеться тока для новичков и для совместимости со старыми версиями и даже в тех доке на язык большими буквами написанно что НЕ РЕКОМЕНДУЕТЬСЯ ИСПОЛЬЗОВАТЬ!!!!

  44. 19
    Алексей Орлов ответил:

    Я даже в том же бейсике (буть он трижды еладен!!!) без его без всякого напряга и усложнения кода обхожусь так что сама необходимость его существования для меня находиться под огромным вопросом.

  45. 18
    Макс Донцов ответил:

    №19 Верно, действительно написано. Мне это еще препод по С++ сказал 4 года назад

  46. 17
    Макс Донцов ответил:

    Goto must die, он ваще запутывает код, делает его нечитабельным для другого программера, ну а через некоторое время и для самого себя. Никогда не использовал и не собираюсь использовать этот оператор. Как здесь было сказано, и без него можно обойтись ,в чем я и убедился.

  47. 16
    Натаха Mogilka ответил:

    #14
    Очень правильно сказано. Никогда не использовала инструкции, подобные goto, в алгоритмах. Ну разве что только в пакетных файлах

  48. 15
    Дмитрий Гайдамович ответил:

    Не по-пацански, да. Хотя и неиспользование goto не даёт гарантии, что не будет "спагетти-кода". И наоборот, иногда применение goto резко упрощает запутанный кусок кода. Гуру применяют goto иногда, когда это оправдано.К примеру, в Си гуру его и оставили, потому что надо. Кстати, а давайте такой оператор как return обсудим, жутко ведь неструктурный он :)

  49. 14
    Алексей Орлов ответил:

    Goto должен умереть. Я им ВООБЩЕ не пользуюсь и живу счастливо. На той же делфи самый приметив выхода из цикла это БРЕЙК если несколько вложенных циклов то 1 флаг + брейк. На сях тоже пример был так что не надо лохматить бабушку и втирать что без него некуда. Даже математически строго дооказано что без его можно жить припеваючи а практика подтверждает теорию.

  50. 13
    Alexander Zubakov ответил:

    Серега -<CJ>- Губченко, все обходятся, а вам не обойтись. try catch/except существует для этого.

    По поводу ситуации с циклами:

    //признак выхода из циклов
    var endLoop = false;

    for (var i1 = 0; i < count1 && !endLoop; i1++) {
    ….for (var i2 = 0; i2 < count2 && !endLoop; i2++) {
    ……..for (var i3 = 0; i3 < count3 && !endLoop; i3++) {
    …………for (var i4 = 0; i4 < count4 && !endLoop; i4++) {
    …………….//если надо выйти из всех циклов, делаем так:
    …………….endLoop = true;
    …………}
    ……..}
    ….}
    }

    В чем преимущества такого подхода? А в том, что когда я смотрю на эту чудовищную конструкцию, я сразу вижу, что из этих циклов возможен досрочный выход. И этот досрочный выход произойдет, если переменная endLoop пример значение true. Если я буду искать, где же в программе такое присваивание, я быстро пойму, при каких обстоятельствах осуществляется досрочный выход.

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

  51. 12
    Марина Гаврилина ответил:

    О плюсах и минусах goto легко найти в гугле. А вообще согласна с Стас vs Черняков. Абсолютно в любых ситуациях можно обойтись без него. Если тебе нужно выйти из нескольких циклов сразу, то пересмотри свой алгоритм, скорее всего его можно значительно упростить.

  52. 11
    Серега Губченко ответил:

    Без Goto, например, в процессе обработке ошибок никак не обойтись!!!

  53. 10
    Cyber Max ответил:

    > to Стас vs Черняков

    > Но даже если ты используешь его для повышения эффективности своей
    > проги, все равно никому не показывай ее текст, т.к. любой опытный
    > программер, увидев оператор goto, сразу примет тебя за ламера

    Я конечно извиняюсь, но Вы код примеров драйверов в Microsoft DDK видили? там очень даже встречается этот оператор- и я бы не сказал что программеры Microsoft ламеры!
    Не стоит им злоупотреблять, но и говорить что если человек написал его – он плохой программер!!!

  54. 9
    Подмогаев Свят ответил:

    прошу прощение за,может быть, глупый вопрос,но чем координально отличается GoTo от,скажем,вызова какой-нибудь процедуры?

  55. 8
    Алексей Гридин ответил:

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

  56. 7
    Станислав Марков ответил:

    goto жив, и бессмертен

  57. 6
    Mer Lin ответил:

    Аргументы в студию! Как обойтись без GoTo в приведенном примере с циклами?
    В принципе….. можно! Но это будут такие танцы с бубнами….. причем с увеличением кол-ва циклов будет расти и количество бубнов!

  58. 5
    Леонид Максимов ответил:

    нафиг-нафиг. просто если вышел из цикла досрочно, то смотри причину. никаких танцев с бубнами.

  59. 4
    Леонид Максимов ответил:

    кстати, а зачем выходить сразу из нескольких циклов? может быть эти несколько циклов стоит поместить в отдельную функцию и выходить из нее?

  60. 3
    Леонид Максимов ответил:

    по поводу производительности: без jmp & co вы программу вряд ли напишете. а даже если и напишете, то она будет медленее – вызовы выполняются дольше.

  61. 2
    Mer Lin ответил:

    этот вариант я рассматривал, там не все так просто, тем более вызов дополнительных процедур снижает производительность, для меня это самое критичное… и вообще вопрос был как раз касательно ухудшения производительности, а не "использовать или нет"=)

  62. 1
    Стас Черняков ответил:

    хотелось написать goto holywarrr но это даже не холивар

    Давно доказано, что без этого оператора можно обойтись в любой ситуации. Его использование ухудшает читаемость программы и увеличивает код. Но даже если ты используешь его для повышения эффективности своей проги, все равно никому не показывай ее текст, т.к. любой опытный программер, увидев оператор goto, сразу примет тебя за ламера
    © ][

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.