Forum.iFiction.Ru

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

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

Вы не зашли.

0    0    #1
17.08.2007 21:38

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

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

Тут перевод 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
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    #3
22.08.2007 16:57

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

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

VoLk88 написал:

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

А ты в курсе, что switch-case - это полный, 100% аналог if-goto ?

VoLk88 написал:

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

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

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

А при чём тут любовь ? Я тебе реальный пример привёл, что в реальной ОС, в которую вливаются миллиарды зелёных и которая гораздо удобнее и недёжнее убогой микрософтовской поделки, используется довольно много операторов goto... Кстати - в книжке по программированию, тоже есть рекомендации, как написать компактный и культурный код, используя goto...

Неактивен

0    0    #4
23.08.2007 07:12

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

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

VoLk88 написал:

2Sfunx
Какая глупость про if-goto... в селект-кейс (на С) вообще все пункты выполняются до бреак, начиная с отмеченого, и он является "полуаналагом" if then else (elseif elseif elseif...) end if (это для пущей понятливости)

Я не спорю с тем, что любую конструкцию можно сделать как с goto, так и без оного (хоть на уровне маш-кода всё равно всё будет через goto). Но вот выдержка из книги "Brian W. Kernighan, Dennis M. Ritchie The C programming Language" :

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

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

for (...)
    for (...) {
        ...
        if (disaster) /* если бедствие */
            goto error; /* уйти на ошибку */
error: /* обработка ошибки */
    ликвидировать беспорядок

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

С Керниганом и Ричи тоже будешь спорить ? Да, goto запутывает программы ПРИ НЕУМЕЛОМ использовании, НО ИНОГДА очень удобна - и я с ними согласен.

VoLk88 написал:

И линух - не самая удобная (это 100%) и надёжная уж п(р)оверь. Виндой пользуются в России 95% пользователей и софт в основном под неё пишут. Дрова хрен под линух найдёшь, да просто КУЧА НЕДОСТАТКОВ! Но не о линухе...

"Не спорь о вкусе устриц с тем, кто их ел"(С).
Я окончил учиться в 99м году и имею опыт профессионального программирования под DOS, Windows около 8 лет и под Linux около 5 лет.
Занимался программированием на ассемблерах и С кроме персоналок таких процессоров z80, КР580, '51, AVR, ARM7, ARM9, 1878BE1 и ещё кое-что помелочи... Кроме этого пользовался Delphi, forth, fortran, lisp и prolog (совсем немного, но пользовал)...
И с таким опытом могу смело утверждать, что Linux (для меня, как для программиста... но о вкусах не спорят!) более удобная система. Сказки про "дрова" в прошлом уже давно. Система ставится без проблем несколькими кликами. Но вот попробуй мне поставить Windows на не-x86 проц? Такие компании как Siemens (только неделю назад разговаривал с её представителем), IBM, Goolgle - отказались или отказываются от Windows в пользу Linux. А пользователь - в 99% случаев =  лемминг. За что посадили на том и работает. Это вообще не аргумент. Сейчас даже в школы у нас Linux ставят. И без проблем.

VoLk88 написал:

А какая у тебя книжка "по программированию" - синияя или толстая? по программированию на чём? Наверное, у тебя клёвая книжка...

Например, та, что я привел - Кернигана и Ричи. Их авторитет тебя не убеждает ? могу ещё десяток названий привести. Везде goto не рекомендуется, но в то же время делается оговорка, что иногда этот оператор полезен...

VoLk88 написал:

Вообще чё напали-то все? Если никто из вас не может без GoTo обойтись это совсем не значит, что больше никто не сможет!

Потому что ты выдаёшь то, что тебе сказал какойто глупец, который не писал больших программ никогда, за истину в последней инстанции... Потому люди и возражают. Причём, заметь, не какие-нибудь студенты, а люди, имеющие реальный (и зачастую немалый) опыт в написании РЕАЛЬНЫХ программ. Может стоит прислушаться ?
Никто ни разу тебе не возразил, что без goto обойтись можно. Но "можно" и "нужно" - разные вещи. Иногда (особенно в устройствах с малыми ресурсами) - скорость и объём программы гораздо важнее, чем "принципиально обходится без goto". И я тоже стараюсь не использовать goto, но иногда приходится. Раз в год-два smile

VoLk88 написал:

Короче, GoTo не есть истина и всегда обхожу эту дрянь, а ты, дорогой Sfunx можешь и дальше пользоваться чем тебе угодно, в любых целях и количествах. А если бы ты был повнимательнее при работе с отладчиком, то заметил бы, что jmp, jp, jnz не всегда используются как GoTo, чаще это тот самый If. А с машиной Тьюринга игрался? Читал статьи самого Тьюринга или Поста? Нет? Оно и видно...

"Остапа понесло"(с)...
Помоему я уже писал, что тоже стараюсь НЕ пользоваться этим оператором. Но ИНОГДА приходится.
Интересно - как ты jp x, jmp x  используешь как if ? Это ж БЕЗУСЛОВНЫЙ переход - goto ? Пример, пожалуйста smile Кстати об отладчике, я начинал программировать, ассемблируя программу ручкой на листочке, потом вгонял её в машкодах в комп и запускал smile Эх... Были времена! И программы были структурные smile

jp x, jmp x = goto x
jz x = if ноль goto x
jnz x = if не ноль goto x

Так что не if, а if условие goto метка smile "И никуда-никуда нам не деться от ээээтогоооо..."(С)

В общем - кончай с юношеским максимализмом smile У всего есть две стороны... Когда ты это поймёшь - станешь неплохим программистом.

Отредактировано Sfunx (23.08.2007 07:26)

Неактивен

0    0    #5
23.08.2007 12:49

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

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

VoLk88 написал:

На ассемблере вчистую не программировал, но как я вижу (как понял) там goto=then, т.е. слово по-другому пишется, а смысл тот же.
Специально смотрел исходники: звезда номер 5, зомби 2, приключения маленького пупса написаны без GoTo. Также смотрел исходники некоторых крактро от Razor1911, тоже нет никаких GoTo.

goto - это "переход". Если по-русски. А как он там записан - jp, goto, if then goto - смысла это не меняет.

VoLk88 написал:

Знаешь, Sfunx, лемминиги не лемминги, но не все же программёры, некоторым нужно просто печатать, другим рисовать, а третьим играть и для таких людей и работает программист.

Логично. Вот и работают программисты и под Windows и под Linux и под FreeBSD и под eCos и под ещё сотню операционных систем smile И им за это платят. Слово "лемминги" я употребил в том смысле, что часто выбор средств вообще от пользователя не зависит. "Начальство заставило", "сосед вася поставил"... Большинству вообще пофиг... Работает - и ладно. Только когда отдел К придёт - начинают думать...

VoLk88 написал:

А ассемблер и яву очень различаются, что приемлимо в ас-ре, то несовсем в яву. Я конечно понимаю, что в асме без этого никак (достаточно открыть любую прогу в отладчике и всё будет в сплошных переходах, но без этого-то там никак!)

Согласен. Стили программирования отличаются. Но не ПРИНЦИПЫ. Вот два примера:
C:
for(i=0;i<10;i++)
     {
       // Тело цикла.
     }

ассемблер:

     ldr R0,#00
1:  cmp R0,#00
     beq 2f

     /* Тело цикла */
     inc R0
     b 1b
2:

Оба абсолютно структурны, делают одно и то же. Несмотря на то, что второй, на ассемблере использует goto в инкарнации b smile Так что не в языке дело, а в прокладке между монитором и креслом smile Сможет прокладка программу написать удобоваримо и структурно- тогда она и на асме получится красивой... А не сможет... так никакой с-шарп не спасёт...


VoLk88 написал:

А Линухи стали ставить по школам и универам из-за дорогой лицензии Окон, вот и всё.

Неа. Лицензия на Windows - копейки стоит... Беда в том, что виндовс - пустой... То есть в его комплект не входит ни графических редакторов (паинт не в счёт) ни текстовых (блокнот тоже не в счёт)... Ничего. Вот это, то чего в виндовсе нет стоит очень и очень бешенные бабки. А зачем их платить, когда можно поставить бесплатное и не хуже ? Я 5 лет пользуюсь для редактирования документов OpenOffice, для рисования и редактирования фоток - Gimpом... Более чем достаточно. Ну а школьникам-студентам - и подавно.

VoLk88 написал:

И вобщем мы тут говорим не о программировании огромнейших длиннющих программ, а о текстовых квестах.

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

VoLk88 написал:

Спасибо за замечания, конечно, но пока я GoTo ни разу не использовал за всю свою жизнь.

Молодец. Стиль - это прекрасно. Я тоже стараюсь не пользоваться.

Я, кстати, тоже раньше жутким максималистом был. Потом переболел. Понял простую истину - плохи те правила программирования, которые для достижения цели нельзя скорректировать. smile

Неактивен

0    0    #6
23.08.2007 13:02

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

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

Вот так уже не аналогично :

Код:

for (...)
    for (...) {
        ...
        if (disaster) /* если бедствие */
            goto error; /* уйти на ошибку */
        if (disaster1) /* если бедствие */
            goto error; /* уйти на ошибку */
        if (disaster2) /* если бедствие */
            goto error; /* уйти на ошибку */
        if (disaster3) /* если бедствие */
            goto error; /* уйти на ошибку */
        if (disaster4) /* если бедствие */
            goto error; /* уйти на ошибку */
        ....
error: /* обработка ошибки */
    ликвидировать беспорядок

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

Правила использования goto:
1. Если можешь не использовать goto без кардинального ухудшения читаемости-объёма-скорости программы - НЕ ИСПОЛЬЗУЙ его.
2. Если всё ж никак без goto не обойтись - то переходи им ТОЛЬКО внутри одной процедуры.
3. Никогда не делай циклы через goto. Всегда есть while() for() и break;

Вот собственно и всё... Итог всей темы...

Отредактировано Sfunx (23.08.2007 13:36)

Неактивен

0    0    #7
27.08.2007 08:48

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

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

VoLk88 написал:

Переходы всегда есть, а вот конекретно goto - нет!
Я про одно, а вы про другое, как малые дети всё равно что.

"Ничего не понимаю! Слова нет, а ЖОПА - есть!"(С) Вовочка...

Честно, говоря, тема очень веселит :-)

Неактивен

0    0    #8
27.08.2007 08:57

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

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

Gremour написал:

Пример из Кернигана и Ричи на языке C++ решается с помощью предназначенного для этого механизма исключений (exceptions). На худой конец, можно обойтись разбиением на функции, так, чтобы goto превратился в return.

Там голый С, без ++. Кстати, системные вещи на голом С пишутся. А вообще - согласен, можно всё сделать и через исключения на С++.
Да и вообще - на мой взгляд - к "гоуту" самое правильное отношение - это "нельзя, но если очень хочется (нужно), то - можно" :-)

Неактивен

Powered by PunBB
© copyright 2001–2026 iFiction.Ru