И что самое "парадоксальное" - процессоры не могут обойтись без инструкций безусловного перехода.
Даже тривиальная загрузка x86 и инициализация BIOS начинается с банального far jmp по ffff:f0
«GOTO or not GOTO?» – эпизод очередной22.11.15 09:43 Автор: Vedrus <Serokhvostov Anton> Статус: Member Отредактировано 22.11.15 09:48 Количество правок: 4
Несколько лет назад я поднимал здесь подобную тему («Оправдано ли использование GOTO в струтурированных программах?»). Такую же тему я поднимал и на других форумах. Сейчас систематизировал все все «за» и «против», вот в этой статье на хабрахабре: «GOTO or not GOTO – вот в чём вопрос». Однако технологии не стоят на месте, наверняка по вопросу GOTO существуют новые мнения. Хотелось бы обсудить их, и потом, году так в 2018 – в честь 50-летнего юбилея спора по GOTO – новое резюме представить. Итак, приглашаю в дискуссию – для последующей систематизации всех «за» и «против» относительно актуальности GOTO. Перед тем как высказаться, пожалуйста, ознакомьтесь с моей статьёй на хабрахабре, – чтобы уже существующие аргументы из обсуждения исключить.
Вообще-то от языка зависит.
Старые языки не имели конструкций, позволяющих обойтись без GOTO.
Ни на Ассемблере, ни на Фортране, ни на Бэйсике не написать что-то разумного размера и сложности (расчет по формулам не в счет) без безусловного перехода.
На Сях это реально. Правда иногда затягивает и даже простую конструкцию выхода из вложенного цикла начинаешь реализовывать хуже, чем с GOTO.
Сначала я проголосовал. Потом прочитал мнения. Теперь пишу. Потом почитаю статьи, хотя, предчувствую, что ничего нового в них не найду.
Не совсем точно поставлены вопросы для голосования.
"Использование GOTO – признак кривизны кода" - вся фишка в том, что если язвк не пзволяет без GOTO красиво написать, то это не кривизна кода, а кривизна языка.
"Есть ситуации, оправдывающие использование GOTO" - никто не будет отрицать, но это не "довод в пользу", поскольку это не противоположность предыдущему утверждению.
"Нет смысла обсуждать – единого мнения никогда не будет" - смысл есть всегда и во всем, только он может быть видим или не видим даже при тщательном его поиске.
И что самое "парадоксальное" - процессоры не могут обойтись...30.11.15 23:51 Автор: Den <Денис Т.> Статус: The Elderman
И что самое "парадоксальное" - процессоры не могут обойтись без инструкций безусловного перехода.
Даже тривиальная загрузка x86 и инициализация BIOS начинается с банального far jmp по ffff:f0
GOTO бывает полезен в некоторых механизмах обработки ошибок,...23.11.15 11:13 Автор: Den <Денис Т.> Статус: The Elderman Отредактировано 23.11.15 15:22 Количество правок: 1
GOTO бывает полезен в некоторых механизмах обработки ошибок, когда программа, вместо того, чтобы использовать throw, выставляет код ошибки в переменной и осуществляется переход на обработчик ошибок по goto. Такой механизм может быть особенно актуален в системах реального времени, когда не хочется перегружать код обработчиком исключений try/catch с раскручиванием стека и накладными расходами на call/ret.
в принципе, в большинстве случаев это эквивалентно простому вываливанию из функции с кодом ошибки23.11.15 19:54 Автор: dl <Dmitry Leonov>
> GOTO бывает полезен в некоторых механизмах обработки > ошибок, когда программа, вместо того, чтобы использовать > throw, выставляет код ошибки в переменной и осуществляется > переход на обработчик ошибок по goto. Такой механизм может > быть особенно актуален в системах реального времени, когда > не хочется перегружать код обработчиком исключений > try/catch с раскручиванием стека и накладными расходами на > call/ret.
Ну вот разве что. Хотя мне сложно представить современную программу, в которой экономят на call (в плюсах, если что, можно взять inline). try/catch - да, там все запущенней, но чтобы и тут выграть на goto, нужно совершенно огромный код запихнуть в одну логическую единицу.
у goto есть только два реальных оправдания22.11.15 15:14 Автор: dl <Dmitry Leonov>
первое - группа ситуаций, которые в большинстве современных языков решается break/continue, являющимися завуалированными безопасными goto.
второе - автоматически сгенерированный код, который людям не править.
Равно как и catch блока try является завуалированным...23.11.15 11:03 Автор: Den <Денис Т.> Статус: The Elderman