OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Понедельник, 11 Август, 2025 17:54

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 178 ]  На страницу Пред.  1, 2, 3, 4, 5, 6 ... 9  След.
Автор Сообщение
СообщениеДобавлено: Вторник, 21 Октябрь, 2008 18:48 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
Comdiv писал(а):
...Промежуточных действий в функции много и перед каждым из них анализировать возможность переполнения лень, к тому же функция немаленькая и ошибиться при этом анализе очень просто. Также необходимо минимизировать время вычисления этой функции. С механизмом исключений всё просто - при переполнении возвращаем значение, означающее неопределённость...


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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 21 Октябрь, 2008 19:02 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Александр Ильин писал(а):
...изначально при проектировании не был предусмотрен механизм "отступления", отката...

А если глубже копнуть, то увидим здесь границу процедурной идеологии программирования. В процедурах ведь как: вызвали процедуру - ждём возврата управления. Надо процедуры отменить, тогда смысл в exception пропадёт сам собой.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 21 Октябрь, 2008 19:04 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Valery Solovey писал(а):
Если Вы используете исключение, то это как минимум не быстрее ручной проверки.


В том-то и дело, что быстрее...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 21 Октябрь, 2008 19:06 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Vlad писал(а):
Поймите меня правильно :) Я не предлагаю использовать исключения для обработки eof. Я предлагаю использовать исключения для того для чего они предназначены - для обработки ошибок.
Совершенно не против такого подхода, однако озвучу крамольную мыслю - а не является ли использование исключений палкой о двух концах? Скажем, в парадигме "исключения - это гут", обработка ошибочных ситуаций уже после старта, "на орбите", является нормальным действием. А где уверенность, что будут обработаны все ошибки? Не кроется ли тут психологический момент перекладывания проверки работы программы с этапа разработки на "потом"? Типа, у меня тут всё завёрнуто в try...except, чё беспокоиться. В таком случае, программисту надо получать допуск на использование исключений! :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 21 Октябрь, 2008 19:17 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1469
Откуда: Киев
Valery Solovey писал(а):
Comdiv писал(а):
...Промежуточных действий в функции много и перед каждым из них анализировать возможность переполнения лень, к тому же функция немаленькая и ошибиться при этом анализе очень просто. Также необходимо минимизировать время вычисления этой функции. С механизмом исключений всё просто - при переполнении возвращаем значение, означающее неопределённость...


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


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

В "секцию поиска исключений" в стандартных функциях Вы вряд ли сможете влезть.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 21 Октябрь, 2008 19:20 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Иван Кузьмицкий писал(а):
А где уверенность, что будут обработаны все ошибки?


А где уверенность, что будут обработаны все коды ошибок? В случае исключений у меня уверенности больше просто потому, что мест для обработки нужно на порядки меньше.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 21 Октябрь, 2008 19:28 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
А зачем вообще выводить на орбиту программу, в которой возможны ошибки? Ну, это, вопрос чисто религиозный.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 21 Октябрь, 2008 19:33 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1469
Откуда: Киев
Иван Кузьмицкий писал(а):
озвучу крамольную мыслю - а не является ли использование исключений палкой о двух концах? Скажем, в парадигме "исключения - это гут", обработка ошибочных ситуаций уже после старта, "на орбите", является нормальным действием. А где уверенность, что будут обработаны все ошибки? Не кроется ли тут психологический момент перекладывания проверки работы программы с этапа разработки на "потом"? Типа, у меня тут всё завёрнуто в try...except, чё беспокоиться. В таком случае, программисту надо получать допуск на использование исключений! :)


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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 21 Октябрь, 2008 19:37 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1469
Откуда: Киев
Иван Кузьмицкий писал(а):
А зачем вообще выводить на орбиту программу, в которой возможны ошибки? Ну, это, вопрос чисто религиозный.


Ошибки возможны в любой программе, даже самой надёжной. Нужна подстраховка.

Вряд ли Вам понравится, если редактор вывалится с Вашим текстом из-за исключения в подсветке синтаксиса.


Последний раз редактировалось Comdiv Вторник, 21 Октябрь, 2008 19:47, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 21 Октябрь, 2008 19:38 
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Сергей Губанов писал(а):
А если глубже копнуть, то увидим здесь границу процедурной идеологии программирования. В процедурах ведь как: вызвали процедуру - ждём возврата управления. Надо процедуры отменить, тогда смысл в exception пропадёт сам собой.

Угу, бродют и у меня такие мысли. В частности, что процедура - частный случай процесса, с вводом сообщений в начале и выводом в конце. (А объект и процесс суть одно: внешний фасад и внутреннее устройство, на самом деле).
(Кстати, в Эрланге в связи с тем, что несущей единицей является лёгкий процесс, проблема обработки ошибок решена жёстко и просто: помер один "бобик" - и шут с ним, плодим другого).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 21 Октябрь, 2008 19:50 

Зарегистрирован: Понедельник, 05 Июнь, 2006 09:49
Сообщения: 327
Откуда: Ленинград, Емельянов Алексей Николаевич
Если сравнить код ББ, и код написанный на Delphi, то мы увидим: код ББ буквально нашпигован Assert - ми, код Delphi нашпигован , блоками try ... .
Похоже, на разные принципы. По-моему смешать не получится.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 21 Октябрь, 2008 20:03 

Зарегистрирован: Вторник, 18 Сентябрь, 2007 08:48
Сообщения: 108
Что будет, если в Обероне вызвать процедуру, которая не возвращает значение и и именно она генерирует сбой? Таким образом, нет флажка для продолжения проверки.
Поэтому я за исключения.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 21 Октябрь, 2008 20:04 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2463
Откуда: Россия, Томск
Vlad писал(а):
Александр Ильин писал(а):
А по поводу данного примера, то в пределах своего модуля я имею право считать, что eof - это не физический конец файла, а логический конец обработки данных моим модулем. В конце концов, переменная sym не видна извне, и её значение я определяю по своему усмотрению.
Тем не менее. Вы теряете контроль над тем кто и когда читает/меняет переменную. Например, при появлении многопоточности такой код можно сразу переписывать, никакая синхронизация вас уже не спасет :) Да и без многопоточности разобраться будет непросто. Уж лучше явно код ошибки везде тащить.
Про явно тащить код ошибки - это интересное соображение! Я раньше не понимал, почему переменная sym в парсере сделана глобальной, а теперь понял! Ведь в самом деле "тащить" её через все процедуры параметром было бы громоздко. А так - вот она, переменная состояния парсера. Многопоточность реализуется элементарно: процедуры модуля делаются методами объекта, переменная sym - полем объекта. Объект работает в пределах одного потока.

Что касается контроля над чтением/изменением - достаточно всякое присвоение оформить отдельной процедурой с говорящим названием. Т.е. вместо OPS.Read вызывать всегда местный Read. Это и будут точки синхронизации и прочей обработки. Правда, убедиться в том, что не производится присвоения в неположенных местах, можно будет только вручную с помощью поиска по исходнику... Вот тут я бы подкрутил дополнительный контроль к компилятору, если придумать такой синтаксис... Например, заставить процедуры IMPORT'ировать глобальные переменные из собственного модуля (из других модулей и так импортируются через указание имени модуля, так что поиск тут работает). В том числе только для чтения. Либо квалифицировать каким-то словом (MODULE? Идентификатором модуля?). Первый вариант кажется лучше из-за возможности read-only, а второй - из-за последовательности (consistency).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 21 Октябрь, 2008 20:28 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1469
Откуда: Киев
Valery Solovey писал(а):
Comdiv писал(а):

Кстати, не хотите ли поупражняться ? Я предоставлю код функции на XDS Oberon-2 с использованием обработки исключений, а Вы покажете мне как обойтись без неё. В конце-концов на практических примерах и надо выяснять что нужно, а что не нужно. Может и я чего недодумал. Как на это смотрите?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 21 Октябрь, 2008 20:38 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2463
Откуда: Россия, Томск
Comdiv писал(а):
Кстати, не хотите ли поупражняться ? Я предоставлю код функции на XDS Oberon-2 с использованием обработки исключений, а Вы покажете мне как обойтись без неё. В конце-концов на практических примерах и надо выяснять что нужно, а что не нужно. Может и я чего недодумал. Как на это смотрите?
В отдельную тему, пожалуй. Для желающих.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 21 Октябрь, 2008 21:10 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Александр Ильин писал(а):
процедуры модуля делаются методами объекта, переменная sym - полем объекта. Объект работает в пределах одного потока.


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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Октябрь, 2008 08:04 

Зарегистрирован: Понедельник, 25 Февраль, 2008 08:42
Сообщения: 125
Axcel писал(а):
Если сравнить код ББ, и код написанный на Delphi, то мы увидим: код ББ буквально нашпигован Assert - ми, код Delphi нашпигован , блоками try ... .
Похоже, на разные принципы. По-моему смешать не получится.

Мне нравиться конструкция в Delphi – try… finally.
Что бы не произошло, ну вот, просто памяти не хватило, программа выполнит завершающие операции в блоке finally.
Assert никак не сможет заменить такую конструкцию или я ошибаюсь?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Октябрь, 2008 08:11 

Зарегистрирован: Вторник, 18 Сентябрь, 2007 08:48
Сообщения: 108
Assert'ы в основном для проверки входных значений. Что будет в рантайме - не дело ББ.
У оберонщиков: проскочим опасный участок - хорошо, не проскочим - ну и ладно, имеем посмертный дамп. Пользователю от этого польза - как дырка от бублика.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Октябрь, 2008 08:26 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Обработка исключений придумана для того, чтобы подавить аварийную ситуацию и, по возможности, вернуть вычисление в рабочее русло. А вот если проблема вылезет в секции finally, то уже никакие примочки не помогут. Так что лучше придавать себе уверенности жёсткими проверками пред- и постусловий, нежели обёртывать всё и вся в try...except. Лучше, если ошибка проявит себя как можно раньше, а не будет задавлена обработчиком исключения.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Октябрь, 2008 08:40 

Зарегистрирован: Вторник, 18 Сентябрь, 2007 08:48
Сообщения: 108
В секции finally никак проблем не может быть. Она как раз предотвращает проблемы, которые возникли благодаря случившемуся исключению. Например, отдать обратно выделенную память, закрыть дескрипторы файлов. Что-то типа сборщика мусора.
Едем дальше. Вы не можете предусмотреть ВСЕ ошибки. Одну ошибку нашли, вторая - через месяц. А третья - будет. И не факт, что последняя. Большинство возникающих ошибок - в период времени исполнения.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 178 ]  На страницу Пред.  1, 2, 3, 4, 5, 6 ... 9  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2025, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB