Forum.iFiction.Ru

iFiction.Ru · ifHub · FAQ · IFWiki · QSP · URQ · INSTEAD · AXMA

форум об interactive fiction, текстовых приключенческих играх и всём таком...

Вы не зашли.

0    0    #1
17.08.2007 21:38

uux
Участник (+884, -80)
Откуда: Москва
Зарегистрирован: 02.12.2006
Сообщений: 1624

Великий и могучий Гоуту Неубиваемый

Тут перевод TADS-мануала неожиданно натолкнул меня на мысль: что может заставить современнх программистов использовать оператор безусловного перехода a.k.a. goto? Речь, естественно, идет не о программировании на Ассемблере, Fortran 66 и т. п., а о более-менее структурированных языках, позволяющих теоретически вообще без него обойтись. Обращаюсь к программистам среди наших форумчан (их, к счастью, есть у нас:): пользуетесь ли вы оператором goto и в каких целях?

Начну, как положено, с себя. Я goto пользуюсь, пожалуй, исключительно при программировании на Visual Basic for Applications. Делаю это по следующим причинам: во-первых, ряд процедур удобнее генерировать при помощи встроенных "визардов", а они их генерят как раз с активным использованием goto. Править каждый раз такую процедуру вручную, убирая goto - значит сводить на нет все преимущества автоматизации;). Во-вторых, безусловный переход на метку в VBA удобно использовать при проверке на возникновение ошибки. В этом случае все обработчики ошибок локализуются в конце процедуры, что делает код в целом более читаемым. И, хотя теоретически подобной группировки можно добиться и другими средствами (и, например, программируя на Паскале, я бы совершенно точно организовал такую группировку без goto), в VBA такой способ кажется почему-то наиболее естественным и удобным.

Отредактировано uux (17.08.2007 21:40)

Неактивен

0    0    #2
18.08.2007 00:06

Gremour
Участник (+1)
Откуда: Беларусь
Зарегистрирован: 09.11.2004
Сообщений: 234

Re: Великий и могучий Гоуту Неубиваемый

Один мой коллега с работы (все пишут на C/C++) очень любит использовать goto. Причем, никто его не заставляет. А даже наоборот, уговаривают не использовать. Но не помогают даже угрозы. Ну не может человек мыслить структурно. Научился программировать во времена ассемблера, с этим и остался. Его исходники никто не трогает, и вникать в них не возьмётся. Вот такая страшная история. %)

Неактивен

0    0    #3
18.08.2007 10:30

Olegus t.Gl.
Участник (+1053, -249)
Откуда: Москва
Зарегистрирован: 01.03.2001
Сообщений: 2879
Вебсайт

Re: Великий и могучий Гоуту Неубиваемый

Статрая, но всё ещё актуальная статья на эту тему: http://kalinin.ru/programming/cpp/14_04_01.shtml
Сам я использовал goto за последние десяток лет всего раз — был выбор: либо использовать одну метку и один оператор goto, либо раздувать программу до немыслимых размеров…

Неактивен

0    0    #4
18.08.2007 14:22

goraph
Участник (+647, -223)
Зарегистрирован: 16.04.2007
Сообщений: 531

Основная добродетель гражданина есть недоверие.

Re: Великий и могучий Гоуту Неубиваемый

Каждый раз когда пишу чтото в урке, пользуюсь гоуту smile
А вот в "нормальной" жизни уже года 4 использовать этот прекрасный оператор не было нужды

Неактивен

0    0    #5
18.08.2007 14:48

Xlomid[оманад]
Участник (+85, -7)
Зарегистрирован: 21.06.2007
Сообщений: 178

Re: Великий и могучий Гоуту Неубиваемый

goraph написал:

Каждый раз когда пишу чтото в урке, пользуюсь гоуту

Вот-вот:). Кто скажет, что урка - не структурный язык?smile) А вообще да, в те далекие времена, когда ваш покорный осваивал Си (в котором он, впрочем, безнадежный любитель), оным оператором не пользовался вообще.

Неактивен

0    0    #6
19.08.2007 19:42

- VampirE -
Участник (+3)
Зарегистрирован: 22.06.2006
Сообщений: 101

Re: Великий и могучий Гоуту Неубиваемый

U> Во-вторых, безусловный переход на метку в VBA удобно использовать при проверке на возникновение ошибки. В этом случае все обработчики ошибок локализуются в конце процедуры, что делает код в целом более читаемым.

Аналогично. Вообще я только в хендлерах и использую.

Просто меня еще в лицее научили, что использование GOTO плохой тон. smile

ЧТо касается урки, то там дело вкуса, можно использовать proc, можно goto.

Отредактировано - VampirE - (19.08.2007 19:43)

Неактивен

0    0    #7
20.08.2007 19:16

goraph
Участник (+647, -223)
Зарегистрирован: 16.04.2007
Сообщений: 531

Основная добродетель гражданина есть недоверие.

Re: Великий и могучий Гоуту Неубиваемый

- VampirE - написал:

ЧТо касается урки, то там дело вкуса, можно использовать proc, можно goto.

интересно, и как ты без помощи гото предложишь написать например любой цикл? smile

Неактивен

0    0    #8
20.08.2007 21:45

- VampirE -
Участник (+3)
Зарегистрирован: 22.06.2006
Сообщений: 101

Re: Великий и могучий Гоуту Неубиваемый

Согласен. Тут промах вышел. Про циклы в урке совсем забыл. smile

Неактивен

0    0    #9
21.08.2007 08:31

VoLk88
Участник
Откуда: космодром Свободный
Зарегистрирован: 22.07.2007
Сообщений: 32
Вебсайт

***in trance we trust***

Re: Великий и могучий Гоуту Неубиваемый

Учусь на математика-программиста и поэтому призераю goto. В теории алгоритов есть постулат, что и без этого оператора можно создать ЛЮБОЙ алгоритм.
Использование этого оператора показывает несостоятельность программиста как такового.

Неактивен

0    0    #10
21.08.2007 09:41

Nex
Участник (+120, -130)
Зарегистрирован: 11.06.2007
Сообщений: 2053

---

Re: Великий и могучий Гоуту Неубиваемый

VoLk88 написал:

В теории алгоритов есть постулат, что и без этого оператора можно создать ЛЮБОЙ алгоритм.

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

VoLk88 написал:

Использование этого оператора показывает несостоятельность программиста как такового.

И ты сразу поверил? Какой наивный.

Неактивен

0    0    #11
21.08.2007 16:48

Olegus t.Gl.
Участник (+1053, -249)
Откуда: Москва
Зарегистрирован: 01.03.2001
Сообщений: 2879
Вебсайт

Re: Великий и могучий Гоуту Неубиваемый

VoLk88 написал:

Учусь на математика-программиста и поэтому призераю goto. В теории алгоритов есть постулат, что и без этого оператора можно создать ЛЮБОЙ алгоритм.
Использование этого оператора показывает несостоятельность программиста как такового.

Чем громче слово, тем грамотней оно должно быть написано… А так, по теории русского языка употреблённое слово "призерать" напоминает глагол "призирать", и означает, наоборот, сочувственное отношение…

Ну а теперь по факту: за давностью лет я не помню точно, что была за задача, но ситуация была что-то типа этого:

Код:

УСЛОВИЕ 1
    действие 1
    действие 2
    действие 3  <---------------------------------+
    действие 4                                    |
    УСЛОВИЕ 2                                     |
        действие 5                                |
        действие 6                                |
        УСЛОВИЕ 3                                 |
            действие 7                            |
            действие 8                            |
            УСЛОВИЕ 4                             |
                возможный переход к действию 3 ---+
            КОНЕЦ УСЛОВИЯ 4
            действие 9
        КОНЕЦ УСЛОВИЯ 3
        действие 10
    КОНЕЦ УСЛОВИЯ 2
    действие 11
КОНЕЦ УСЛОВИЯ 1

Знающие люди (Dan Dare, привет!) отмечают, что именно эту схему можно было бы решить рекурсией, если бы не ограниченность в некоторых устройствах размеров стека.

Неактивен

0    0    #12
21.08.2007 17:48

Eten
Участник (+9, -307)
Откуда: Балаково, Санкт-Петербург.
Зарегистрирован: 21.05.2007
Сообщений: 1416
Вебсайт

---

Re: Великий и могучий Гоуту Неубиваемый

Использую goto в самых редких и крайних случаях, иначе говоря когда он либо упрощает алгоритм и тем сокращает затраты времени на выполнение кода алгоритма или, когда без него не обойтись. Одно точно известно, что повсеместное использование goto - дурной тон программирования в ЯВУ всех мастей. Это только программисты "старички", наученные еще с времен DOS, могут использовать goto правильно и при этом не портить и не усложнять алгоритм. В IF языках программирования и даже в УРКе goto имеет свою обоснованность и его использование нормальное явление, но уж мне то, точно сложновато читать огромный исходник написаный на урке с применением goto (хотя он там повсеместно yikes ).

В данный период времени применяю goto, только в сложном алгоритме в синтаксическом анализаторе команд СТК для считывания постоянной строки (заключена между " ). В этом алгоритме с применением goto кол-во команд C# составило минимум 50, а без него получилось бы минимум 100, а о затратах памяти в этом случае вообще молчу (цифры условны и приведены для ощущения разницы).

Так что использовать goto рекомендуется тогда и только тогда, когда он действительно необходим. smile

Отредактировано Eten (21.08.2007 17:57)

Неактивен

0    0    #13
21.08.2007 18:53

VoLk88
Участник
Откуда: космодром Свободный
Зарегистрирован: 22.07.2007
Сообщений: 32
Вебсайт

***in trance we trust***

Re: Великий и могучий Гоуту Неубиваемый

Для начала хочу отметить, что обсуждаем тут не опечатки и даже не грубейшие ошибки в словах русского, а конкретный вопрос программирования.
Я не говорю про Урок - там просто глупо делать циклы и условия, а исходный код старой версии я видел - там всё очень локанично и красиво реализовано, так что программирование квестов с обычным программированием сравнить можно только закрыв глаза.
Можно не лезть в рекурсию и обойти её в большенстве случаев, а приведённый выше пример решается без ГоТо, хоть и не так просто как с ним, с пмощью цикла с условием (или вообще с помощью любого цикла).

Неактивен

0    0    #14
21.08.2007 19:25

Olegus t.Gl.
Участник (+1053, -249)
Откуда: Москва
Зарегистрирован: 01.03.2001
Сообщений: 2879
Вебсайт

Re: Великий и могучий Гоуту Неубиваемый

VoLk88 написал:

Можно не лезть в рекурсию и обойти её в большенстве случаев, а приведённый выше пример решается без ГоТо, хоть и не так просто как с ним, с пмощью цикла с условием (или вообще с помощью любого цикла).

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

Неактивен

0    0    #15
21.08.2007 19:40

VoLk88
Участник
Откуда: космодром Свободный
Зарегистрирован: 22.07.2007
Сообщений: 32
Вебсайт

***in trance we trust***

Re: Великий и могучий Гоуту Неубиваемый

Olegus t.Gl. написал:

VoLk88 написал:

Можно не лезть в рекурсию и обойти её в большенстве случаев, а приведённый выше пример решается без ГоТо, хоть и не так просто как с ним, с пмощью цикла с условием (или вообще с помощью любого цикла).

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

Спину вареньем не намазть? На грубость только так и могу ответить.
Олегус, дорогой, на кого учишься? По роду своей специализации я однозначно знаю, что GoTo - ненужный и не незаменимый оператор.

Неактивен

0    0    #16
21.08.2007 20:11

goraph
Участник (+647, -223)
Зарегистрирован: 16.04.2007
Сообщений: 531

Основная добродетель гражданина есть недоверие.

Re: Великий и могучий Гоуту Неубиваемый

Я конечно знаю, что каждый следующий выпуск программистов хуже предыдущего, но...

VoLk88 написал:

Учусь на математика-программиста и поэтому призераю goto.

Почему-то вспомнилось "я не верю в гороскопы потому что я Лев, а все Львы большие скептики" (с)

Неактивен

0    0    #17
21.08.2007 20:38

uux
Участник (+884, -80)
Откуда: Москва
Зарегистрирован: 02.12.2006
Сообщений: 1624

Re: Великий и могучий Гоуту Неубиваемый

VoLk88 написал:

Спину вареньем не намазть? На грубость только так и могу ответить.

Причем тут грубость? Олегус совершенно резонно попросил привести пример реализации приведенного им алгоритма без goto после того, как Вы, уважаемый Volk88, отделались общими словами.

Кстати, для пуристов и апологетов структурного программирования - вот как это можно сделать без ГоуТу:

Код:

ДолойГоуту=false
УСЛОВИЕ 1 ИЛИ ДолойГоуту
    Если НЕ ДолойГоуту
      действие 1
      действие 2
    КонецЕсли
    действие 3
    ДолойГоуту=false
    действие 4
    УСЛОВИЕ 2 И (НЕ ДолойГоуту)
        действие 5
        действие 6                 
        УСЛОВИЕ 3 И (НЕ ДолойГоуту)
            действие 7
            действие 8
            УСЛОВИЕ 4 И (НЕ ДолойГоуту)
                Если НАМ ОЧЕНЬ НУЖНО НА ДЕЙСТВИЕ 3
                   ДолойГоуту=true
                КонецЕсли
            КОНЕЦ УСЛОВИЯ 4
            Если НЕ ДолойГоуту
              действие 9
            КонецЕсли
        КОНЕЦ УСЛОВИЯ 3
        Если НЕ ДолойГоуту
           действие 10
        КонецЕсли
    КОНЕЦ УСЛОВИЯ 2
    Если НЕ ДолойГоуту
       действие 11
    КонецЕсли
КОНЕЦ УСЛОВИЯ 1

(Я молчаливо предполагал, что пара УСЛОВИЕ-КОНЕЦ УСЛОВИЯ - это цикл. Если это не так, то как минимум УСЛОВИЕ 1-КОНЕЦ УСЛОВИЯ 1 придется сделать циклом).

В целом, наверное, код читается, хотя, конечно, громоздко... да и эффективность упадет в разы (в связи с тем, что количество условных операторов резко возросло).

VoLk88 написал:

Олегус, дорогой, на кого учишься? По роду своей специализации я однозначно знаю, что GoTo - ненужный и не незаменимый оператор.

Незаменимых операторов вообще нет (за исключением, пожалуй, условного;).

Отредактировано uux (21.08.2007 21:07)

Неактивен

0    0    #18
21.08.2007 20:44

Nex
Участник (+120, -130)
Зарегистрирован: 11.06.2007
Сообщений: 2053

---

Re: Великий и могучий Гоуту Неубиваемый

goraph написал:

Почему-то вспомнилось "я не верю в гороскопы потому что я Лев, а все Львы большие скептики" (с)

А мне вспоминается анекдот про "Мойша напел".

Неактивен

0    0    #19
21.08.2007 21:46

Blob
диван найт
Зарегистрирован: 21.08.2007
Сообщений: 5

Re: Великий и могучий Гоуту Неубиваемый

Всем привет!
Эх, сколько же споров я провел на эту тему...

Итак:
1. Действительно, без готы можно обойтись. Всегда.
2. С точки зрения перформанца другие способы, в большинстве случаев - проигрывают.
3. С точки зрения асма все другие способы тоже не лишены готов.
4. Иногда читабельней готу использовать, нежеле лепить маниакально что-то другое. См. MSDN.
Пока всё smile

Неактивен

0    0    #20
21.08.2007 21:48

Olegus t.Gl.
Участник (+1053, -249)
Откуда: Москва
Зарегистрирован: 01.03.2001
Сообщений: 2879
Вебсайт

Re: Великий и могучий Гоуту Неубиваемый

VoLk88 написал:

Спину вареньем не намазть? На грубость только так и могу ответить.

А какое варенье?..

VoLk88 написал:

Олегус, дорогой, на кого учишься? По роду своей специализации я однозначно знаю, что GoTo - ненужный и не незаменимый оператор.

Уже отучился и давно, знаешь ли. Экономист, если что. Однако работаю как раз программистом (на стыке программирования и экономики). И занимаясь программированием как хобби примерно с 1989 года, я даже в машинных кодах успел повозиться. Так что я работал и с goto, и без него. Я (да и никто здесь) не призываю использовать этот оператор напропалую. Просто он есть, и иногда (ну очень редко) его использование оправдано.
А юношескую горячность лучше направить в другое русло. Подобный радикализм в таких вот пустых темах — не лучший способ сублимации…

Неактивен

0    0    #21
21.08.2007 21:55

Blob
диван найт
Зарегистрирован: 21.08.2007
Сообщений: 5

Re: Великий и могучий Гоуту Неубиваемый

Olegus! Дай мальчику блеснуть знаниями. Участие в святых войнах может пойти на пользу. smile

Неактивен

0    0    #22
21.08.2007 22:27

Blob
диван найт
Зарегистрирован: 21.08.2007
Сообщений: 5

Re: Великий и могучий Гоуту Неубиваемый

Кстати, VoLk88. А как ты "по роду специализации" относишься к "switch, case" стэйтменту?

Неактивен

0    0    #23
22.08.2007 11:53

Sfunx
Участник
Зарегистрирован: 22.08.2007
Сообщений: 11

Re: Великий и могучий Гоуту Неубиваемый

Сам я очень редко использую goto- стараюсь обходится без него. За последние лет 7 использовал может раза два... Но есть куча НО...

VoLk88 написал:

Учусь на математика-программиста и поэтому призераю goto. В теории алгоритов есть постулат, что и без этого оператора можно создать ЛЮБОЙ алгоритм.
Использование этого оператора показывает несостоятельность программиста как такового.

Если ты математик-программист, то должен знать несколько вещей:

"Постулат" (или аксиома) - это то, что принимается без доказательств. Однако, насколько я знаю, доказатаельство ненужности goto - имеется. Так что это теорема, а не "постулат".

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

Имеется масса хорошо структурированных программ на ассемблере, где без goto (он же jp, он же jmp и так далее) вообще программу никак не напишешь.
И имеется масса поделок любителей всяких визуал-пофиговин, которые своими корявыми ручёнками накалякали безобразнейший код без goto в котором чёрт ногу сломит... Увы... нонче такой код скорее правило. Мало кто пишет с хорошими комментариями...

Кстати, загляни в исходники прекрасной ОС Linux - там есть довольно много goto. В целях увеличения скорости и уменьшения объёма кода. Хотя золотое правило - ограничиваться goto внутри одной процедуры...

Надеюсь не будешь утверждать, что у программистов ядра линукс - плохой стиль ? Или что они несостоятельны ?

Неактивен

0    0    #24
22.08.2007 14:20

Eten
Участник (+9, -307)
Откуда: Балаково, Санкт-Петербург.
Зарегистрирован: 21.05.2007
Сообщений: 1416
Вебсайт

---

Re: Великий и могучий Гоуту Неубиваемый

Господа, а че вы к циклам то пристали >neutral. Если при написании цикла на языке Т нельзя вообще обойтись без goto, то это сильный минус для языка Т и его автора. И этому автору не помешает намекнуть, что его язык не может быть высокоуровневым если у него нет стандартных операторов, которые не могут не то, что выполнить команду цикл, даже позволить реализовать все команды основанные на общем алгоритмическом языке. А этот общий алгоритмический язык пишется схем-блоками. А раз уж в языке есть синтаксические конструкции основанные на определенных операторах, то уж точно, что goto будет использоваться в промежуточном коде, но самой программой. А вы господа, ломитесь на уровень промежуточного кода с примерами goto. Еще бы продемоснтрировали древную работу похожую на работу с массивами. lol

Мне чем C# нравится, так это возможностью не дать сделать те вещи, как это делалось в C++, которые потом губят всю прогу из-за простой нелепости. И goto там можно использовать только внутри одной функции, а не делать переход за ее границы, во время выполнения этой же функции. Поэтому, может показаться, что вариант C# строже и конкретней C++, но он дает гарантии разумного использования команд, так чтобы не было возможности нарушить логичность кода.
З.Ы.
Урку привел, как пример широкого использования goto.
Под языком Т, можно понимать любой язык, который реализует все стандартные действия алгоритма на уровне школьного.
И отмечу на последок, редко встречаются языки, где нет такого понятия в синтаксисе, как цикл. Его изучить не сложнее, чем оператор условного ветвления и возможностей он даст больше, нежели примение goto.wink

Неактивен

0    0    #25
22.08.2007 16:20

VoLk88
Участник
Откуда: космодром Свободный
Зарегистрирован: 22.07.2007
Сообщений: 32
Вебсайт

***in trance we trust***

Re: Великий и могучий Гоуту Неубиваемый

Такой резонанс! Спасибо! Так вот, что хочу сказать:

Blob написал:

Кстати, VoLk88. А как ты "по роду специализации" относишься к "switch, case" стэйтменту?

Хорошая коснтрукция, с помощью которой как раз можно обойти рекурсию во многих случаях (ну, например при вычислениии факториала).

"Постулат" (или аксиома) - это то, что принимается без доказательств. Однако, насколько я знаю, доказатаельство ненужности goto - имеется. Так что это теорема, а не "постулат".

Доказательства для бесполезного оператора? Можно ещё напридумывать кучу операторов и надоказывать теорем, не правда ли?

Я не знал, сколько тебе лет, Олегус, но теперь уважаю твой возраст. А то, что ты экономист, а не программист по образованию очень жаль - ты пропустил множество предметов касающихся алгоритмов и программирования.
А не использую гоуту, так как про него и не помнил никогда - всегда на "подсознательном" уровне обхожусь и причём легко.

Кстати, загляни в исходники прекрасной ОС Linux - там есть довольно много goto. В целях увеличения скорости и уменьшения объёма кода. Хотя золотое правило - ограничиваться goto внутри одной процедуры...

Надеюсь не будешь утверждать, что у программистов ядра линукс - плохой стиль ? Или что они несостоятельны ?

Не люблю линух - я люблю пользоваться нужными мне программами, а не воевать всё время с пингвинами, уж простите.

Неактивен

Powered by PunBB
© copyright 2001–2024 iFiction.Ru