Нельзя использовать goto

Часто говорят, что goto плох. А собственно, почему?

В ассемблерном коде на машинном уровне все управляющие конструкции (if, while, for и другие) преобразуются в набор команд с безусловным переходом jmp (UPD: как правильно заметили, с безусловным или условным переходом, но по указанному адресу, то есть куда угодно). А такой переход — самый настоящий goto. То есть ты весь такой изящный во фраке пишешь циклы, а наглый компилятор/интерпретатор выкидывает всю красоту и делает goto.

Так почему же сам goto является признаком плохого кода, если он на самом деле везде?

Ответ кроется в умении сохранять контекст. Человек может в голове держать 5-9 сущностей, больше не получается. Поэтому придумали функции, и придумали держать их небольшими — для снижения когнитивной сложности. Конструкция if переведёт тебя в одну из веток ниже, циклы for и while выполнят тело цикла или выбросят за его пределы. Команда goto сложность привносит — прыжок может быть куда угодно. А повышение сложности всегда приводит к росту числа ошибок.

Ну а ещё из-за goto может напасть <a href="https://pikabu.ru/story/nelzya_ispolzovat_goto_12583316?u=https%3A%2F%2Fxkcd.ru%2F292%2F&t=%D0%B2%D0%B5%D0%BB%D0%BE%D1%86%D0%B8%D1%80%D0%B0%D0%BF%D1%82%D0%BE%D1%80&h=b4fb4e894ae317dbd4e6f8aa8ca1f5e1ef76eee2" title="https://xkcd.ru/292/" target="_blank" rel="nofollow noopener">велоцираптор</a>

Ну а ещё из-за goto может напасть велоцираптор

Лига программистов

2K постов11.9K подписчиков

Правила сообщества

- Будьте взаимовежливы, аргументируйте критику

- Приветствуются любые посты по тематике программирования

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

Вы смотрите срез комментариев. Показать все
2
Автор поста оценил этот комментарий

Как уже ранее сказали. С херов переход безусловный ? Есть множество команд условного перехода, даже на асме. И программер сам решает, нужно ли ему стек сохранять или нет (Push. Pop). Разве что надо смотреть, что бы стек не переполнился.

раскрыть ветку (5)
0
Автор поста оценил этот комментарий

Угу, ошибся. Но что условный, что безусловный переход - это переход по адресу, то бишь goto

раскрыть ветку (4)
2
Автор поста оценил этот комментарий

Тут много нюансов может быть. Как пример ограничение размера сегмента памяти. Размер подпрограммы. Частота обращения к ней. К примеру JMP и ALMP имеет разный размер и выполняется по разному. И да, я осознаю что это другое в отличии от команды CALL.

У вас подмена понятий, в командах вы путаетесь.

Я в свое время писал на асме исключительно для серии Intel X51, и достаточно хорошо набил руку, что Си мне как бы и не нужен был.

раскрыть ветку (3)
0
Автор поста оценил этот комментарий

Ещё в конце студенческих лет меня поглотил python, поэтому на низком уровне у меня весьма и весьма скромный опыт. А ассемблере вообще околонулевой, только разок патчил чужой код, чтобы собрать проект на 64-битной машине (регистры менял)

Прошу прощения за некорректное упрощение

раскрыть ветку (2)
1
Автор поста оценил этот комментарий

Кхм, а у меня наоборот, дальше 16 бит не пошло =)))) Тем более защищенный режим.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

До сих пор хихикаю с легаси, что придумали 4 кольца защиты, а используют только 2))

Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку