goto или while true do ?
← →
Дмитрий С ©
(2010-05-12 09:24) [0]
Subj. И то и то обычно считается злом, но что хуже/лучше и почему? И вообще откуда это взялось?
← →
RWolf ©
(2010-05-12 09:40) [1]
из статьи Дейкстры «О вреде оператора GOTO».
← →
Dimka Maslov ©
(2010-05-12 09:40) [2]
Из-за отсутствия «цикла c выходом посередине»
← →
Ega23 ©
(2010-05-12 09:47) [3]
> И то и то обычно считается злом
Почему?
Ну с goto я ещё как-то могу понять, но почему while true?
← →
icWasya ©
(2010-05-12 09:50) [4]
Не плыви по течению, не плыви против течения — плыви туда, куда тебе нужно. ©
← →
RWolf ©
(2010-05-12 09:51) [5]
> Ну с goto я ещё как-то могу понять, но почему while true?
считается, что, если в тексте программы не практикуется выход из циклов через Break и т. п., такой код читать легче.
← →
boriskb ©
(2010-05-12 10:07) [6]
> Ega23 © (12.05.10 09:47) [3]
>Почему?
Насколько я помню, это идет из теории программирования. А именно — доказательства безошибочности алгоритма.
С указанными конструкциями доказать невозможно, без них возможно.
P.S.
Если паять меня подвела — старшие товарищи меня поправят :))
← →
12 ©
(2010-05-12 10:13) [7]
откуда пошло — Э. Дейкстра “Go To Statement Considered Harmful”
Goto обычно можно переписать
<инициализация цикла>
WHILE <условие ограничения поиска> AND (<условие окончания поиска>) DO
END WHILE
проблема, имхо, в искусственности приема
писать надо
<инициализация цикла>
<условие ограничения поиска>
<условие окончания поиска>
причем <инициализация цикла> обычно дублирует <условие ограничения поиска> и/или <условие окончания поиска>
Ученик спросил Учителя:
— Учитель, плыть ли мне по жизни по течению или же против течения?
— Плыви туда, куда тебе надо.
← →
Игорь Шевченко ©
(2010-05-12 10:18) [8]
boriskb © (12.05.10 10:07) [6]
> Насколько я помню, это идет из теории программирования.
> А именно — доказательства безошибочности алгоритма.
> С указанными конструкциями доказать невозможно, без них
> возможно.
Да, именно так. А про читаемость и проч. уже последователи пророка придумали, чтобы количество правоверных увеличивать.
← →
RWolf ©
(2010-05-12 10:42) [9]
и что, действительно можно доказать безошибочность?
тогда почему этого до сих пор не делают компиляторы?
← →
Leonid Troyanovsky ©
(2010-05-12 10:51) [10]
> boriskb © (12.05.10 10:07) [6]
> А именно — доказательства безошибочности алгоритма.
Наверное, конечности времени работы, или отсутствия зацикливания.
Кста, ЕМНИП, ссылки вперед допустимы.
—
Regards, LVT.
← →
Игорь Шевченко ©
(
RWolf © (12.05.10 10:42) [9]
> и что, действительно можно доказать безошибочность?
как все запущено…можно
← →
Юрий Зотов ©
(2010-05-12 11:06) [12]
> RWolf © (12.05.10 10:42) [9]
Насколько я понимаю, компиляторы именно это и делают, в той или иной степени. Но безошибочность алгоритма еще не означает безошибочности программы.
← →
Mystic ©
(2010-05-12 11:10) [13]
Имхо, зло это бездумное следование догмам 🙂
Кстати, в Ada даже есть специальная конструкция для бесконечного цикла:
loop
// . ..
end loop;
Лично я большой сторонник бесконечных циклов, что делает код проще модифицируемым и однотипным.
Ну а goto в умеренных количествах использовать можно. Если имеется нетривиальная алгоритмическая логика, то вряд ли использование кучи флагов для организации нужного goto вряд ли делает код понятнее 🙂
← →
Mystic ©
(2010-05-12 11:15) [14]
> и что, действительно можно доказать безошибочность?
Смотри в сторону функциональных языков (типа Haskell), там это иногда используется. Проблемы с доказательством больше создает императивность языка 🙂
← →
Ega23 ©
(2010-05-12 11:18
loop
// ...
end loop;
Такое и Visual Basic вроде как есть.
← →
Суслик__
(2010-05-12 11:47) [16]
я использую иногда и то и другое.
не вижу проблем.
← →
Palladin ©
(2010-05-12 11:56) [17]
Суслик походу и второй пароль забыл )
← →
brother ©
(2010-05-12 12:00) [18]
> Суслик походу и второй пароль забыл )
почему?
← →
Palladin ©
(2010-05-12 12:01) [19]
уже два прочерка в конце ника
← →
brother ©
(2010-05-12 12:06) [20]
так он не зарегеный, там пасов же нет?
← →
Anatoly Podgoretsky ©
(2010-05-12 12:09) [21]
> Mystic (12. 05.2010 11:10:13) [13]
loop = while true
← →
Anatoly Podgoretsky ©
(
> Palladin (12.05.2010 11:56:17) [17]
Ты Суслика видишь, а он есть.
← →
brother ©
(2010-05-12 12:11) [23]
> Ты Суслика видишь
я вижу — набор байт…
← →
Anatoly Podgoretsky ©
(2010-05-12 12:11) [24]
> Palladin (12.05.2010 12:01:19) [19]
Надо звездочки рисовать, как на самолетах.
← →
Плохиш ©
(2010-05-12 12:17) [25]
> И то и то обычно считается злом, но что хуже/лучше и почему?
Когда коту делать нечего он яйца чешет.
← →
Mystic ©
(2010-05-12 12:22) [26]
> loop = while true
В Ada такой синтаксис:
loop while I >= 0
I := I - 1;
end loop;
просто while необязателен.
← →
oxffff ©
(2010-05-12 12:25) [27]
Отладчик в D2010 не хочет останавливаться на строчке
while TRUE do <- Здесь не брякается
……….
end
← →
oxffff ©
(2010-05-12 12:28
Вот кусок моего кода
while TRUE do
case PascalLRAnalizer.DoOnSymbol(PASCAL_GRAMMAR.FinalTerminal,nil,0) of
STATUS_CONTINUE:;
STATUS_PASS:break;
. …
end
except
end;
Брякается только на строчке case в 2010, поскольку условие не проверяется. Оно вроде и понятно, но как то неудобно.
← →
Anatoly Podgoretsky ©
(2010-05-12 15:16) [29]
> oxffff (12.05.2010 12:25:27) [27]
do перенесил на другую строку.
← →
Игорь Шевченко ©
(2010-05-12 15:43) [30]
oxffff © (12.05.10 12:28) [28]
> case PascalLRAnalizer
Англичане пишут Analyser
← →
oxffff ©
(2010-05-12 15:55) [31]
> Игорь Шевченко © (12.05.10 15:43) [30]
> oxffff © (12. 05.10 12:28) [28]
>
>
> > case PascalLRAnalizer
>
>
> Англичане пишут Analyser
Исправил. 🙂
← →
Mystic ©
(2010-05-12 18:11) [32]
> Англичане пишут Analyser
Ага, и colour.
← →
Mystic ©
(2010-05-12 18:16) [33]
Кстати, вместо while true do всегда упорно пишу repeat until False;
И сейчас задумался, какую бы константу в своем модуля объявить для значения False?
например,
const
Apocalypto = False;
repeat
// ..
until Apocalypto;
Есть выражение «до нових вiникiв», но как-то писать
repeat
// ...
until NewBroom;
не звучит. .. until TurningBlue?
← →
turbouser ©
(2010-05-12 18:31) [34]
> Mystic © (12.05.10 18:16) [33]
until MorkovkinoZagovenie
← →
Игорь Шевченко ©
(2010-05-12 18:34) [35]
> например,
>
>
> const
> Apocalypto = False;
>
> repeat
> // ..
> until Apocalypto;
кандидат на увольнение 🙂
← →
Дмитрий С ©
(2010-05-12 19:04) [36]
лингва подсказывает:
until further_orders
until it_comes_to_the_push
Особенно понравилось:
until hell_freezes_over
← →
_Юрий ©
(2010-05-12 20:46) [37]
until CancerWhistleOnHill ?
← →
[true]TRIx ©
(2010-05-12 21:14) [38]
while true do это же круто! как писать, если надо зациклить выполение?
← →
Petr V. Abramov ©
(2010-05-12 22:53) [39]
> Mystic © (12.05.10 12:22) [26]
> loop
> // …
> end loop;
ага, а в PL/SQL (про который честно сказано, что он несколько содран с ada)
есть
loop
// do smth
exit when условие
// do smth
end loop
в зависимости от того, где поставить exit when, получаем while … do, repeat … until и на что фантазии хватит.
← →
GrayFace ©
(2010-05-13 08:35) [40]
И то, и другое — добро.
Mystic © (12.05.10 11:10) [13]
Ну а goto в умеренных количествах использовать можно. Если имеется нетривиальная алгоритмическая логика, то вряд ли использование кучи флагов для организации нужного goto вряд ли делает код понятнее 🙂
Слабо представляю такую логику.
Mystic © (12.05.10 18:16) [33]
Лучшеconst
True = False;
repeat
until True;
while true do читается гораздо проще, чем двойное отрицание в until false.
Delphi XE
Product
самое быстрое решение для разработки программного обеспечения на Delphi ускоряющее проектирование, программирование и создание взаимодействующих приложений для Windows, Mac, iOS, Android и IoT.
Embarcadero® Delphi XE — это самое быстрое решение для разработки программного обеспечения на C++, ускоряющее проектирование, программирование и создание взаимодействующих приложений для Windows, Mac, iOS, Android и IoT. Создавайте готовые решения корпоративного класса, включая в него разные клиентские native-платформы, мобильные расширения, интеллектуальные устройства, облачные службы, корпоративные и встроенные базы данных. FireUI ускоряет разработку пользовательских интерфейсов для различных форм-факторов на основе единой формы. Существующие приложения можно дополнить новыми возможностями IoT, включая информирование о приближении. Готовое решение Enterprise Mobility Services позволяет подключаться к корпоративным базам данных и публиковать самостоятельно созданные REST API с аналитическими возможностями.
DELPHI XE8 ARCHITECT
Embarcadero® Delphi XE8 Architect — это самое быстрое решение для разработки программного обеспечения на Delphi ускоряющее проектирование, программирование и создание взаимодействующих приложений для Windows, Mac, iOS, Android и IoT, которые интегрируются с корпоративными СУБД. Delphi Architect содержит среду визуального моделирования данных ER/Studio Developer Edition, позволяющую разработчикам наиболее эффективно использовать корпоративные структуры и базы данных.
DELPHI XE ULTIMATE
Embarcadero® Delphi XE8 Ultimate — это самое быстрое решение для разработки программного обеспечения, предназначенное для разработчиков ПО и рабочих групп, которые занимаются созданием, администрированием и настройкой взаимодействующих приложений, интенсивно работающих с базами данных и интегрированных с корпоративными СУБД. Delphi XE8 Ultimate поддерживает все возможности редакции Enterprise, а также содержит средства разработки, настройки и профилирования кода SQL и средства управления изменениями в базе данных, обеспечиваемые DB PowerStudio® (редакция Developer).
DELPHI XE ENTERPRISE
Embarcadero® Delphi XE8 Enterprise — это самое быстрое решение для разработки программного обеспечения, предназначенное для независимых и корпоративных разработчиков. Создавайте клиент-серверные и многоуровневые взаимодействующие приложения, подключающиеся к широкому спектру корпоративных баз данных и облачных платформ, включая Microsoft SQL Server, DB2, Oracle, Sybase, InterBase, Amazon и Microsoft Azure. Delphi Enterprise поддерживает все возможности редакции Professional, а также обеспечивает подключение к корпоративным данным с помощью DataSnap SDK и содержит лицензию разработчика на Enterprise Mobility Services.
DELPHI XE PROFESSIONAL
Embarcadero® Delphi XE8 Professional — это самое быстрое решение для разработки программного обеспечения, предназначенное для быстрого проектирования, кодирования и расширения взаимодействующих приложений для Windows, Mac, iOS, Android и IoT. Быстрее создавайте современные приложения для нескольких платформ в рамках одного проекта разработки, используя все мощные возможности языка Delphi.
MOBILE ADD-ON PACK ДЛЯ DELPHI XE PROFESSIONAL
Пакет Mobile Add-On Pack для Delphi XE8 Professional расширяет возможности этой среды, позволяя создавать подключенные мобильные приложения для Android и iOS из единой кодовой базы Delphi.
Требуется: Delphi XE8 Professional
FIREDAC CLIENT/SERVER PACK для DELPHI XE PROFESSIONAL
Пакет FireDAC Client/Server Add-On Pack обеспечивает клиент-серверное подключение к базам данных и поддерживает дополнительные корпоративные базы данных в Delphi XE8 Professional. Благодаря своей универсальной и высокоэффективной архитектуре FireDAC обеспечивает прямой доступ приложений к Oracle, SQL Server, InterBase, DB2, Firebird, SQLite, MySQL, PostgreSQL, SQL Anywhere, Advantage DB, Access, Informix, DataSnap и т. д.
Содержит лицензию разработчика на Enterprise Mobility Services
DELPHI XE STARTER
Delphi® XE8 Starter — это отличный способ начать создание высокопроизводительных приложений для Windows на Delphi. В редакцию Delphi Starter входит упрощенная интегрированная среда разработки (IDE), динамически загружаемые пользовательские модули Microsoft ISAPI Delphi (32- и 64-разрядные), интегрированный отладчик, двусторонние визуальные конструкторы для ускорения разработки, сотни визуальных компонентов и ограниченная лицензия на коммерческое использование. В Delphi Starter не входят компоненты баз данных и драйверы.
ОБНОВЛЕНИЕ DELPHI XE8 с редакции STARTER
Пользователи редакции Delphi Starter имеют право на скидку при переходе на любую другую редакцию.
Доступно зарегистрированным пользователям редакции Delphi Starter версий XE4–XE7.
Syntax Censor — WITH, GOTO и LABEL — Дебаты разработчиков Delphi
См. также пост Яна, в котором есть копии слайдов, а также ссылка на повтор вебинара YouTube, когда он будет доступен.
Обязательно присоединяйтесь к нам в следующих дебатах разработчиков Delphi. ]
Вот результаты опроса MVP. Обязательно присоединяйтесь к вебинару для подробного обсуждения.
Ниже приведены некоторые из моих соображений, которые я могу рассмотреть в ходе этих дебатов разработчиков. Я также включил пару ссылок на дополнительные ресурсы.
Оператор WITH
Мое мнение: «Устареть и выдать предупреждение». Почему? Существует много существующего исходного кода, в котором используется оператор WITH. Предупреждение поможет разработчикам определить возможные проблемы для любых операторов WITH.
Некоторые возможные причины использования или отказа от оператора WITH:
- Причина использования WITH — делает код более легким для чтения и менее многословным.
- Причины, по которым следует избегать использования WITH — измененный код может незаметно изменить программу без предупреждения. Трудно использовать некоторые функции отладчика (например, проверять).
Примечание. Меня можно было бы убедить изменить свое мнение об операторе WITH, если бы в среде IDE была более тесная (лучше?) интеграция между проектом, редактором, отладчиком и системой управления изменениями, которая предупреждала разработчиков о том, что на использование оператора WITH влияет изменение.
Оператор GOTO и LABEL
Мой вывод: отказаться от поддержки и выдать предупреждение. Почему? Может быть какой-то устаревший код, который все еще включает GOTO и LABEL. Предупреждение поможет идентифицировать код и позволит разработчикам рассмотреть возможные структурированные альтернативы.
Некоторые возможные причины использования GOTO и Label:
- Причина использования GOTO – GOTO позволяет безоговорочно просто передать управление программой. Компилятору легко оптимизировать машинный код. Причины использования LABEL — целевое местоположение для GOTO. Задокументируйте часть кода.
- Причины, по которым следует избегать GOTO — использование может привести к созданию спагетти-кода. Можно использовать в структурированном программировании, но только с тщательным обдумыванием и постоянной бдительностью.
Дополнительные ссылки
Письма в редакцию: перейти к заявлению, которое Эдсгер В. Дейкстра считает вредным doi/pdf/10. 1145/362929.362947
«В течение ряда лет я был знаком с наблюдением, что качество программистов является убывающей функцией плотности операторов перехода в создаваемых ими программах. Совсем недавно я обнаружил, почему использование оператора go to имеет такие катастрофические последствия, и я пришел к убеждению, что оператор go to должен быть упразднен во всех языках программирования более высокого уровня (то есть во всем, кроме, возможно, простого машинного кода)… Безудержное использование оператора go to имеет прямое следствие того, что становится ужасно трудно найти осмысленный набор координат для описания хода процесса… Оператор go to в его нынешнем виде слишком примитивен; это слишком большое приглашение испортить программу».
Архив Эдсгера В. Дейкстры – https://www.cs.utexas.edu/users/EWD/
C2 Wiki – https://wiki.c2.com/?GotoConsideredHarmful
Почему Pascal не является моим любимым языком программирования Брайан В. Керниган, 2 апреля 1981 г. – AT&T Bell Laboratories
https://www. cs.virginia.edu/~evans/cs655/readings/bwk-on-pascal.html
Заявление GOTO Статья в Википедии – https: //en.wikipedia.org/wiki/Goto
Заявление GOTO языка C – https://en.cppreference.com/w/c/language/goto
Заявление о переходе на язык C++ — https://en.cppreference.com/w/cpp/language/goto
Сокращение времени разработки и ускорение выхода на рынок с помощью RAD Studio, Delphi или C++Builder.
Дизайн. Код. Скомпилировать. Развертывать.
Начните бесплатную пробную версию Обновите сегодня
Бесплатная версия Delphi Community Бесплатная версия C++Builder Community Edition
Управление согласием
Есть ли в delphi ситуация, когда GOTO является единственным решением?
спросил
Изменено 9 лет, 6 месяцев назад
Просмотрено 2к раз
Оператор goto
является табу на моей работе.
Возникает следующий вопрос…
Возможна ли ситуация, когда перейти к
является единственным допустимым решением?
- делфи
- перейти
12
Первоначально GOTO был добавлен в Pascal для обработки ошибок, включая межпроцедурные формы, которые Borland(/Embarcadero) никогда не реализовывала (пример: GOTO от внутренней процедуры к родительской), точно так же, как Borland никогда не реализовывал другие функции внутренних функций, такие как передача внутренних функций к параметрам процедурного типа.(*)
Таким образом, GOTO можно считать предшественником исключений.
Есть еще несколько практических применений: в последний раз, когда я проверял, выход из вложенного оператора IF с помощью goto был в Delphi быстрее, чем выход кода из вложенного оператора if естественным образом. Подобные оптимизации иногда используются, например. код сжатия и другой сложный код обработки дерева с глубоко вложенными циклами или условными операторами.
Такие подпрограммы часто все еще используют goto для обработки ошибок, потому что это быстрее. (исключения не только медленные, но и их граничные условия препятствуют некоторым оптимизациям).
Можно было бы рассматривать это как часть уровня простого Паскаля Object Pascal, точно так же, как C++ по-прежнему позволяет почти полностью использовать простой C.
(конечно, поскольку оптимизированный код сжатия в Delphi поставляется только в форме .o, трудно найти примеры в кодовой базе Delphi. В коде JPEG есть некоторые, но это C-трансляция)
(*) Оригинальный паскаль, а IIRC даже Turbo Pascal не позволяет преждевременно выйти из процедуры с помощью EXIT. То же самое для CONTINUE и BREAK.
1
Возможна ли ситуация, когда
GOTO
является единственным допустимым решением?
Я полагаю, это зависит от того, что вы подразумеваете под действительным. Я полагаю, вы спрашиваете, существует ли программа, которую можно написать только с использованием оператора goto
. В таком случае ответ заключается в том, что такой программы нет. Delphi — это Тьюринг в комплекте с оператором goto
или без него.
Однако, если мы готовы расширить обсуждение, включив в него другие языки, бывают ситуации, когда goto
— хорошее решение, даже лучшее решение. Сценарий, который чаще всего приходит на ум, — это реализация очистки и обработки ошибок на языках без структурированной обработки исключений. Если вы просмотрите исходный код Linux, вы обнаружите, что goto
широко используется. Я ожидаю, что то же самое верно и для исходного кода Windows.
Гото очень стар. Он предшествует подпрограммам, таким как функции и процедуры! Это также очень опасно и может сделать ваш код менее читаемым (для других или для вас через несколько месяцев).
Теоретически невозможна ситуация, когда требуется goto. Я не буду повторять здесь теорию о ленточных машинах Тьюринга, но, используя выборку и итерацию, вы можете переупорядочить код так, чтобы при всех возможных входных значениях получался один и тот же результат.
На практике, однако, иногда бывает «удобнее» и «лучше читаемо» «отпрыгнуть» от потока кода в определенных условиях, и именно здесь появляются исключения.0154 перейти к ближайшему наконец
или кроме раздела
. Это безопаснее, потому что они работают каскадно и обеспечивают лучший способ обработки контекста в случае одного из этих граничных условий. (А еще есть перерыв
и прерывание
и выход
)
4
GOTO
никогда не требуется. Любой вычислимый алгоритм может быть выражен присваиванием и комбинацией ЕСЛИ
… ТО
, НАЧАЛО
… КОНЕЦ
, и ПОКА
..