Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

goto vs ...

21K
02 января 2007 года
kerdan
18 / / 27.12.2006
Цитата: nilbog
можно фунцию ввести которая проверяет просто число или нет
 
Код:
function prost(num:integer):boolean;
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. Это так - к слову.

Страницы:
241
01 августа 2007 года
Sanila_san
1.6K / / 07.06.2005
Цитата: aks
А если еще код или часть кода пишется исходя из того что он будет работать на разных аппаратных платформах (а большинство ЯВУ это позволяют), то о каком вобще отображении кода на ассемблер конкретного железа может идти речь? )

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

5.7K
01 августа 2007 года
Vedrus
49 / / 29.10.2006
Короче, действительно, нет смысла спорить с религиозными людьми. Присоединяюсь к squirL и newonder. Мужики! Щас пива с сухарями поднесу, а то поди уже всё выпили? Место в первом ряду ещё осталось?
26K
01 августа 2007 года
newonder
12 / / 31.07.2007
Ага, осталось. :) Обстановка накаляется.
241
01 августа 2007 года
Sanila_san
1.6K / / 07.06.2005
Цитата: newonder
Если вы пишете на делфе какую-нить прогу, то там да, возможно goto не нужен, но зачем заявлять что goto это зло? Есть задачи (обратим свой взгляд на КА) где без goto ну никак не обойтись.


Вдумчиво читаем Вирта

Цитата: newonder
А эта область достаточно востребованная. Да вы и сами программируете на АЯВУ, в коде которых есть эти самые goto. Это тоже самое что спорить что ООП - это панацея от всех бед. Для каждой задачи есть своё решение, и если, извините меня, через ж... делать, то вы сделаете, и можете себе медальку вешать на грудь, но ваш подход просто покажет вашу ограниченность и неспособность адекватно оценивать ситуацию и поставленную задачу.

Пример в студию, плиз.
Дело в том, что ООП вносит путаницу при неграмотном проектировании, а goto - всегда.

353
01 августа 2007 года
Nixus
840 / / 04.01.2007
Цитата: Sanila_san
Вдумчиво смотрим disassembly, любезно опубликованную тов. Green 30.07.2007 в 06:57. После вдумчивого разглядывания кода расскажите мне, где и как goto влияет на производительность? Сказано же: goto <> jmp. Ясно, что при написании кода на ЯВУ нельзя заранее предсказать, как он будет отображён в машинные коды. Если же речь идёт о таких вещах, как Java или .Net, то тут вообще невозможно определить результат отображения. Как в этом случае можно рассуждать о производительности?


Во-первых, его код не есть доказательсво утверждения, что goto не равно jmp, т.к. компилятор увидев недоступный код ( вызов нескольких f(); ), вырезал его, затем увидел, что goto прыгает на след. за ним же инструкцию и его тоже вырезал. В таких случаях можно утвержать, что и любая конструкция, нарушающая последовательность выполнение программы, типа if, while и т.д., не использует хотя бы одного jmp, т.к. и ее компилятор может вырезать. Поэтому для начала давайте не брать в расчет программы, где есть недоступный код, потому что это проблема не goto.
Во-вторых, давайте рассуждать логически.. Код программы на любом языке транслируется в последовательный набор комманд. Т.е. если одна инструкция идет в исходном коде после другой, то компилятор откомпилирует эти инструкции в том же порядке.
И уж никак по другому. Последовательность сохраняется. И если мне нужно перепрыгнуть первую инструкцию или вернуться назад, с помощью goto, то кроме как jmp это не сделать. Любое нарушение последовательности выполнения (если это не вызов функции) реализуется с помощью jmp (или аналогичных комманд других машин).

Цитата: Sanila_san

К вопросу о читабельности я привёл пример из MSDN на C#. Вроде бы всё понятно, и читается легко. Однако легко ли навскидку сказать, сколько будет стоить кофе в случае 3? В этом примере несложно, поскольку лёгкий пример.


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

353
01 августа 2007 года
Nixus
840 / / 04.01.2007
Цитата: Sanila_san

Пример в студию, плиз.
Дело в том, что ООП вносит путаницу при неграмотном проектировании, а goto - всегда.


Пример был приведен несколько раз: ЛА, СА и МТ. И кстати гововря, в них ой как важна производительность.

А еще, практика показывает, что в холиваре никто никогда не побеждал. :D

26K
01 августа 2007 года
newonder
12 / / 31.07.2007
Хех...заставили таки дедушку на сцену вылезти.Ради вас скачал исходники gcc-4.0
Общий поиск по каталогу слов goto выдал 669 файлов. Большинство там файлов с расширением c и h, но есть 17 файлов с расширением cc, в которых c++ код и там, реализована инструкция goto.
Вы извините, код приводить не буду, много получится. Но если есть желание, качайте и посмотрите сами.
314
01 августа 2007 года
fanto
374 / / 15.02.2003
Да вы с ума сошли....
Если бы была МАТЕМАТИЧЕСКИ ДОКАЗАНА неэффективность goto, то про него уже давно забыли бы.....
Если есть, значит надо..... если есть инструмент, так какого черта им не пользоваться? (не поверите как бесит отверткой RJ-45 обжимать)
26K
01 августа 2007 года
newonder
12 / / 31.07.2007
Поверим. А ещё хуже иголкой RJ-45 разжимать. Можешь мне поверить, у меня потом пальцы два дня болели. Начальство экономило. :(
3
01 августа 2007 года
Green
4.8K / / 20.01.2000
Цитата: Nixus
Вы так и не объяснили, почему goto в том случае делает программу менее читабельной. И каков критерий аккуратности.


Сишком элементарный пример, чтоб он ещё был и нечитабельным.
Но я конкретно показал, как goto стал явным сигналом плохой структурированности.

Цитата: Nixus

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


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

Цитата: Nixus

Но при вызове обычной функции обязательно выполниться как минимум один call и один ret.


А что значит "обычной"? :)
Вы сами себе яму роете, не проводите жесткой аналогии между ЯВУ и генерируемым кодом.

Кстати говоря, большинство компиляторов делают единую точку выхода, т.о. все return в функции - это теже самые jmp.

Цитата: Nixus

Предложте более элегантное решение. Популязировать чужие парадигмы и я могу, а что толку?


Более элегантные решения чего?
При чем тут популизация?

Цитата: Nixus

Я вам привел одну задачу, где оно оправдано. Вы с ней знакомы?


Нет. И что? Где оправдание?
Я могу привести огромное количество обратных примеров.

Цитата: Vedrus
А всё-таки насчёт return'а я был прав! Смотрите код:
Обработка ошибок с использованием GOTO
 
Код:
// Хреновый код с goto

Без использования GOTO
 
Код:
// Еще более хреновый код без goto

Что скажете, мистер Green? Так что приношу самому себе же свои глубочайшие извинения. Я всё-таки был прав.


Скажу, что вы просто не умеете писать нормальный код без goto. :)

3
01 августа 2007 года
Green
4.8K / / 20.01.2000
Цитата: Nixus
Во-первых, его код не есть доказательсво утверждения, что goto не равно jmp, т.к. компилятор увидев недоступный код ( вызов нескольких f(); ), вырезал его, затем увидел, что goto прыгает на след. за ним же инструкцию и его тоже вырезал. В таких случаях можно утвержать, что и любая конструкция, нарушающая последовательность выполнение программы, типа if, while и т.д., не использует хотя бы одного jmp, т.к. и ее компилятор может вырезать. Поэтому для начала давайте не брать в расчет программы, где есть недоступный код, потому что это проблема не goto.


Да можно и др. код привести, дело то не в нем, а в разнице в производительности. Ты что-то перестал упоминать, что return - это ret. Т.е. уже согласен, что это не так?

Ты будешь удивлен, но while, if, for тоже могут быть совсем без jmp, при этом ничего не вырезая.

P.S. Объясни мне, что значит "недоступный код" ?

Цитата: Nixus

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


Не факт

Цитата: Nixus

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


А с чего ты взял, что тебе "нужно перепрыгнуть" с помощью goto? :)

Цитата: newonder
Хех...заставили таки дедушку на сцену вылезти.Ради вас скачал исходники gcc-4.0
Общий поиск по каталогу слов goto выдал 669 файлов. Большинство там файлов с расширением c и h, но есть 17 файлов с расширением cc, в которых c++ код и там, реализована инструкция goto.
Вы извините, код приводить не буду, много получится. Но если есть желание, качайте и посмотрите сами.


Дедуля, кто тебе сказал, что примеры являются доказательством?
А уж тем более OpenSource.
Боги горшки обжигают?

Цитата: fanto
Да вы с ума сошли....
Если бы была МАТЕМАТИЧЕСКИ ДОКАЗАНА неэффективность goto, то про него уже давно забыли бы.....
Если есть, значит надо..... если есть инструмент, так какого черта им не пользоваться? (не поверите как бесит отверткой RJ-45 обжимать)


Есть куча инструмента, которым пользоваться можно, но не следует.
Вы как-будто телемагазин никогда не смотрели... :)

"Есть, значит надо" - это не аргумент. Есть такая вещь, как РУДИМЕНТ.

3
01 августа 2007 года
Green
4.8K / / 20.01.2000
А теперь по существу спора.

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

По поводу же производительности - другое дело. Здесь я настаиваю, что goto в общем случае не влияет на производительность. А в частных случиях можно показать как одно, так и обратное.
Что же касается соответствия ЯВУ и скомпиленного кода, не затачивайтесь на этом, это слишком специфичный к конкретному частному случаю вопрос, чтоб приводить код, как доказательство.

Кроме того, рассматривать оптимизацию на таком уровне можно опять же только на конкретном частном случае. В общем случае говорить об такой оптимизации - просто бред. А ставить такую оптимизацию в противовес читабельности и структурированности кода - просто глупо. Вы же знаете, с чего начинается процесс оптимизации... ;)
314
01 августа 2007 года
fanto
374 / / 15.02.2003
Цитата: Green
Есть такая вещь, как РУДИМЕНТ.



боюсь, что while неплохо заменяет for.... может это тоже рудимент?:)
В конце концов хороша та программа, которая работает...
красота(читабельность) кода...хм...
тогда арифметику с указателями запретить....
как впрочем и сами указатели...
в общем переходим на РНР.... (там вроде и goto нету)

26K
01 августа 2007 года
newonder
12 / / 31.07.2007
Цитата: Green

Дедуля, кто тебе сказал, что примеры являются доказательством?
А уж тем более OpenSource.
Боги горшки обжигают?



Дедуля просто показал что goto используется в реальных проектах. А сравнивать качество open source проектов и коммерческих я вообще не буду. Примеров за и против очень много. Например тот же сервер Apache - очень хорошая штука да и вообще хороших штук много бесплатных с открытым кодом. А иные коммерческие продукты имеют такое качество, что их на помойку сразу....

353
01 августа 2007 года
Nixus
840 / / 04.01.2007
Для тех, кто не понял. Еще раз. Я тоже считаю, что болшинство вычислительных задач можно и нужно решать не применяя goto. Но большинство это не все. И говорить о его ненужности - в корне не верно.

Цитата: Green
Сишком элементарный пример, чтоб он ещё был и нечитабельным.


Т.е. вы признаете, что в данном случае goto читабельность не ухудшает. Что и требовалось доказать.

Цитата: Green
Но я конкретно показал, как goto стал явным сигналом плохой структурированности.


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

Цитата: Green
А я пытаюсь показать, что goto появляется там, где архитектурное решение зашло в тупик и что goto на производительность не влияет.


Я привел пример КА, в которых это эфективное и эллегантное решение. И вы эту тему игнорируете. Вызов обычной (см. ниже) функции выполняется дольше, чем один переход по адресу и с этим, надеюсь, спорить никто не будет.

Цитата: Green
Более элегантные решения чего?
При чем тут популизация?


Приведите более элегантную реализацию СА и МТ.
А популяризируете вы идею абсолютной ненужности goto, и эту идею не вы придумали, значит популяризируете чужую идею.

Цитата: Green
А что значит "обычной"? :)


Под обычной я понимаю функцию, которая может вызвать себя рекурсивно.

Цитата: Green

Вы сами себе яму роете, не проводите жесткой аналогии между ЯВУ и генерируемым кодом.


Ассемблер был приведен в качастве примера. Большинство современных машин, как реальных, так и виртуальных, поддерживают схожие инструкции. И не важно какова машина вызов функции, выполнее ее кода и возврат занимает больше времени, чем переход на адрес и выполнение кода по нему.
Я не говорю, что есть жесткая аналогия. Где вы это увидели?
Я говорю, что при вызове обычной функции используется оператор call, а при возврашении ret. А goto либо пораждает один jmp, либо вообще ничего. Итого имеем:
время(call+ret) > время(jmp).

Цитата: Green

Кстати говоря, большинство компиляторов делают единую точку выхода, т.о. все return в функции - это теже самые jmp.


Т.е. получается jmp+ret, т.е. еще дольше. :D

Цитата: Green

Нет. И что? Где оправдание?


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

Цитата: Green

Я могу привести огромное количество обратных примеров.


Ну и что? Эти примеры не доказывают факт абсолютной ненужности goto.

353
01 августа 2007 года
Nixus
840 / / 04.01.2007
Цитата: Green
Да можно и др. код привести, дело то не в нем, а в разнице в производительности. Ты что-то перестал упоминать, что return - это ret. Т.е. уже согласен, что это не так?


См. предыдущий мой пост.

Цитата: Green

Ты будешь удивлен, но while, if, for тоже могут быть совсем без jmp, при этом ничего не вырезая.


Не буду. Но при чем здесь goto? Я не призываю с помощью него делать циклы, которые компилятор может развернуть.

Цитата: Green

P.S. Объясни мне, что значит "недоступный код" ?


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

Цитата: Green

Не факт


Ну-ка пример.

Цитата: Green

А с чего ты взял, что тебе "нужно перепрыгнуть" с помощью goto? :)


Допустим у меня есть такая задача. Ее я привел, но вы к сожалению с ней не знакомы. :D

353
01 августа 2007 года
Nixus
840 / / 04.01.2007
Цитата: Green

Я не применяю и не вижу конкретных примеров, где он НЕОБХОДИМ или хотя бы предпочтительнее.


Но это не значит, что таких задач нет.

2
01 августа 2007 года
squirL
5.6K / / 13.08.2003
Цитата: Green

Дедуля, кто тебе сказал, что примеры являются доказательством?
А уж тем более OpenSource.
Боги горшки обжигают?


гы... заглянул в исходники одного из лучших на сегодня HTTP серверов - nginx'а от Игоря Сысоева. на 87560 строчек кода goto встречается 302. О чем это говорит? ни о чем. вообще. Green, не надо быть настолько категоричным :) да, в подавляющем большинстве случаев можно обойтись без goto. да, при неправильном использовании goto снижает читабельность программы. но это не значит что goto можно хоронить, или что использующие goto - ламеры и корявые кодописатели.

353
01 августа 2007 года
Nixus
840 / / 04.01.2007
А вообще методом Green'а можно доказывать, что можно убрать нафиг if и for и обходиться одним while. И реально можно будет решить все задачи, в которых применяется if и for. :D
26K
01 августа 2007 года
newonder
12 / / 31.07.2007
Хм..уважаемые Green и Nixus, я конечно понимаю что спор великая штука, но вы обороты сбавляйте. А то не дело друг друга подсиживать. Факты убедительнее смотрятся.
257
01 августа 2007 года
kosfiz
1.6K / / 18.09.2005
господа, чипсы у меня внезапно закончились(squirL я знаю, что это ты их взял к пиву:))) - это раз. тема уже к разделу вроде и не относится - это два, т.к. религиозные споры - это не тематика раздела. смотрим первоисточники: статьи и книги "классиков жанра" или тех специалистов, которые именно для вас считаются авторитетными и определяемся ДЛЯ СЕБЯ: крещение goto или break'ом(или еще чем-то) устраивать тут не надо - это три.
вообщем, тему закрываю и в Гостевую не переношу, захотите сами там создадите продолжение, мусорить не надо. всем спасибо за внимание.

P.S. было интересно наблюдать:)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог