goto vs ...
label 1;
var i:integer;
begin
prost:=true;
for i:=2 to num div 2 do
if num mod i = 0 then begin prost:=false; goto 1 end;
1:
end;
Не понял? А какая необходимость goto в if втыкать.
Во-первых там можно break поставить (выход из цикла).
Во-вторых там вообще надо уже exit'ом из ф-и выходить.
P.S. Это так - к слову.
Вот нам и ответ, почему о быстродействии говорить неправильно.
Вдумчиво читаем Вирта
Пример в студию, плиз.
Дело в том, что ООП вносит путаницу при неграмотном проектировании, а goto - всегда.
Во-первых, его код не есть доказательсво утверждения, что goto не равно jmp, т.к. компилятор увидев недоступный код ( вызов нескольких f(); ), вырезал его, затем увидел, что goto прыгает на след. за ним же инструкцию и его тоже вырезал. В таких случаях можно утвержать, что и любая конструкция, нарушающая последовательность выполнение программы, типа if, while и т.д., не использует хотя бы одного jmp, т.к. и ее компилятор может вырезать. Поэтому для начала давайте не брать в расчет программы, где есть недоступный код, потому что это проблема не goto.
Во-вторых, давайте рассуждать логически.. Код программы на любом языке транслируется в последовательный набор комманд. Т.е. если одна инструкция идет в исходном коде после другой, то компилятор откомпилирует эти инструкции в том же порядке.
И уж никак по другому. Последовательность сохраняется. И если мне нужно перепрыгнуть первую инструкцию или вернуться назад, с помощью goto, то кроме как jmp это не сделать. Любое нарушение последовательности выполнения (если это не вызов функции) реализуется с помощью jmp (или аналогичных комманд других машин).
К вопросу о читабельности я привёл пример из MSDN на C#. Вроде бы всё понятно, и читается легко. Однако легко ли навскидку сказать, сколько будет стоить кофе в случае 3? В этом примере несложно, поскольку лёгкий пример.
Пример из MSDN дебильнее того, что я привел, хотя бы потому что меток больше. Для данной задачи использование goto не рационально и ухудшает читабельность.
Проанализируйте мой код, пожалуйста. В чем плоха его читабельность?
Еще раз, я не призываю везде использовать goto. А говорю, что есть ситуации, когда его использование возможно, при этом не ухудшается читабельность, и есть задачи, которые с его помощью решаются даже проще и понятнее.
Пример в студию, плиз.
Дело в том, что ООП вносит путаницу при неграмотном проектировании, а goto - всегда.
Пример был приведен несколько раз: ЛА, СА и МТ. И кстати гововря, в них ой как важна производительность.
А еще, практика показывает, что в холиваре никто никогда не побеждал. :D
Общий поиск по каталогу слов goto выдал 669 файлов. Большинство там файлов с расширением c и h, но есть 17 файлов с расширением cc, в которых c++ код и там, реализована инструкция goto.
Вы извините, код приводить не буду, много получится. Но если есть желание, качайте и посмотрите сами.
Если бы была МАТЕМАТИЧЕСКИ ДОКАЗАНА неэффективность goto, то про него уже давно забыли бы.....
Если есть, значит надо..... если есть инструмент, так какого черта им не пользоваться? (не поверите как бесит отверткой RJ-45 обжимать)
Сишком элементарный пример, чтоб он ещё был и нечитабельным.
Но я конкретно показал, как goto стал явным сигналом плохой структурированности.
Наш диалог превращается в анализ моего кода с точки зрения парадигмы, что goto - зло. Goto - зло, когда им злоупотребляют. Я пытаюсь показать, что goto читабельность не ухудшает. Почувствуйте разницу.
А я пытаюсь показать, что goto появляется там, где архитектурное решение зашло в тупик и что goto на производительность не влияет.
Но при вызове обычной функции обязательно выполниться как минимум один call и один ret.
А что значит "обычной"? :)
Вы сами себе яму роете, не проводите жесткой аналогии между ЯВУ и генерируемым кодом.
Кстати говоря, большинство компиляторов делают единую точку выхода, т.о. все return в функции - это теже самые jmp.
Предложте более элегантное решение. Популязировать чужие парадигмы и я могу, а что толку?
Более элегантные решения чего?
При чем тут популизация?
Я вам привел одну задачу, где оно оправдано. Вы с ней знакомы?
Нет. И что? Где оправдание?
Я могу привести огромное количество обратных примеров.
Обработка ошибок с использованием GOTO
Без использования GOTO
Что скажете, мистер Green? Так что приношу самому себе же свои глубочайшие извинения. Я всё-таки был прав.
Скажу, что вы просто не умеете писать нормальный код без goto. :)
Да можно и др. код привести, дело то не в нем, а в разнице в производительности. Ты что-то перестал упоминать, что return - это ret. Т.е. уже согласен, что это не так?
Ты будешь удивлен, но while, if, for тоже могут быть совсем без jmp, при этом ничего не вырезая.
P.S. Объясни мне, что значит "недоступный код" ?
Во-вторых, давайте рассуждать логически.. Код программы на любом языке транслируется в последовательный набор комманд. Т.е. если одна инструкция идет в исходном коде после другой, то компилятор откомпилирует эти инструкции в том же порядке.
Не факт
И уж никак по другому. Последовательность сохраняется. И если мне нужно перепрыгнуть первую инструкцию или вернуться назад, с помощью goto, то кроме как jmp это не сделать. Любое нарушение последовательности выполнения (если это не вызов функции) реализуется с помощью jmp (или аналогичных комманд других машин).
А с чего ты взял, что тебе "нужно перепрыгнуть" с помощью goto? :)
Общий поиск по каталогу слов goto выдал 669 файлов. Большинство там файлов с расширением c и h, но есть 17 файлов с расширением cc, в которых c++ код и там, реализована инструкция goto.
Вы извините, код приводить не буду, много получится. Но если есть желание, качайте и посмотрите сами.
Дедуля, кто тебе сказал, что примеры являются доказательством?
А уж тем более OpenSource.
Боги горшки обжигают?
Если бы была МАТЕМАТИЧЕСКИ ДОКАЗАНА неэффективность goto, то про него уже давно забыли бы.....
Если есть, значит надо..... если есть инструмент, так какого черта им не пользоваться? (не поверите как бесит отверткой RJ-45 обжимать)
Есть куча инструмента, которым пользоваться можно, но не следует.
Вы как-будто телемагазин никогда не смотрели... :)
"Есть, значит надо" - это не аргумент. Есть такая вещь, как РУДИМЕНТ.
Для меня goto - сигнал, симптом плохой реализации.
Применять или не применять - ваше дело. Спорить можно долго.
Я не применяю и не вижу конкретных примеров, где он НЕОБХОДИМ или хотя бы предпочтительнее.
По поводу же производительности - другое дело. Здесь я настаиваю, что goto в общем случае не влияет на производительность. А в частных случиях можно показать как одно, так и обратное.
Что же касается соответствия ЯВУ и скомпиленного кода, не затачивайтесь на этом, это слишком специфичный к конкретному частному случаю вопрос, чтоб приводить код, как доказательство.
Кроме того, рассматривать оптимизацию на таком уровне можно опять же только на конкретном частном случае. В общем случае говорить об такой оптимизации - просто бред. А ставить такую оптимизацию в противовес читабельности и структурированности кода - просто глупо. Вы же знаете, с чего начинается процесс оптимизации... ;)
боюсь, что while неплохо заменяет for.... может это тоже рудимент?:)
В конце концов хороша та программа, которая работает...
красота(читабельность) кода...хм...
тогда арифметику с указателями запретить....
как впрочем и сами указатели...
в общем переходим на РНР.... (там вроде и goto нету)
Дедуля, кто тебе сказал, что примеры являются доказательством?
А уж тем более OpenSource.
Боги горшки обжигают?
Дедуля просто показал что goto используется в реальных проектах. А сравнивать качество open source проектов и коммерческих я вообще не буду. Примеров за и против очень много. Например тот же сервер Apache - очень хорошая штука да и вообще хороших штук много бесплатных с открытым кодом. А иные коммерческие продукты имеют такое качество, что их на помойку сразу....
Т.е. вы признаете, что в данном случае goto читабельность не ухудшает. Что и требовалось доказать.
Вы лишь сказали это. goto в моем примере не нарушает ни одного из тех пунктов, в которых его обвиняют.
Я привел пример КА, в которых это эфективное и эллегантное решение. И вы эту тему игнорируете. Вызов обычной (см. ниже) функции выполняется дольше, чем один переход по адресу и с этим, надеюсь, спорить никто не будет.
При чем тут популизация?
Приведите более элегантную реализацию СА и МТ.
А популяризируете вы идею абсолютной ненужности goto, и эту идею не вы придумали, значит популяризируете чужую идею.
Под обычной я понимаю функцию, которая может вызвать себя рекурсивно.
Вы сами себе яму роете, не проводите жесткой аналогии между ЯВУ и генерируемым кодом.
Ассемблер был приведен в качастве примера. Большинство современных машин, как реальных, так и виртуальных, поддерживают схожие инструкции. И не важно какова машина вызов функции, выполнее ее кода и возврат занимает больше времени, чем переход на адрес и выполнение кода по нему.
Я не говорю, что есть жесткая аналогия. Где вы это увидели?
Я говорю, что при вызове обычной функции используется оператор call, а при возврашении ret. А goto либо пораждает один jmp, либо вообще ничего. Итого имеем:
время(call+ret) > время(jmp).
Кстати говоря, большинство компиляторов делают единую точку выхода, т.о. все return в функции - это теже самые jmp.
Т.е. получается jmp+ret, т.е. еще дольше. :D
Нет. И что? Где оправдание?
Чтобы это понять, нужно попытаться решить эту задачу. Иначе любые мои доводы будут утыкаться в идею ненужности goto.
Я могу привести огромное количество обратных примеров.
Ну и что? Эти примеры не доказывают факт абсолютной ненужности goto.
См. предыдущий мой пост.
Ты будешь удивлен, но while, if, for тоже могут быть совсем без jmp, при этом ничего не вырезая.
Не буду. Но при чем здесь goto? Я не призываю с помощью него делать циклы, которые компилятор может развернуть.
P.S. Объясни мне, что значит "недоступный код" ?
Это код, который никогда не получит управления. Его нормальные компиляторы вырезают или хотя бы ругаются на него.
Не факт
Ну-ка пример.
А с чего ты взял, что тебе "нужно перепрыгнуть" с помощью goto? :)
Допустим у меня есть такая задача. Ее я привел, но вы к сожалению с ней не знакомы. :D
Я не применяю и не вижу конкретных примеров, где он НЕОБХОДИМ или хотя бы предпочтительнее.
Но это не значит, что таких задач нет.
Дедуля, кто тебе сказал, что примеры являются доказательством?
А уж тем более OpenSource.
Боги горшки обжигают?
гы... заглянул в исходники одного из лучших на сегодня HTTP серверов - nginx'а от Игоря Сысоева. на 87560 строчек кода goto встречается 302. О чем это говорит? ни о чем. вообще. Green, не надо быть настолько категоричным :) да, в подавляющем большинстве случаев можно обойтись без goto. да, при неправильном использовании goto снижает читабельность программы. но это не значит что goto можно хоронить, или что использующие goto - ламеры и корявые кодописатели.
вообщем, тему закрываю и в Гостевую не переношу, захотите сами там создадите продолжение, мусорить не надо. всем спасибо за внимание.
P.S. было интересно наблюдать:)