OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Суббота, 27 Апрель, 2024 13:31

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




Начать новую тему Ответить на тему  [ Сообщений: 178 ]  На страницу Пред.  1 ... 4, 5, 6, 7, 8, 9  След.
Автор Сообщение
СообщениеДобавлено: Четверг, 23 Октябрь, 2008 13:59 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
ain писал(а):
Я вызвал процедуру.
В ней локальная переменная типа TQuery.
Мне нужно сделать запрос к базе и т.д.
В итоге, я обращаюсь к внешнему ресурсу – к операционной системе, для получения ресурса.
Получил, тут бац и что-то меня выбросило.
В секции finally я спокойно освободил внешние ресурсы и вышел из процедуры.
Кстати, проверить, вышел я аварийно или нет тоже не вопрос, если это важно для вызывающего процесса.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 23 Октябрь, 2008 14:02 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Edward Ivanov писал(а):
В Обероне ошибки внутри программных модулей легко локализуются и пропалываются. При условии, что варится внутренняя кухня без обращения к внешней среде. В этом случае можно обойтись одними Asserta'ми.
В случае же взаимодействия со внешней средой - все сложнее, тут действует правило - "лучше перебдеть, чем недобдеть" - лучше предупредить юзера о внештатной ситуации, а не поставить его перед свершившимся фактом. К примеру, вызываю COM-объект, а его нет - юзер прибил dll.
Есть случаи, когда задача крутиться в цикле, и её нежелательно останавливать из-за возникшего трапа, лучше подавить с выдачей в лог или предупреждением.

Да. Но взаимодействие с внешней средой должно очень хорошо локализовываться и заворачиваться в хорошие высокоуровневые абстракции.
А в ряде мест внутри их реализации можно использовать библиотечные средства.
Например, вот эту реализацию try-catch:
viewtopic.php?f=2&t=294


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 23 Октябрь, 2008 14:49 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Александр Ильин писал(а):
Деструкторы в виде FINALIZE есть везде, а при желании вызывать их вручную это элементарно реализуется дополнительным методом.


Идея деструкторов как раз и заключается в том, чтобы не делать их работу вручную...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 23 Октябрь, 2008 14:51 

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


Наоборот. Потому что сбой очень часто возникает из-за исчерпания ресурсов.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 23 Октябрь, 2008 15:03 
Аватара пользователя

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
Vlad писал(а):
Александр Ильин писал(а):
Деструкторы в виде FINALIZE есть везде, а при желании вызывать их вручную это элементарно реализуется дополнительным методом.


Идея деструкторов как раз и заключается в том, чтобы не делать их работу вручную...
Александр, наверное, имел в виду следующее. FINALIZE- не доступны по вызову напрямую, их вызывает только сборщик мусора (автоматически). Но если мы используем для освобождения ресурсов дополнительный (другой) метод, то его можно будет вызвать и напрямую. (Кстати, иногда, хотя редко, в Си++ вызывают деструктор напрямую.)
Думаю, ничего другого здесь не имелось в виду.


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

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


Мне кажется, что программисты условно делятся на две группы :) На тех, кто хочет видеть кишки во всех подробностях, и на тех, кто хочет эти кишки спрятать как можно глубже и не мешать им работать. Первые выбирают C или оберон, вторые - C++ или что-нибудь функциональное. И те и другие смотрят на одну и ту же вещь с разным знаком. Например, первые считают "вызов тучи конструкторов" злом, потому что они теряют контроль над ситуацией. Вторые считают "вызов тучи конструкторов" благом, потому что ситуация полностью под контролем (компилятор не забудет сделать все что надо). Одни хотят явно писать "Close", другие отдают эту задачу компилятору. Ну и т.д. И переубедить кого-то из этих лагерей нет никакой возможности, это просто особенность психологии.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 23 Октябрь, 2008 15:53 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Хочется ясных уровней абстрагирования (высокоуровневость, никаких "кишек" на несоответствующем им уровне), но с сохранением ясного соответствия между происходящим на каждом уровне (могу при первой надобности, всего лишь переключив внимание, переключить свои мысли на уровень ниже).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 23 Октябрь, 2008 16:01 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
AVC писал(а):
Александр, наверное, имел в виду следующее. FINALIZE- не доступны по вызову напрямую, их вызывает только сборщик мусора (автоматически). Но если мы используем для освобождения ресурсов дополнительный (другой) метод, то его можно будет вызвать и напрямую.
Именно это я и имел в виду, спасибо : )


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

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Илья Ермаков писал(а):
Хочется ясных уровней абстрагирования (высокоуровневость, никаких "кишек" на несоответствующем им уровне), но с сохранением ясного соответствия между происходящим на каждом уровне (могу при первой надобности, всего лишь переключив внимание, переключить свои мысли на уровень ниже).


Нет, "уровни абстрагирования" о которых вы говорите - это из области архитектуры. Тут у представителей и тех и других могут быть очень сходные представления. А я говорю именно о кодировании. "Close" у вас или будет присутствовать на любом уровне системы, даже на самом высоком и абстрагированном, или не будет ни на каком.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 23 Октябрь, 2008 16:58 

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


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

Стоит вспомнить Esmertec c их JBed, а до этого OS Portos, на которой можно было исполнять модули на Компонентном Паскале. Интересно, как они решали эту проблему?


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

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
Иван Горячев писал(а):
Если мне не изменяет память, в GPCP есть секция RESCUE - как раз аналог EXCEPT
Память Вам не изменяет. :)
У RESCUE там еще есть аргумент-исключение. Примерно так:
Код:
PROCEDURE Proc;
BEGIN
    ...
RESCUE (exc)
    ...
    (* THROW(exc) *)
END Proc;


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

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
Возможно, пора подвести какой-то итог, а то тема, кажется, заглохла.
Меня это обсуждение подвигло усомниться в необходимости объектных деструкторов для Оберона. (Вообще-то, изначально, опираясь на опыт Си++, я в ней мало сомневался.)
Какие могут быть причины ввести в Оберон/КП деструкторы?
1. Освобождение памяти.
В основном деструкторы Си++ занимаются освобождением памяти. Рантайм Оберона полностью берёт эту работу на себя. Это мне было ясно и до обсуждения.
2. Освобождение внешних ресурсов (файлов, устройств и т.д.; потоки я здесь не рассматриваю).
В КП есть финализаторы. Рано или поздно они сработают (при сборке мусора), и внешние ресурсы будут возвращены. Но здесь остается общая для финализаторов проблема - непредсказуемость времени их вызова. Поэтому мы переходим к следующему пункту.
3. К какому событию привязать освобождение внешнего устройства.
Сначала казалось очевидным, что к уничтожению объекта, управляющего внешним устройством.
Но потом я стал в этом сомневаться. Например, в прежние ("дообъектные") времена считалось хорошим тоном освобождать ресурсы в той же процедуре, в какой их захватывали. Думаю, то же можно распространить и на метод. Учитывая, что внешние устройства (по большей части файлы) используются значительно реже, чем динамическая память, можно применить этот "старый" подход. (Исключения настолько редки, что, IMHO, такими объектами без труда можно управлять и явно.) Но тогда возникает новая опасность: в результате выброса исключения мы можем не выполнить действия по освобождению ресурса в конце процедуры.
Это приводит к следующему пункту.
4. Процедурные секции CLOSE (по аналогии с модулем) и их привязка к обработке исключения.
Можно ввести секции в язык процедурные секции CLOSE (аналог finally) и поручить обработчику трапов их вызвать (в порядке LIFO, разумеется). Уверен, что это не является проблемой. Таким образом, мы гарантируем своевременное освобождение внешнего ресурса даже в случае исключения.
5. Каких проблем мы избегаем, не вводя конструкторы/деструкторы.
Конструкторы и деструкторы обычно работают не так, как другие методы. Они предполагают вызовы для всех классов в иерархии наследования и агрегации. Учитывая,
  • что большей частью они используются для того, чтобы управлять памятью, что для оберонов излишне,
  • что, используя неявные вызовы, они создают определенное концептуальное противоречие с духом языка и опасность массы бесполезных вызовов;
  • что для конструкторов есть неплохая замена в виде фабричных функций (особенно, если принять во внимание, что в Обероне практически не используются глубокие иерархии наследования),
то, отказываясь вводить в язык конструкторы/деструкторы, мы избегаем излишних хлопот и большой головной боли.
Поэтому я предлагаю ограничиться введением процедурной секции CLOSE (хотя еще надеюсь на некий аналог секции EXCEPT (XDS) или RESCUE (GPCP)).
Это, конечно, IMHO. Можно критиковать.


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

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
Строго говоря, есть альтернативы введению процедурной секции CLOSE в КП.
1. Гарантировать вызов сборщика мусора после каждого исключения.
В таком случае, как и сейчас, ответственность возлагается на FINALIZE-.
2. Ввести модуль, регистрирующий объекты, наследующие (скажем) типу Disposable.
В случае исключения, для зарегистрированных объектов гарантировать вызов метода Dispose, после чего отменить регистрацию (чтобы впоследствии они могли быть собраны сборщиком мусора). Тогда не обязательно вызывать сборщик мусора, можно ограничиться вызовом DisposeAll. Регистрацию можно отменить и явным вызовом Dispose.

Но у секции CLOSE есть дополнительное преимущество. Благодаря встроенности в компилятор, она позволяет упростить написание выхода из процедуры. Достаточно вызвать RETURN, а секцию CLOSE тогда вызовет сам компилятор.


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

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1449
Откуда: Киев
Согласен с Вами. Конструкторы и деструкторы излишни в Обероне. А вот разделы EXCEPT и CLOSE пригодились бы.


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

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
Comdiv писал(а):
Согласен с Вами. Конструкторы и деструкторы излишни в Обероне. А вот разделы EXCEPT и CLOSE пригодились бы.
Спасибо за поддержку. :)
Мне эта мысль (об излишнести конструкторов/деструкторов в Обероне) далась с трудом из-за привычек программирования на Си++.


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

Зарегистрирован: Понедельник, 19 Март, 2007 09:40
Сообщения: 142
Откуда: USA, Israel, Belarus
В O7 (Oberon-07) нет возможности выскочить с середины функции. Если рассматривать применимость предложенной секции CLOSE к О7, то приходим к выводу о ее (почти) полной бесполезности. Далее мне все равно не понятно, а кто будет делать CLOSE секции CLOSE ? И кто будет ловить exceptions в секции CLOSE ?
Ах да! В секции CLOSE будет очень простой код, чистый от багов и исключительных ситуаций! :lol: Одни из самых тяжелых багов в Ц++, это exception thrown в catch-блоке.

ИМХО, все это не является достаточно чистыми концепциями, что бы их вводить в какой либо из Оберонов.

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

Единственная "проблема" -- это exceptions. Мне кажется, нужны совершенно другие подходы. Реализация exceptions в Ц++, ИМХО, полностю себя дескредетировала, и не стОит все это тащить в Обероны.


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

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
slava писал(а):
ИМХО, все это не является достаточно чистыми концепциями, что бы их вводить в какой либо из Оберонов.
<...>
Единственная "проблема" -- это exceptions. Мне кажется, нужны совершенно другие подходы. Реализация exceptions в Ц++, ИМХО, полностю себя дескредетировала, и не стОит все это тащить в Обероны.
Спасибо за Вашу критику.
Какие подходы, по Вашему, можно было бы предложить для решения проблемы исключений?
IMHO, отсутствие обработки исключений в исходном Обероне - следствие его специфического применения (в ОС Оберон исключения не являлись большой проблемой).
Но это реальная проблема для пишущих код для других ОС, и её надо решить.

slava писал(а):
В O7 (Oberon-07) нет возможности выскочить с середины функции.
В Обероне-07 вообще ничего нет.
Этот маленький язык - большая ошибка. :evil:


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

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
slava писал(а):
Одни из самых тяжелых багов в Ц++, это exception thrown в catch-блоке.


Это вполне нормальная ситуация (используется намного чаще, чем просто отлов исключения). Вы, наверное, путаете с исключением, брошенным из деструктора во время бросания другого исключения. Ситуация редкая, возникает при неправильном использовании деструкторов :) Врочем даже в такой ситуации - в чем баг то? Поведение специфицировано стандартом и может быть переопределено (хотя места для маневра, конечно, немного).

slava писал(а):
Реализация exceptions в Ц++, ИМХО, полностю себя дескредетировала, и не стОит все это тащить в Обероны.


В чем именно дескредетировала? :) Это не самая страшная часть плюсов :)


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

Зарегистрирован: Понедельник, 05 Июнь, 2006 09:49
Сообщения: 327
Откуда: Ленинград, Емельянов Алексей Николаевич
По поводу except. Честно говоря, не уверен, правильно-ли это, но мне всегда хотелось связать использование ASSERT с обработкой исключений. Так сказать скрестить "ежа" с "ужом". Т.е. во время разработки/отладки программа при нарушении ASSERT ведет себя как "еж" ( trap), а во время эксплуатации как "уж", т.е. какая-то мягкая обработка в секции EXCEPT или как-то еще (что-нибудь вроде ON_ASSERT).


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

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
Axcel писал(а):
По поводу except. Честно говоря, не уверен, правильно-ли это, но мне всегда хотелось связать использование ASSERT с обработкой исключений. Так сказать скрестить "ежа" с "ужом". Т.е. во время разработки/отладки программа при нарушении ASSERT ведет себя как "еж" ( trap), а во время эксплуатации как "уж", т.е. какая-то мягкая обработка в секции EXCEPT или как-то еще (что-нибудь вроде ON_ASSERT).
IMHO, так и должно получиться.
Например, во время отладки ASSERT перехватывается отладчиком, а во время эксплуатации генерирует исключение, которое может быть обработано в секции EXCEPT.


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

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


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

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


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

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