OberonCore
https://forum.oberoncore.ru/

История с несколькими моралями (в том числе анти-FOR)
https://forum.oberoncore.ru/viewtopic.php?f=7&t=1443
Страница 6 из 7

Автор:  Alexey_Donskoy [ Вторник, 07 Апрель, 2009 21:48 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

Илья Ермаков писал(а):
Ну, напишите раздельно присваивание начального значения, а границы выделите шрифтом в исходнике.
Ну шуток только не надо, ладно?
Вот почему как один аспект - так и теория, и структурность, и всё ясно сразу;
а как другой - так шутки!
Отчего шутки? Оттого, что серьёзно лень думать, накатанная колея есть! У сторонников IT-мэйнстрима - одна, у сторонников структурного программирования - другая. Но - колея!

А задачи-то разные!
И суть их, и модель - разные!

Илья Ермаков писал(а):
конструкции соответствуют математическому пониманию алгоритмов...
Вот FOR и соответствует математическому пониманию алгоритма - выборка диапазона индексов!

Автор:  Илья Ермаков [ Вторник, 07 Апрель, 2009 21:51 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

Почему шутка?? Как раз в тему эргономики. Использование шрифтового выделения. В ББ применяется часто.

FOR - да, для именно этого момента он выразителен. Но... Неясно, как эту выразительность границ обеспечить без других изъянов... Да и не так часто это... Неясно.

Чтобы подчеркнуть границы, можно явно написать их обе в условии:
WHILE (beg <= i) & (i <= end) & ... DO

Автор:  Alexey_Donskoy [ Вторник, 07 Апрель, 2009 21:54 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

Повторяю: задачи-то разные!
И суть их, и модель - разные!

Илья Ермаков писал(а):
конструкции соответствуют математическому пониманию алгоритмов...
Вот FOR и соответствует задаче, модели и математическому пониманию алгоритма - выборка диапазона индексов!

Автор:  sia [ Вторник, 07 Апрель, 2009 22:54 ]
Заголовок сообщения:  Re: Руки прочь от FOR (и от WHILE тоже)!

Илья Ермаков писал(а):
Касательно Вирта - хоть бы думали, прежде чем писать. 55 лет - молодой? С 5 языками за спиной - тем более. Именно потому цикла FOR в Виртовском Обероне как раз НЕТ.

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


- Ну, точнее, лет на ~20 моложе, чем сейчас
- Не было в Оберон? - Значит погорячился (по молодости) :roll: .
- В Оберон-2 и Оберон-07 цикл FOR есть (правда недоделанный, к сожалению).
- Можно писать математически правильные алгоритмы, имея GOTO, Break, Return...
- Занимались программированием одни учёные, обосновывали - другие, согласен.
- Дейкстра перегнул палку, породил много неудобств своей деятельностью, ИМХО.

Автор:  Info21 [ Вторник, 07 Апрель, 2009 23:03 ]
Заголовок сообщения:  Re: Руки прочь от FOR (и от WHILE тоже)!

sia писал(а):
- Дейкстра перегнул палку, породил много неудобств своей деятельностью, ИМХО.
Совершенно очевидно, что Вы не понимаете ни цели, ни смысла, ни результатов деятельности Дейкстры.

Автор:  sia [ Вторник, 07 Апрель, 2009 23:12 ]
Заголовок сообщения:  Re: Руки прочь от FOR (и от WHILE тоже)!

Info21 писал(а):
sia писал(а):
- Дейкстра перегнул палку, породил много неудобств своей деятельностью, ИМХО.
Совершенно очевидно, что Вы не понимаете ни цели, ни смысла, ни результатов деятельности Дейкстры.


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

Автор:  Vlad [ Среда, 08 Апрель, 2009 01:06 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

Илья Ермаков писал(а):
Замечательно, все поняли, ИМХО хорошо известно. Оно аргументировано в рамках общепринятого в ИТ контекста понимания. И стиля составления алгоритмов.
Но речь о другой ситуации.


Да бросьте вы на "общепринятый ИТ" ссылаться. Я сейчас говорю исключительно за себя. И аргумент очень простой - читабельность. Ситуация все та же - есть код и надо понять, что он делает. Толку от того, что в случае WHILE у меня "целостный" предикат? Мне надо понять, что код делает, а не любоваться на этот предикат. И объединение в одну кучу итерирования и проверки на выход мне в этом никак не помогает, а наоборот.

Автор:  Madzi [ Среда, 08 Апрель, 2009 01:45 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

Algo писал(а):
2 Madzi
Интересны (действительно интересны) Ваши рассуждения на счёт исключительных ситуаций.
Как вы предлагаете обрабатывать такие ситуации:
1. Процедуры вызывают друг друга: A->B-> ... Z. В Z возникает проблема, которую имеет смысл решать только в A, цепочку вызовов же следует просто прервать. Раздувать код проверками в каждой процедуре?

2. Где-то, в глубине программы произошла ошибка, обработки которой по методике "без-исключений" предусмотрено не было (ну не учли). Ошибка не фатальная, можно было бы отменить часть действий и пойдти дальше. Как это реализовать без исключений?

Я сейчас не помню точно кто это сказал (если нужно будет уточнить, то уточню, но кажется Дейкстра): "Если в программе возникает ошибка, то программа должна завершиться аварийно, даже если ошибка не существенная и программа могла бы продолжить работать. Программа с ошибкой - вещь не допустимая."

Автор:  Vlad [ Среда, 08 Апрель, 2009 02:14 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

Madzi писал(а):
Я сейчас не помню точно кто это сказал (если нужно будет уточнить, то уточню, но кажется Дейкстра): "Если в программе возникает ошибка, то программа должна завершиться аварийно, даже если ошибка не существенная и программа могла бы продолжить работать. Программа с ошибкой - вещь не допустимая."


Ох уж эти теоретики... Вам бы понравилось, если бы винда выключала комп на каждой ошибке? :) Или если BB схлопывался на первом же сработавшем ASSERT'e? :) Зависит от ситуации. И от того, что называть "программой" ;)

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

Автор:  Madzi [ Среда, 08 Апрель, 2009 07:03 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

Vlad писал(а):
Madzi писал(а):
Я сейчас не помню точно кто это сказал (если нужно будет уточнить, то уточню, но кажется Дейкстра): "Если в программе возникает ошибка, то программа должна завершиться аварийно, даже если ошибка не существенная и программа могла бы продолжить работать. Программа с ошибкой - вещь не допустимая."


Ох уж эти теоретики...

Что поделать. Без теории никому нельзя. Иначе будем постоянно ходить по граблям.

Vlad писал(а):
Вам бы понравилось, если бы винда выключала комп на каждой ошибке? :) Или если BB схлопывался на первом же сработавшем ASSERT'e? :) Зависит от ситуации. И от того, что называть "программой" ;)

Мне бы очень понравилось, потому что винду бы не смогли продать до тех пор пока не выловили и уничтожили большинство присутствующих в ней ошибок. Не понял вашу вторую часть, несмотря на смайлик. У вас "программой" что-то ещё называется?

Vlad писал(а):
P.S. Кстати, так нелюбимые вами исключения позволяют замечательно разрулить такую ситуацию (в отличие от кошмарных кодов ошибок). А именно - отдать принятие решение о том "схлопываться" или "что-то сделать" тому, кто достаточно компетентен для этого.

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

Не знаю, что вы имели ввиду отправляя меня в википедию http://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0_%D0%B8%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B9
Википедия писал(а):
Обработка исключительных ситуаций (англ. exception handling) — механизм языков программирования, предназначенный для описания реакции программы на ошибки времени выполнения и другие возможные проблемы (исключения), которые могут возникнуть при выполнении программы и приводят к невозможности (бессмысленности) дальнейшей отработки программой её базового алгоритма. В русском языке также применяется более короткая форма термина: «обработка исключений».

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

И ответная просьба - прочтите наконец Дейкстру и воздержитесь от написания сюда постов, если они прямо противоречат тому, о чём вы прочтёте.

Автор:  Alexey_Donskoy [ Среда, 08 Апрель, 2009 07:32 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

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

Автор:  Algo [ Среда, 08 Апрель, 2009 08:48 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

Эта кровавая, беспощадная, бессмысленная и бесконечная война...
Есть мнение, что конструкции ЯП должны быть ортогональными, не синонимичными. В отличии от естественных языков.
Если в языке есть CONTINUE, тогда и WHILE и FOR могут зациклиться - ни какой ортогональности. Если есть BREAK, то FOR итерирует от a и НЕДАЛЕЕ чем до b. Случай достаточно своеобразный, достоин ли такой частный случай включения в язык?

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

Если убрать неструктурные переходы, то с ортогональностью у этих конструкций становится лучше. Но всё равно, случай такого FOR достаточно частный. Включать ли его в язык. Опять разные люди ответят по разному.

Но у обероновцев есть луч надежды. Дело в том, что обычно махровые практики не преподают, тем более в школе. Есть возможность перехватить инициативу и обучить младое поколение так как надо ;).

Автор:  igor [ Среда, 08 Апрель, 2009 09:55 ]
Заголовок сообщения:  Re: Руки прочь от FOR (и от WHILE тоже)!

sia писал(а):
... Д.Кнут писал на асемблере, пользовал метки и "GOTO", и оттого его
алгоритмы не стали хуже. Структурность не догма, и думаю не стоит
размахивать ею как жупелом. Ну а истина скорее где-то посередине.
sia писал(а):
- Можно писать математически правильные алгоритмы, имея GOTO, Break, Return...
Важно понимать, что корень зла не в самом GOTO, а в том, как его использовать. Программист, который в детстве читал правильные книжки, может создавать структурные программы на любом императивном языке.

PS Как тут не вспомнить:
-- Что-то у меня программа не работает, вот глянь сырцы.
-- Так у тебя же ошибка!
-- Где? В программе?
-- Нет. В ДНК!

Что касается RETURN внутри цикла, то я вот о чём подумал. В отличие от Break и Continue, RETURN обеспечивает выход из текущего блока во внешний. Может поэтому Н. Вирт его оставил в языке? Ведь, если соблюдать правильный стиль, и не использовать безрассудно внутри процедуры глобальные переменные, то после выхода из процедуры по RETURN, уже не актульно выполнятся ли инвариант цикла (в котором стоит RETURN), так как область видимости данной процедуры становиться недоступной.
И всё же, высказанная мной мысль вызывает у меня сомнения. Интересно, что думают другие по этому поводу :)

Автор:  Info21 [ Среда, 08 Апрель, 2009 10:30 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

Vlad писал(а):
Ох уж эти теоретики...
Ох уж эти рукосуи...

Автор:  Alexey_Donskoy [ Среда, 08 Апрель, 2009 10:44 ]
Заголовок сообщения:  Re: Руки прочь от FOR (и от WHILE тоже)!

Игорь Лоскутов писал(а):
после выхода из процедуры по RETURN, уже не актульно выполнятся ли инвариант цикла (в котором стоит RETURN), так как область видимости данной процедуры становиться недоступной.
Согласен!

Автор:  Axcel [ Среда, 08 Апрель, 2009 10:55 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

Мне кажется, что если отбросить субъективные предпочтения, можно выделить следующие моменты:
1. Вполне нормальное желание программиста (особенно начинающего) выделить безусловно понятную часть и "начать думать над непонятной", и FOR для этого как бы подходит.
2. Вполне "эргономичное" желание отделить тривиальную итерационную часть от "содержательной".

Ну а дальше? схема-то не универсальна, только для индексируемых последовательностей, для списков (или таблиц) все равно придеться использовать WHILE. И потом получается, что совершенно одинаковые по смыслу действия для массивов будем делать через FOR с ретоном, а для списков через WHILE. Мне это надо? Мне это не надо.
Выигрываешь в читабельности (допустим) маленького кусочка кода, зато проигрываешь в восприятии программы. И в голове каша, причем, что характерно, как у писателя, так и у читателя.

Один раз разобрался с WHILE и все, можно применять практически в любом месте, для любой последовательности, настоящий инвариант (и только чуть чуть останется для LOOP).

Автор:  Валерий Лаптев [ Среда, 08 Апрель, 2009 12:03 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

Madzi писал(а):

По поводу исключений скажу следующее: любое исключение это тот же самый GOTO на обработку ошибок (отложенная обработка). Появились исключения не от хорошей жизни, а от упавшего уровня программистов разработчиков, которые вместо грамотного построения программы "ловят" ошибки на выходе.
Рассмотрим пример:
try {
foo ();
} catch (Exception e) {
...
} // Java

Функция foo (); содержит (может содержать) ошибку, в результате которой возникает исключение.
Есть механизмы определить что это за ошибка (хотя можно привести пример, когда одна и та же ошибка может возникать в двух разных местах процедуры foo (); и требовать разной обработки). Несомненно, что исключения нужны для того, чтобы иметь возможность обработать ошибку. Этим занимается секция catch. В случае когда мы ЗНАЕМ какие ошибки могут возникнуть в foo ();, то мы МОЖЕМ написать адекватную процедуру обработки (но могут быть случаи, когда зная написать адекватную процедуру мы не можем (когда одна и та же ошибка может возникнуть в разных местах)). Если мы НЕ ЗНАЕМ какие ошибки могут возникнуть в foo (); (например библиотека стороннего разработчика и он открыл только часть исключений), то грамотно обработать ситуацию мы не можем.

Неверно!
Исключения поддерживают как раз ИЗВЕСТНЫЕ ошибки, проверяемые и запускаемые явным образом с помощью оператора throw. То есть, программист при реализации должен подумать, какие ошибки могут возникнуть, и что с этим делать.
А то, что вы описываете как НЕИЗВЕСТНЫЕ ошибки - это крах системы и посмертный дамп. Что мы наблюдаем в ББ для ЛЮБЫХ ошибок.

Автор:  igor [ Среда, 08 Апрель, 2009 12:11 ]
Заголовок сообщения:  Re: Руки прочь от FOR (и от WHILE тоже)!

Alexey_Donskoy писал(а):
Игорь Лоскутов писал(а):
после выхода из процедуры по RETURN, уже не актульно выполнятся ли инвариант цикла (в котором стоит RETURN), так как область видимости данной процедуры становиться недоступной.
Согласен!
Опять же оговорюсь, что если в условии цикла были использованы глобальные переменные, то они доступны и после выхода из процедуры, и актуальность, о которой я говорил, тогда остаётся.

Автор:  Madzi [ Среда, 08 Апрель, 2009 13:05 ]
Заголовок сообщения:  Re: Руки прочь от FOR (и от WHILE тоже)!

Игорь Лоскутов писал(а):
Что касается RETURN внутри цикла, то я вот о чём подумал. В отличие от Break и Continue, RETURN обеспечивает выход из текущего блока во внешний. Может поэтому Н. Вирт его оставил в языке? Ведь, если соблюдать правильный стиль, и не использовать безрассудно внутри процедуры глобальные переменные, то после выхода из процедуры по RETURN, уже не актульно выполнятся ли инвариант цикла (в котором стоит RETURN), так как область видимости данной процедуры становиться недоступной.
И всё же, высказанная мной мысль вызывает у меня сомнения. Интересно, что думают другие по этому поводу :)

Н.Вирт потом понял свою ошибку и убрал RETURN в конец процедуры и оставил только один (Oberon-07). Повторюсь ещё раз. Блок - один вход, один выход. В случае RETURN в цикле, то выходов из блока "процедура" как минимум 2, а это неправильно. По локальным переменным - да, безопасно. Вот только не всегда процедуры работают с локальными переменными, иногда они изменяют переменные модуля или "родительской" процедуры.

Автор:  Madzi [ Среда, 08 Апрель, 2009 13:15 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

Axcel писал(а):
Мне кажется, что если отбросить субъективные предпочтения, можно выделить следующие моменты:
1. Вполне нормальное желание программиста (особенно начинающего) выделить безусловно понятную
часть и "начать думать над непонятной", и FOR для этого как бы подходит.

Такие желания нужно давить безжалостно. Путём рисования блок схем :) (с пол годика так...)

Axcel писал(а):
2. Вполне "эргономичное" желание отделить тривиальную итерационную часть от "содержательной".

А вот эти начинания - всячески поддерживать.

Axcel писал(а):
Ну а дальше? схема-то не универсальна, только для индексируемых последовательностей, для списков (или таблиц) все равно придеться использовать WHILE. И потом получается, что совершенно одинаковые по смыслу действия для массивов будем делать через FOR с ретоном, а для списков через WHILE. Мне это надо? Мне это не надо.
Выигрываешь в читабельности (допустим) маленького кусочка кода, зато проигрываешь в восприятии программы. И в голове каша, причем, что характерно, как у писателя, так и у читателя.

Универсальных схем нет. Иначе её давно бы уже все использовали.
Нужно понимать, что массивы - это структуры созданные под задачи линейной алгебры (вектора и матрицы) и цикл FOR, соответственно, ЗНАЧИТЕЛЬНО улучшает читабельность в этих задачах.
Не следует обижаться на микроскоп, что он плохо гвозди забивает.

Axcel писал(а):
Один раз разобрался с WHILE и все, можно применять практически в любом месте, для любой последовательности, настоящий инвариант (и только чуть чуть останется для LOOP).

;) в таком случае и неструктурный LOOP не нужен, потому что можно использовать заведомо истиное/ложное условие.

Страница 6 из 7 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/