![]() |
|
Модераторы: Се ля ви |
![]()
|
|
| Cr@$h |
|
||||||
![]() Исследователь ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1693 Регистрация: 3.4.2005 Где: Санкт-Петербург, Россия Репутация: 1 Всего: 41 |
Да. Например, выход из вложенных циклов. Здесь goto наоборот упрощает код и не делает из него лапши. Так что Дейкстра Дейкстрой, а собственную голову ещё нкто не отменял. В Fortran, кстати, даже для выхода из вложенных циклов не нужен goto, т.к. циклам можно давать имена:
Точно так же можно было бы написать cycle MainLoop -- тогда бы начали следующую итерацию внешнего цикла (аналог continue). Имена могли дать и двум другим циклам. И это ни какие не метки, в Fortran метки -- это вообще целые числа, с которых начинаются строки:
Сами числа выделяются в современных редакторах красным цветом. ![]() Не знаю других языков, где можно было бы так обходиться без меток (не создавая лапши и доп. переменных в таких случаях). Тем не менее, в существующем коде Fortran меток очень много, т.к. язык совершенствуется. Если разговор о goto зайдёт дальше, можно будет выделить в отдельную тему. Это сообщение отредактировал(а) Cr@$h - 31.8.2006, 18:17 |
||||||
|
|||||||
| Void |
|
||||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 9 Всего: 173 |
Кстати, в Java есть та же фишка: break по именованным блокам.
Эта возможность вкупе с finally-блоками (или их аналогами), на мой взгляд, практически устраняет потребность в goto. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
||||
|
|||||
| Cr@$h |
|
|||
![]() Исследователь ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1693 Регистрация: 3.4.2005 Где: Санкт-Петербург, Россия Репутация: 1 Всего: 41 |
Интересно, а continue outer; можно писать? Ну, чтобы начать следующую итерацию внешнего цикла. Надеюсь, вложенность именнованных блоков поддерживается. А с finaly-блоками примерчик мона?
|
|||
|
||||
| Void |
|
||||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 9 Всего: 173 |
Да. Да. Я имел в виду один из наиболее распространённых сценариев использования goto, пошедший, по всей видимости, из Си: обработка ошибок и освобождение ресурсов.
В Java/.NET используют вложенные try..[catch]..finally блоки.
-------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
||||
|
|||||
| Cr@$h |
|
|||
![]() Исследователь ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 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 |
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 9 Всего: 173 |
В С++ есть RAII: ресурсы инкапсулируются объектами и освобождаются при вызове деструкторов этих объектов при выходе из блока (нормально или пробросом исключения). -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| Cr@$h |
|
|||
![]() Исследователь ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1693 Регистрация: 3.4.2005 Где: Санкт-Петербург, Россия Репутация: 1 Всего: 41 |
Да, тоже полезно. Но при исключениях, коечно, этого бывает не достаточно. Иногда информацию о самом исключении или ошибке полезно писать. Тут автоматическим вызовом деструктора не обойтись. В шарпах, вроде, тоже что-то вызывается у объекта, но я не практиковал... |
|||
|
||||
| Bikutoru |
|
||||
|
Увлекающийся ![]() ![]() Профиль Группа: Участник Сообщений: 522 Регистрация: 24.5.2005 Где: Москва Репутация: нет Всего: 22 |
Кстати подобная вещь есть и в PHP. Только там вместо меток используется уровень вложенности:
C continue аналогично. -------------------- Человек, словно в зеркале мир — многолик, Он ничтожен — и он же безмерно велик! Омар Хайям |
||||
|
|||||
| svg |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 53 Регистрация: 13.4.2005 Репутация: нет Всего: 18 |
- GOTO часто используют генераторы таблиц конечных автоматов - это легче, чем генерировать вложенные циклы или подпрограммы;
- из соображений эффекивности, try/catch - довольно ресурсоемкая конструкция; - на этапе раскрутки, если машина языка использует самораскрутку для загрузки и "более правильные" механизмы на данном этапе еще не доступны. |
|||
|
||||
| Void |
|
||||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 9 Всего: 173 |
Кое-где выручает pattern-matching.
It depends. Во многих реализациях C++, (вроде и в Java/.NET тоже) проход try-блока без проброса исключения обходится лишь в несколько дополнительных машинных инструкций. А вот возбуждение исключения — обычно дорогое удовольствие. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
||||
|
|||||
| Cr@$h |
|
||||||||||
![]() Исследователь ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1693 Регистрация: 3.4.2005 Где: Санкт-Петербург, Россия Репутация: 1 Всего: 41 |
Так уже три языка, выходящие из положения при вложенных циклах: Fortran, Java, PHP. Теперь мне так стало интересно увидеть примеры по:
Хорошо бы пример. Мы же исследуем вопрос и хотим точно определить что и когда.
Можно на этапе отладки использовать на самом верху кода, а потом все свойства очистить, и проект заработает побыстрее. Скорость? А что ты ожидал в управляемом коде. Нет, практика исключений очень хорошая и полезная вещь, не стоит её на что-то менять. Так что её редлагаю не go to
Лично я не понял последних двух предложений. Поясни, пожалуйста. Согласен. К тому же не вижу необходимой большой скороксти во время обработки и возбуждения исключения. Всё равно отказ произошёл. Тут время терпит как раз. Мы же не про системы реального времени говорим. Если примеры появятся, обрати внимание, можно ли pattern-matching-ом обойти, хорошо. |
||||||||||
|
|||||||||||
| svg |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 53 Регистрация: 13.4.2005 Репутация: нет Всего: 18 |
псевдокод привести трудно, можно посмотреть код генерируемый lex или yacc. Он изобилует переходами goto по таблицам переходов. Я имел в виду распространенную технологию bootstrapping, когда система саморасширяется от минимального ядра, наращивая возможности и добавляя новые примитивы. В явном виде я такое наблюдал в простых интерпретаторах, где процесс было легко и нелениво отследить по исходникам. |
|||
|
||||
| Cr@$h |
|
|||
![]() Исследователь ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1693 Регистрация: 3.4.2005 Где: Санкт-Петербург, Россия Репутация: 1 Всего: 41 |
Всё, теперь понял. Про генерируемый код можно вообще такого наприводить... Но это уже не проблема для программиста, я считаю. Редко генерируемый код меняют и дополняют. С UML другой вопрос, но там и goto если только в блок-схемах встретишь. Я не видел. Да, вот это уже нехорошо. |
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 9 Всего: 173 |
Интересно, что я, отвечая, имел в виду именно вывод ocamllex и ocamlyacc -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| Fiyanov |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 255 Регистрация: 19.4.2007 Где: Kazakhstan->Te mirtau Репутация: нет Всего: 2 |
Всё хорошо в меру. Так же дело обстоит и с применением GOTO.
|
|||
|
||||
| Балабол |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 27.4.2008 Репутация: нет Всего: нет |
У меня предельно простое мнение по этому вопросу; согласно теореме Боймо-Джакопини-Милса без сего оператора можно обойтись формализуя любую мысль. И, как следствие, нужно. Поскольку он рушит структурность и семантическую целостность кода
|
|||
|
||||
![]()
|
| Правила раздела "Философия программирования": | |
|
|
Форум "Философия программирования" предназначен для обсуждения вопросов, так или иначе связанных с философскими аспектами разработки ПО: • вопросы перспективного развития методов написания ПО; • изменяющиеся языки и методологии программирования; Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Се ля ви. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Философия программирования | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |