Существуют ли задачи, где использование GOTO оправдано?
От: Vedrus Лес www.Indigo.RingingCedarsOfRussia.org
Дата: 31.07.07 10:21
Оценка: :))) :)
Люди, кто-нибудь может привести пример, где использование GOTO оправдано? Я знаю, что существуют такие задачи, но слабо представляю, как это в живую выглядит. Вроде в синтаксических анализаторах используется, и в очень сложных математических расчётах.

Сейчас практически все мои знакомые программисты считают, что использование GOTO – это признак кривизны кода. Хотелось бы их разубедить.

01.08.07 13:56: Перенесено из 'Алгоритмы'
Re: Существуют ли задачи, где использование GOTO оправдано?
От: minorlogic Украина  
Дата: 31.07.07 10:28
Оценка:
Здравствуйте, Vedrus, Вы писали:

V>Сейчас практически все мои знакомые программисты считают, что использование GOTO – это признак кривизны кода. Хотелось бы их разубедить.

Если вы хотите разубедить , разве это не значит что у вас и аргументы есть и примеры ?
Ищу работу, 3D, SLAM, computer graphics/vision.
Re: Существуют ли задачи, где использование GOTO оправдано?
От: NikeByNike Россия  
Дата: 31.07.07 10:33
Оценка: -14
Здравствуйте, Vedrus, Вы писали:

V>Сейчас практически все мои знакомые программисты считают, что использование GOTO – это признак кривизны кода. Хотелось бы их разубедить.


ИМХО это признак кривизны кода...
Нужно разобрать угил.
Re[2]: Существуют ли задачи, где использование GOTO оправдан
От: Vedrus Лес www.Indigo.RingingCedarsOfRussia.org
Дата: 31.07.07 10:45
Оценка: :)
Я тоже считал раньше, что GOTO — признак кривизны. Но после спора с одним преподам (4 часа) признал, что был не прав. Он мне более конкретно выше озвученые темы привёл, но я их забыл . Вот и пытаюсь восстановить.
Re[3]: Существуют ли задачи, где использование GOTO оправдан
От: sc Россия  
Дата: 31.07.07 10:57
Оценка: +2 :))) :))) :))) :))
Здравствуйте, Vedrus, Вы писали:

V>Я тоже считал раньше, что GOTO — признак кривизны. Но после спора с одним преподам (4 часа) признал, что был не прав. Он мне более конкретно выше озвученые темы привёл, но я их забыл . Вот и пытаюсь восстановить.


Я тоже когда-то с преподом согласился, что подпрограммы/ф-ции — это плохо. Когда третий раз пришел зачет сдавать. И вообще, чем старше становился (а времени становилось меньше), тем чаще с преподами соглашался.
Re: Существуют ли задачи, где использование GOTO оправдано?
От: Mycopka Россия http://mhehue.info
Дата: 31.07.07 11:03
Оценка: 3 (3) +1

3.3.2 Оператор goto



Презираемый оператор goto все-таки есть в С++:

goto идентификатор;

идентификатор: оператор

Вообще говоря, он мало используется в языках высокого уровня, но
может быть очень полезен, если текст на С++ создается не человеком,
а автоматически, т.е. с помощью программы. Например,
операторы goto используются при создании анализатора по заданной
грамматике языка с помощью программных средств.
Кроме того, операторы goto могут пригодиться в тех случаях,
когда на первый план выходит скорость работы программы. Один из
них — когда в реальном времени происходят какие-то вычисления во
внутреннем цикле программы.
Есть немногие ситуации и в обычных программах, когда применение
goto оправдано. Одна из них — выход из вложенного цикла или
переключателя. Дело в том, что оператор break во вложенных циклах
или переключателях позволяет перейти только на один уровень выше.
Приведем пример:

           void f()
           {
             int i;
             int j;

             for ( i = 0; i < n; i++)
                 for (j = 0; j<m; j++)
                     if (nm[i][j] == a) goto found;
                 // здесь a не найдено
                 // ...
             found:
                 //  nm[i][j] == a
           }


(c) Бьерн Страуструп. Язык программирования С++. Второе дополненное издание
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
---
With best regards и все такое :)
Re: Существуют ли задачи, где использование GOTO оправдано?
От: Аноним  
Дата: 31.07.07 11:06
Оценка: -2
Здравствуйте, Vedrus, Вы писали:

V>Люди, кто-нибудь может привести пример, где использование GOTO оправдано? Я знаю, что существуют такие задачи, но слабо представляю, как это в живую выглядит. Вроде в синтаксических анализаторах используется, и в очень сложных математических расчётах.


V>Сейчас практически все мои знакомые программисты считают, что использование GOTO – это признак кривизны кода. Хотелось бы их разубедить.

Использование goto в языках высокого уровня действительно признак кривизны кода. А так goto-подобные команды повсеместно используются в языках низкого уровня, всякие там ассемблеры.
Re[4]: Существуют ли задачи, где использование GOTO оправдан
От: Vedrus Лес www.Indigo.RingingCedarsOfRussia.org
Дата: 31.07.07 11:06
Оценка:
Вопрос не в том, что препод лох. Он мне аргументированно объяснил. Препод математик, и очень хорошо разбирается в структурном программировании. Бывает объективная необходимость во включении GOTO, для увеличения быстродействия. Мне бы хотелось услышать ответы от тех, кто считает, что GOTO имеет право на жизнь с конкретными примерами. Остальные не обижайтесь, но не надо писать сюда.
Re[2]: Существуют ли задачи, где использование GOTO оправдан
От: Vedrus Лес www.Indigo.RingingCedarsOfRussia.org
Дата: 31.07.07 11:09
Оценка:
Спасибо, хорошая статья. Копаем дальше.
Re: Существуют ли задачи, где использование GOTO оправдано?
От: _pk_sly  
Дата: 31.07.07 11:13
Оценка: 2 (1)
1. выход из вложенных if/switch/while на нужный уровень.

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

3.
for (...) {
  if (...) break;
}
// а тут надо что-то сделать в случае, если выход из цикла был не по break


4. выполнение cleanup-кода перед выходом из функции


disclaimer: я не призываю всегда в этих случаях пользоваться goto
Re[2]: Существуют ли задачи, где использование GOTO оправдан
От: unreg_flex  
Дата: 31.07.07 11:13
Оценка:
Здравствуйте, NikeByNike, Вы писали:

NBN>Здравствуйте, Vedrus, Вы писали:


V>>Сейчас практически все мои знакомые программисты считают, что использование GOTO – это признак кривизны кода. Хотелось бы их разубедить.


NBN>ИМХО это признак кривизны кода...


Напишите этот кусочек кода не криво плиз, а то я никак не соображу как

for(int i=0;i<n1;++i) {
  for(int j=0;j<n2;++j) {
    if(come_condition1) goto next1;
    for(int k=0;k<n3;++k) {
      if(come_condition2) goto next2;
    }
    // some code
  }
  next2:
  // some code
}
next1:
// some code
Re: Существуют ли задачи, где использование GOTO оправдано?
От: Сергей Мухин Россия  
Дата: 31.07.07 11:21
Оценка: 1 (1) :)
Здравствуйте, Vedrus, Вы писали:

V>Люди, кто-нибудь может привести пример, где использование GOTO оправдано? Я знаю, что существуют такие задачи, но слабо представляю, как это в живую выглядит. Вроде в синтаксических анализаторах используется, и в очень сложных математических расчётах.


V>Сейчас практически все мои знакомые программисты считают, что использование GOTO – это признак кривизны кода. Хотелось бы их разубедить.


здесь
Автор: MaximE
Дата: 31.03.05
---
С уважением,
Сергей Мухин
Re[2]: Существуют ли задачи, где использование GOTO оправдан
От: Vedrus Лес www.Indigo.RingingCedarsOfRussia.org
Дата: 31.07.07 11:39
Оценка:
unreg_flex, _pk_sly, Сергей Мухин, спасибо, интересные примеры привели.
_pk_sly, можете уточнить по п.2? Я тоже где-то слышал, что в автоматах GOTO используется, но не могу сообразить зачем. Почему простой switch/case с селектором состояний не подойдёт?

ЗЫ. Может у кого ещё примеры есть
Re[3]: Существуют ли задачи, где использование GOTO оправдан
От: NikeByNike Россия  
Дата: 31.07.07 11:39
Оценка: +2
Здравствуйте, unreg_flex, Вы писали:

_>Напишите этот кусочек кода не криво плиз, а то я никак не соображу как


_>
_>for(int i=0;i<n1;++i) {
_>  for(int j=0;j<n2;++j) {
_>    if(come_condition1) goto next1;
_>    for(int k=0;k<n3;++k) {
_>      if(come_condition2) goto next2;
_>    }
_>    // some code
_>  }
_>  next2:
_>  // some code
_>}
_>next1:
_>// some code
_>


Ну дык он и так криво написан.

_> for(int k=0;k<n3;++k) {

_> if(come_condition2) goto next2;
_> }
Должно быть вынесено в функцию (или скорее использована стандартная)

_> for(int j = 0; j < n2; ++j) {

_> if(come_condition1 || find_by_condition2)
_> break;
_> // some code
_> }
Это тоже. Скорее всего оптимайзер это соптимайзит.

Сам по себе кусок кода — ужасен, сразу мысль — этот код нужно рефакторить. Если это не критический участок кода — его нужно сделать красивее. Если критический — менять алгоритм.

GOTO для отчистки кода — в 99.95% случаях самое что ни есть зло. Нормальный программист будет использовать автоматику (конструкторы/деструкторы).
GOTO для выхода из вложенных циклов? По хорошему эти циклы должны разноситься на отдельные функции. Глядя на этот код — сразу появляется мысль, что у её авторов бывают функции больше чем на страницу и целый ряд прочих проблем.
Нужно разобрать угил.
Re[2]: Существуют ли задачи, где использование GOTO оправдан
От: Vedrus Лес www.Indigo.RingingCedarsOfRussia.org
Дата: 31.07.07 11:43
Оценка:
unreg_flex, _pk_sly, Сергей Мухин, спасибо, интересные примеры привели.
_pk_sly, можете уточнить по п.2? Я тоже где-то слышал, что в автоматах GOTO используется, но не могу сообразить зачем. Почему простой switch/case с селектором сосотяний не подойдёт?

ЗЫ. Может у кого ещё примеры есть
Re[3]: Существуют ли задачи, где использование GOTO оправдан
От: Кодт Россия  
Дата: 31.07.07 11:46
Оценка: 4 (1)
Здравствуйте, unreg_flex, Вы писали:

_>Напишите этот кусочек кода не криво плиз, а то я никак не соображу как


1) Если не зарубаться на то, что всё это должно лежать внутри одной функции, то можно переделать, раскидав циклы по функциям.
2) Булевы флажки.

Кстати, можно заподозрить, что этот код — либо наглухо заоптимизирован, либо содержит логические ошибки, либо просто взят с потолка.
Потому что описания задач всё-таки тяготеют к иерархическим структурам (деревья принятия решений, рекурсивные формулы...), а граф конечного автомата — это результат трансляции.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[3]: Существуют ли задачи, где использование GOTO оправдан
От: _pk_sly  
Дата: 31.07.07 11:49
Оценка:
V>_pk_sly, можете уточнить по п.2? Я тоже где-то слышал, что в автоматах GOTO используется, но не могу сообразить зачем. Почему простой switch/case с селектором состояний не подойдёт?

подойдёт.

это разные подходы к одному и тому же.

следующее состояние можно выбирать по таблице, исходя из текущего состояния, а можно сгенерить код типа

state_1:
  switch (signal) {
    case 1: goto state_5;
    case 2: goto state_10;
    case 3: goto state_8;
  }
state_2:
  switch (signal) {
    case 7: goto state_37;
    case 10: goto state_1;
    case 9: goto state_100;
  }
Re[4]: Существуют ли задачи, где использование GOTO оправдан
От: Vedrus Лес www.Indigo.RingingCedarsOfRussia.org
Дата: 31.07.07 11:56
Оценка:
А с точки зрения производительности эти варианты как-то отличаются? Или ещё чем?
Если не отличаются, то моё субъективное мнение, что с селекотором лучше
Re[5]: Существуют ли задачи, где использование GOTO оправдан
От: _pk_sly  
Дата: 31.07.07 12:01
Оценка:
V>А с точки зрения производительности эти варианты как-то отличаются? Или ещё чем?
V>Если не отличаются, то моё субъективное мнение, что с селекотором лучше

да, отличаются.

goto медленнее может оказаться в единственном случае — когда конвейеру становится плохо.
ведь кроме goto, как правило, там есть ещё какой-то код

но обычно, goto — значительно быстрее.

вариант с селектором тоже имеет право на жизнь
Re[3]: Существуют ли задачи, где использование GOTO оправдан
От: elmal  
Дата: 31.07.07 12:04
Оценка: 1 (1)
Здравствуйте, unreg_flex, Вы писали:

_>Напишите этот кусочек кода не криво плиз, а то я никак не соображу как


_>
_>for(int i=0;i<n1;++i) {
_>  for(int j=0;j<n2;++j) {
_>    if(come_condition1) goto next1;
_>    for(int k=0;k<n3;++k) {
_>      if(come_condition2) goto next2;
_>    }
_>    // some code
_>  }
_>  next2:
_>  // some code
_>}
_>next1:
_>// some code
_>


Легко:

Можно свести к:
doSomeActivityInFor();
//someCode;

Главный цикл вынес бы в одну функцию
inline void doSomeActivityInFor() {
  for(int i=0;i<n1;++i) {
    for(int j=0;j<n2;++j) {
      if(come_condition1) return;

      if (some_condition3(i,j) {
         break;
      }
     // some code
   }
   // some code
}

inline bool some_condition3(i,j) {
   for(int k=0;k<n3;++k) {
      if(come_condition2()) return true;
   }
   return false;
}


При достаточно удачных выбранных именах для подфункций, на которые я разбивал, ИМХО код становится гораздо более читабельным. В исходном коде плох не сам оператор goto, а то, что имеем 2 вложенных цикла, в которых к тому же вложены еще и условия (хотя допустимый предел сложности не пройден). Я при разбиении не избавился от оператора goto, а избавился от некоторых недостатков кода. Макконел говорит например, что оператор goto не плох сам по себе, но часто соседствует с плохим кодом. И в случае, если бы исходный код также содержал 3 вложенных цикла без goto — все равно бы имело смысл упростить код (Я привел не все упрощения, ИМХО стоило бы продолжить).
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.