Модераторы: Се ля ви

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Кого это вы 'go to'!? или Нужны ли goto, как и стоит ли их обходить? 
:(
    Опции темы
Cr@$h
Дата 31.8.2006, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
***


Профиль
Группа: Участник Клуба
Сообщений: 1693
Регистрация: 3.4.2005
Где: Санкт-Петербург, Россия

Репутация: 1
Всего: 41



Цитата(albertn @  31.8.2006,  10:36 Найти цитируемый пост)
 Кстати я где-то слышал, что создатели php сказали, что в некоторых ситуациях просто необходимо использование goto. 

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

user posted imageВ Fortran, кстати, даже для выхода из вложенных циклов не нужен goto, т.к. циклам можно давать имена:
Код

MailLoop: do i = 1, 100
    ...
    do j = 1, 100
        ...
        do k = 1, 100
            ...
            if( cond )&
                exit MainLoop
            ...
        end do
        ...
    end do
    ...
end do MainLoop

Точно так же можно было бы написать cycle MainLoop -- тогда бы начали следующую итерацию внешнего цикла (аналог continue). Имена могли дать и двум другим циклам. И это ни какие не метки, в Fortran метки -- это вообще целые числа, с которых начинаются строки:
Код

10 if( cond ) exit
...
goto 10

Сами числа выделяются в современных редакторах красным цветом.user posted image
Не знаю других языков, где можно было бы так обходиться без меток (не создавая лапши и доп. переменных в таких случаях). Тем не менее, в существующем коде Fortran меток очень много, т.к. язык совершенствуется. Если разговор о goto зайдёт дальше, можно будет выделить в отдельную тему.

Это сообщение отредактировал(а) Cr@$h - 31.8.2006, 18:17
PM MAIL ICQ   Вверх
Void
Дата 31.8.2006, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 9
Всего: 173



Цитата(Cr@$h @  31.8.2006,  20:11 Найти цитируемый пост)
В Fortran, кстати, даже для выхода из вложенных циклов не нужен goto, т.к. циклам можно давать имена:

Кстати, в Java есть та же фишка: break по именованным блокам.
Код
outer:
for (int i = 0; i < 10; ++i) {
    for (int j = 0; j < 10; ++j) {
        if (j > i)
            break outer;
    }
}

Эта возможность вкупе с finally-блоками (или их аналогами), на мой взгляд, практически устраняет потребность в goto.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Cr@$h
Дата 31.8.2006, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
***


Профиль
Группа: Участник Клуба
Сообщений: 1693
Регистрация: 3.4.2005
Где: Санкт-Петербург, Россия

Репутация: 1
Всего: 41



Цитата(Void @  31.8.2006,  19:30 Найти цитируемый пост)
Кстати, в Java есть та же фишка: break по именованным блокам.

Интересно, а continue outer; можно писать? Ну, чтобы начать следующую итерацию внешнего цикла. Надеюсь, вложенность именнованных блоков поддерживается. А с finaly-блоками примерчик мона?

M
Cr@$h
Тема выделена из разговора о Lisp'е.

PM MAIL ICQ   Вверх
Void
Дата 31.8.2006, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 9
Всего: 173



Цитата(Cr@$h @  31.8.2006,  21:11 Найти цитируемый пост)
Интересно, а continue outer; можно писать?

Да.
Цитата(Cr@$h @  31.8.2006,  21:11 Найти цитируемый пост)
Надеюсь, вложенность именнованных блоков поддерживается.

Да.

Цитата(Cr@$h @  31.8.2006,  21:11 Найти цитируемый пост)
А с finaly-блоками примерчик мона?

Я имел в виду один из наиболее распространённых сценариев использования goto, пошедший, по всей видимости, из Си: обработка ошибок и освобождение ресурсов.
Код
FILE *f;
SOMEHANDLE *h1;
SOMEOTHERHANDLE *h2;
if ((f = fopen(...)) == NULL)
    return;
if ((h1 = open_some_resource(/* f used here */)) == NULL)
    goto cleanup_2;
if ((h2 = open_some_other_resource(/* h1 used here */) == NULL)
    goto cleanup_1;
/* do whatevery you want here */
close(h2);
cleanup_1:
close(h1);
cleanup_2:
fclose(f);

В Java/.NET используют вложенные try..[catch]..finally блоки.
Код
try
{
    // return или выброс исключения отсюда — перед выходом попадаем в (1)
    try
    {
        // а если отсюда, то пройдём через (2) и (1)
    }
    finally
    {
        //(2)
    }
}
finally
{
    // (1)
}



--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Cr@$h
Дата 31.8.2006, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
***


Профиль
Группа: Участник Клуба
Сообщений: 1693
Регистрация: 3.4.2005
Где: Санкт-Петербург, Россия

Репутация: 1
Всего: 41



Теперь понял, что имел в виду. В C# люблю свойства такие делать: они кидают исключение, если что не так, а я на самом верху лювлю. Говорят, чем выше ловишь, тем лучше. Но это уже совсем другая тема.
Да, из последних двух примеров, видно, что конструкция try/catch позволяет избавиться ещё от одного "распространённого" класса кода с goto.
Код C++ можно на if/else if/... заменить ещё.
Пока можно сказать, что goto необходим для выхода из "сложных ситуаций" (вложенные циклы), но в некоторых языках (Fortran, Java) может элегантно обходится с помощью именованных блоков (конструкций). При генерации исключений goto полноценно заменяется конструкциями try/catch или if/else if/....

Это сообщение отредактировал(а) Cr@$h - 31.8.2006, 20:27
PM MAIL ICQ   Вверх
Void
Дата 31.8.2006, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 9
Всего: 173



Цитата(Cr@$h @  31.8.2006,  22:25 Найти цитируемый пост)
Код C++ можно на if/else if/... заменить ещё.

В С++ есть RAII: ресурсы инкапсулируются объектами и освобождаются при вызове деструкторов этих объектов при выходе из блока (нормально или пробросом исключения).


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Cr@$h
Дата 31.8.2006, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
***


Профиль
Группа: Участник Клуба
Сообщений: 1693
Регистрация: 3.4.2005
Где: Санкт-Петербург, Россия

Репутация: 1
Всего: 41



Цитата(Void @  31.8.2006,  22:14 Найти цитируемый пост)
В С++ есть RAII: ресурсы инкапсулируются объектами и освобождаются при вызове деструкторов этих объектов при выходе из блока (нормально или пробросом исключения). 

Да, тоже полезно. Но при исключениях, коечно, этого бывает не достаточно. Иногда информацию о самом исключении или ошибке полезно писать. Тут автоматическим вызовом деструктора не обойтись. В шарпах, вроде, тоже что-то вызывается у объекта, но я не практиковал...
PM MAIL ICQ   Вверх
Bikutoru
Дата 1.9.2006, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: нет
Всего: 22



Цитата(Cr@$h @  31.8.2006,  19:11 Найти цитируемый пост)
В Fortran, кстати, даже для выхода из вложенных циклов не нужен goto

Кстати подобная вещь есть и в PHP.  Только там вместо меток используется уровень вложенности:
Код

for ($i = 0; $i < 10; ++$i) {
    for ($j = 0; $j < 5; ++$j) {
        break 2;
    }
}

print $i; // Выведет "0"

C continue аналогично.



--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
svg
Дата 1.9.2006, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 13.4.2005

Репутация: нет
Всего: 18



- GOTO часто используют генераторы таблиц конечных автоматов - это легче, чем генерировать вложенные циклы или подпрограммы;
- из соображений эффекивности, try/catch - довольно ресурсоемкая конструкция;
- на этапе раскрутки, если машина языка использует самораскрутку для загрузки и "более правильные"  механизмы
на данном этапе еще не доступны.


PM MAIL   Вверх
Void
Дата 1.9.2006, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 9
Всего: 173



Цитата(svg @  1.9.2006,  14:01 Найти цитируемый пост)
GOTO часто используют генераторы таблиц конечных автоматов - это легче, чем генерировать вложенные циклы или подпрограммы;

Кое-где выручает pattern-matching.
Цитата(svg @  1.9.2006,  14:01 Найти цитируемый пост)
из соображений эффекивности, try/catch - довольно ресурсоемкая конструкция;

It depends. Во многих реализациях C++, (вроде и в Java/.NET тоже) проход try-блока без проброса исключения обходится лишь в несколько дополнительных машинных инструкций. А вот возбуждение исключения — обычно дорогое удовольствие.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Cr@$h
Дата 1.9.2006, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
***


Профиль
Группа: Участник Клуба
Сообщений: 1693
Регистрация: 3.4.2005
Где: Санкт-Петербург, Россия

Репутация: 1
Всего: 41



Цитата(Bikutoru @  1.9.2006,  12:58 Найти цитируемый пост)
Кстати подобная вещь есть и в PHP.

Так уже три языка, выходящие из положения при вложенных циклах: Fortran, Java, PHP.
Теперь мне так стало интересно увидеть примеры по:

Цитата(Cr@$h @  31.8.2006,  19:11 Найти цитируемый пост)
Цитата(albertn @  31.8.2006,  10:36 )
Цитата

Кстати я где-то слышал, что создатели php сказали, что в некоторых ситуациях просто необходимо использование goto.
 


Цитата(svg @  1.9.2006,  13:01 Найти цитируемый пост)
GOTO часто используют генераторы таблиц конечных автоматов - это легче, чем генерировать вложенные циклы или подпрограммы;

Хорошо бы пример. Мы же исследуем вопрос и хотим точно определить что и когда.

Цитата(svg @  1.9.2006,  13:01 Найти цитируемый пост)
из соображений эффекивности, try/catch - довольно ресурсоемкая конструкция;

Можно на этапе отладки использовать на самом верху кода, а потом все свойства очистить, и проект заработает побыстрее.
Скорость? А что ты ожидал в управляемом коде. Нет, практика исключений очень хорошая и полезная вещь, не стоит её на что-то менять. Так что её редлагаю не go to smile

Цитата(svg @  1.9.2006,  13:01 Найти цитируемый пост)
- на этапе раскрутки, если машина языка использует самораскрутку для загрузки и "более правильные"  механизмы
на данном этапе еще не доступны.

Лично я не понял последних двух предложений. Поясни, пожалуйста.

Цитата(Void @  1.9.2006,  18:19 Найти цитируемый пост)
It depends. Во многих реализациях C++, (вроде и в Java/.NET тоже) проход try-блока без проброса исключения обходится лишь в несколько дополнительных машинных инструкций. А вот возбуждение исключения — обычно дорогое удовольствие. 

Согласен. К тому же не вижу необходимой большой скороксти во время обработки и возбуждения исключения. Всё равно отказ произошёл. Тут время терпит как раз. Мы же не про системы реального времени говорим.

Цитата(Void @  1.9.2006,  18:19 Найти цитируемый пост)
Кое-где выручает pattern-matching.

Если примеры появятся, обрати внимание, можно ли pattern-matching-ом обойти, хорошо.  smile 
PM MAIL ICQ   Вверх
svg
Дата 4.9.2006, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 13.4.2005

Репутация: нет
Всего: 18



Цитата(Cr@$h @  1.9.2006,  19:56 Найти цитируемый пост)
Цитата(svg @  1.9.2006,  13:01 Найти цитируемый пост)
GOTO часто используют генераторы таблиц конечных автоматов - это легче, чем генерировать вложенные циклы или подпрограммы;

Хорошо бы пример. Мы же исследуем вопрос и хотим точно определить что и когда.


псевдокод привести трудно, можно посмотреть  код генерируемый lex или yacc.
Он изобилует переходами goto по таблицам переходов.


Цитата(Cr@$h @  1.9.2006,  19:56 Найти цитируемый пост)
Цитата(svg @  1.9.2006,  13:01 Найти цитируемый пост)
- на этапе раскрутки, если машина языка использует самораскрутку для загрузки и "более правильные"  механизмы
на данном этапе еще не доступны.

Лично я не понял последних двух предложений. Поясни, пожалуйста.


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

PM MAIL   Вверх
Cr@$h
Дата 4.9.2006, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
***


Профиль
Группа: Участник Клуба
Сообщений: 1693
Регистрация: 3.4.2005
Где: Санкт-Петербург, Россия

Репутация: 1
Всего: 41



Цитата(svg @  4.9.2006,  21:40 Найти цитируемый пост)
псевдокод привести трудно, можно посмотреть  код генерируемый lex или yacc.
Он изобилует переходами goto по таблицам переходов.

Всё, теперь понял. Про генерируемый код можно вообще такого наприводить... Но это уже не проблема для программиста, я считаю. Редко генерируемый код меняют и дополняют. С UML другой вопрос, но там и goto если только в блок-схемах встретишь. Я не видел.

Цитата(svg @  4.9.2006,  21:40 Найти цитируемый пост)
Я имел в виду распространенную технологию bootstrapping, когда система саморасширяется от минимального ядра,
наращивая возможности и добавляя новые примитивы.
В явном виде я такое наблюдал в  простых интерпретаторах, где процесс было легко и нелениво отследить по исходникам.

Да, вот это уже нехорошо.

PM MAIL ICQ   Вверх
Void
Дата 4.9.2006, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 9
Всего: 173



Цитата(Void @  1.9.2006,  19:19 Найти цитируемый пост)
GOTO часто используют генераторы таблиц конечных автоматов - это легче, чем генерировать вложенные циклы или подпрограммы;

Кое-где выручает pattern-matching.

псевдокод привести трудно, можно посмотреть  код генерируемый lex или yacc.

Интересно, что я, отвечая, имел в виду именно вывод ocamllex и ocamlyacc smile


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Fiyanov
Дата 2.4.2008, 08:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 255
Регистрация: 19.4.2007
Где: Kazakhstan->Te mirtau

Репутация: нет
Всего: 2



Всё хорошо в меру. Так же дело обстоит и с применением GOTO. 
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила раздела "Философия программирования":
Се ля ви

Форум "Философия программирования" предназначен для обсуждения вопросов, так или иначе связанных с философскими аспектами разработки ПО:

• вопросы перспективного развития методов написания ПО;

• изменяющиеся языки и методологии программирования;


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Се ля ви.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Философия программирования | Следующая тема »


 




[ Время генерации скрипта: 0.0584 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.