OberonCore
https://forum.oberoncore.ru/

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

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

Валерий Лаптев писал(а):
Madzi писал(а):

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

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


Что именно неверно? Проверяемые исключения поддерживают известные ошибки, а непроверяемые - любые, даже те, которые ошибками небыли на момент создания программы (типа Runtime Error 200 в Borland Pascal). Я думаю что вы самостоятельно способны узнать всё об исключениях, задействовав интернет (о том как появились, какими были, зачем и т.п.). Вот вам ссылочка для затравки
Код:
http://dic.academic.ru/dic.nsf/ruwiki/75519


А потом уже обсудим (в другой теме).

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

Madzi писал(а):
По локальным переменным - да, безопасно. Вот только не всегда процедуры работают с локальными переменными, иногда они изменяют переменные модуля или "родительской" процедуры.
Другими словами, использование RETURN усугубляет зло, создаваемое побочным эффектом процедур.

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

Игорь Лоскутов писал(а):
Madzi писал(а):
По локальным переменным - да, безопасно. Вот только не всегда процедуры работают с локальными переменными, иногда они изменяют переменные модуля или "родительской" процедуры.
Другими словами, использование RETURN усугубляет зло, создаваемое побочным эффектом процедур.


Мне бы хотелось разделить понятие процедуры на два (по способу применения):
1. Процедуры
2. Подпрограммы

Подпрограмма - участок кода, вынесенный в отдельное место, в виду частой повторяемости в тексте:
Код:
call xxx
       ...
xxx: ...
       ret

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

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

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

В любом случае и процедуры и программы - крайне полезный инструментарий для "свёртки" сложных систем и, соответственно, повышения уровня читаемости, поэтому говорить о них как о зле я бы не стал.
Поскольку ФУНКЦИИ в Обероне были убраны, а единственный способ возврата параметров процедуры - это RETURN, то никуда от него не деться. В Обероне-07, совершенно справедливо сделано, что RETURN должен быть "приклеен" к концу процедуры и может быть только один.

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

Madzi писал(а):
Мне бы хотелось разделить понятие процедуры на два (по способу применения):
1. Процедуры
2. Подпрограммы
Я бы не советовал Вам это делать. По той простой причине, что процедура и подпрограмма -- это суть одно и то же. Никакой разницы между ними нет. Исторически термин "подпрограмма" появился раньше (помните фортрановское SUBROUTINE ?), но потом, видимо в свете развития модульных систем, практически повсеместно был вытеснен термином "процедура" как более корректным. И действительно, ведь программа теперь -- это набор модулей (пакетов, библиотек, классов (в Яве) и т.д.). Что тогда должен обозначать термин "подпрограмма" -- поднабор модулей, что-ли? Лично я термин "подпрограмма" стараюсь не использовать.
По способу применения отличаются только "обычные процедуры" (proper procedure) и процедуры-функции.
Madzi писал(а):
В любом случае и процедуры и программы - крайне полезный инструментарий для "свёртки" сложных систем и, соответственно, повышения уровня читаемости, поэтому говорить о них как о зле я бы не стал.
Я говороил о том, что зло создаётся побочным эффектом, а не самими процедурами. Будьте, пожалуйста, повнимательнее :wink:
Имхо, в обычных процедурах побочный эффект не несёт в себе никакого зла, и даже наоборот, бывает очень полезен :) А вот процедурам-функциям я бы с удовольствием предал более математический смысл, вообще запретив использовать в них глобальные переменные, заодно раз и навсегда покончив с пресловутым побочным эффектом. Удивляюсь, что Никлаус Вирт этого не сделал.

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

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

На счёт процедур-функций - не всё так определённо, как хотелось бы. Я бы с удовольствием придал более математический смысл не только им, но и некоторым другим сущностям.

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

Madzi писал(а):
На счёт процедур-функций - не всё так определённо, как хотелось бы. Я бы с удовольствием придал более математический смысл не только им, но и некоторым другим сущностям.
Прозвучало несколько туманно, а жаль, очень любопытно.
Логика моих рассуждений проста. Функция используется только в выражениях (хотя бы состоящих из одного единственного операнда -- самой функции). Ещё Никлаус Вирт, по-моему, говаривал: "Функция -- это значение, которое надо вычислить". Судя по Вашим постам на форуме, Вы должны разделять мою точку зрения, что во время таких вычислений не должно производиться никаких шаманских действий с переменными, не имеющими отношения к этим вычислениям. Возможно, я не прав насчёт Вашего мнения. Хотелось бы тогда простенький пример, когда "не всё так определённо".

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

Игорь Лоскутов писал(а):
Madzi писал(а):
На счёт процедур-функций - не всё так определённо, как хотелось бы. Я бы с удовольствием придал более математический смысл не только им, но и некоторым другим сущностям.
Прозвучало несколько туманно, а жаль, очень любопытно.
Логика моих рассуждений проста. Функция используется только в выражениях (хотя бы состоящих из одного единственного операнда -- самой функции). Ещё Никлаус Вирт, по-моему, говаривал: "Функция -- это значение, которое надо вычислить". Судя по Вашим постам на форуме, Вы должны разделять мою точку зрения, что во время таких вычислений не должно производиться никаких шаманских действий с переменными, не имеющими отношения к этим вычислениям. Возможно, я не прав насчёт Вашего мнения. Хотелось бы тогда простенький пример, когда "не всё так определённо".

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

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

Madzi писал(а):
Я разделяю точку зрения о ...
Я оказался прав :D

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

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


Ну если рассматривать FOR исключительно в применении к существующему описанию языка оберон - то да, вы не поверите, но я соглашусь :) На фоне возможности ручного изменения переменной цикла, ее отдельном объявлении и практической применимости только к массивам - да, он как мертвому припарка :) Убрать FOR, и добавить FOREACH с возможностью итерировать списки (по полю next). Проку будет намного больше. Впрочем если просто убрать - то тоже язык не много потеряет.

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

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


За использование глобальных переменных в условии цикла надо руки отрывать сразу, особенно студентам :)

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

Vlad писал(а):
За использование глобальных переменных в условии цикла надо руки отрывать сразу, особенно студентам :)
К сожалению, правилами языка (КП) это не запрещено. Я имею в виду, конечно же, использование переменных, а не отрывание рук :)
Хотя явного запрета на отрывание рук студентам в сообщении о КП тоже нет :lol:

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

Vlad писал(а):
За использование глобальных переменных в условии цикла надо руки отрывать сразу, особенно студентам

А если это какая-то переменная, которая устанавливается один раз и только во время инициализации программы? Кстати, видел в языке MATLAB довольно удачную находку: для доступа к любой глобальной переменной её нужно дополнительно объявлять в начале функции с помощью оператора global. Интересно, есть ли что-то подобное в других языках?

Vlad писал(а):
Убрать FOR, и добавить FOREACH с возможностью итерировать списки (по полю next). Проку будет намного больше. Впрочем если просто убрать - то тоже язык не много потеряет.

Иногда неструктурное программирование здорово упрощает жизнь, например, при выходе из глубоко вложенного цикла при поиске элементов или при ошибке. Я не уверен, что чисто структурный вариант будет всегда читаться лучше, чем с обработчиком исключений, break, continue, goto или даже LOOP...END. Например, у Кернигана и Ритчи использование goto строго не рекомендуется, но есть примеры, когда он удачен (которые довольно редки на практике).

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

Сколько можно повторять, что сто раз разжёваны. В статистически значимом количестве ситуаций: если цикл так составлен, что при переходе в структурный вариант он угромождается, а не проясняется... значит, он так составлен.
И аффтару его идти учить инварианты циклов :)

Эх, вспоминаются слова Ершова: "Я мечтаю об учебном курсе с каторжным тренингом на доказательное построение алгоритмов, в стиле лучших учебников матанализа". И трепать, трепать студиозусов, пока во сне не будет отлетать :)

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

ScrollLock писал(а):
А если это какая-то переменная, которая устанавливается один раз и только во время инициализации программы? Кстати, видел в языке MATLAB довольно удачную находку: для доступа к любой глобальной переменной её нужно дополнительно объявлять в начале функции с помощью оператора global. Интересно, есть ли что-то подобное в других языках?

В PHP. Но в сочетании с автообъявлением переменных - это звездец... забудешь объявить как глобал, так она автоматом создастся локально - и ошибку искать полчаса... Если пишешь редко на языке, то обычно забываешь. Пример идиотского комбинирования фишек - добавили вроде хорошее (борьба с побочными эффектами), но в сочетании с другим - задница вышла...

Цитата:
Иногда неструктурное программирование здорово упрощает жизнь,
...
но есть примеры, когда он удачен (которые довольно редки на практике).

Как же так? Довольно редки, но упрощает здорово? :) Не режет слух? :)

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

Оффтоп: читаю описание PHP. Как они там живут? Похоже спят и ждут, когда приснится новая фича, какую бы можно было включить... Например:
Цитата:
Замечание: Несмотря на то, что оператор ! имеет более высокий приоритет чем =, PHP позволяет использовать следующую конструкцию: if (!$a = foo()), которая присваивает переменной $a результат выполнения функции foo().

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