OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 16 Апрель, 2024 19:46

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




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

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
bohdant писал(а):
приведу пример использования: <...>
У меня ещё в прошлый раз родился вопрос: зачем они для установки значения переменной trap пользуются метапрограммированием? Ведь проще без него.
Например:
Код:
PROCEDURE SafelyDoOperation(): BOOLEAN;
    VAR trap: BOOLEAN;
BEGIN
    trap := TRUE;
    ... (* что-то опасненькое делаем *)
    trap := FALSE;
FINALLY
    ... (* освобождаем уже ненужные ресурсы *)
    RETURN trap;
END SafelyDoOpereation;
Или я чего-то не учитываю?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 10 Ноябрь, 2008 12:45 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
AVC писал(а):
Реализация Kernel - системно зависима. Отсюда, насколько я понимаю, и три аргумента у обработчика, переаваемого в Kernel.Try. А если будем писать на КП для других платформ (что не так уж невероятно)?
Когда будем, тогда лучше и подумаем.
AVC писал(а):
3. Лучше иметь один стандартный вариант, чем "зоопарк" разных решений. Здесь я согласен с Geniepro.
А пока Вы же можете сделать стандартную (для себя) библиотечку для КП. Может для других платформ она (по интерфейсу) и подойдёт.

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

В общем, палка о двух концах...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 10 Ноябрь, 2008 14:31 
Аватара пользователя

Зарегистрирован: Суббота, 15 Март, 2008 20:00
Сообщения: 297
Откуда: Київ, Україна
AVC писал(а):
Или я чего-то не учитываю?

В более ранних исходниках так и сделано, а потом добавили такую фичу. А так я согласен, что перед секцией FINALLY написать trap := FALSE; ничего не стоит... Кто то наверное забыл написать trap := FALSE; пару дней на поиски потратил и сделал так, как есть сейчас :lol:


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

Зарегистрирован: Четверг, 01 Июнь, 2006 11:14
Сообщения: 240
может какие доп мысли будут:
http://www.intuit.ru/department/se/oopbases/12/
http://oberon2005.ru/paper/m2ex.pdf


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

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
___ писал(а):
http://oberon2005.ru/paper/m2ex.pdf
Опять с характерной занудной претензии начинается...
Вирт же ясно говорит: он включает в свои определения только то, про что есть полная уверенность, что это "то" необходимо и как "его" устроить, чтобы не сломать шею.

Каждому предоставляется право экспериментировать на свой страх и риск.


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

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
Ещё немного информации к размышлению.
Здесь предлагалось в качестве возможного подхода к освобождению внешних ресурсов использовать FINALIZE: то ли дождаться, когда Kernel.Collect сам сработает, то ли вызвать Kernel.Collect явно.
Такой подход кажется мне неудовлетворительным (независимо от синтаксического/библиотечного оформления) по ряду причин, главная из которых - традиционно консервативная сборка мусора в Оберонах (применительно к указателям, размещенным в стеке). Это означает, что при нахождении в стеке переменной, чьё значение случайно совпадает побитово со значением указателя, объект не будет освобождён (даже если на него не указывает ни один настоящий указатель). Т.е. освобождение внешнего ресурса с помощью (форсированной) сборки мусора не гарантировано.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 21 Ноябрь, 2008 17:05 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Ещё есть:
Цитата:
PROCEDURE InstallCleaner (p: Command)
Регистрирует процедуру-сборщик, которая выполняет периодическое освобождение ресурсов ("высокоуровневый сбор мусора"). Такая процедура вызывается каждый раз при выполнении процедуры глобальной очистки Kernel.Cleanup. Процедура-сборщик может, например, выполнять закрытие баз данных, обнуление указателей на временные вспомогательные объекты, и т.п.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 21 Ноябрь, 2008 17:36 
Модератор
Аватара пользователя

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


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

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
AVC писал(а):
... Т.е. освобождение внешнего ресурса с помощью (форсированной) сборки мусора не гарантировано.

Это почему еще? Компилятору доступна вся информация о каждой процедуре, где у ней указатели в процедурном фрейме, где прочие данные.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 21 Ноябрь, 2008 21:51 
Модератор
Аватара пользователя

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


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

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
Info21 писал(а):
AVC писал(а):
... Т.е. освобождение внешнего ресурса с помощью (форсированной) сборки мусора не гарантировано.

Это почему еще? Компилятору доступна вся информация о каждой процедуре, где у ней указатели в процедурном фрейме, где прочие данные.


Эта информация действительно не используется при сборке мусора, что показывает простейший тест:
Код:
MODULE FinTest;

   IMPORT SYSTEM, Kernel, Log;
   
   TYPE Object = POINTER TO RECORD END;
   
   PROCEDURE (me: Object) FINALIZE;
   BEGIN
      Log.String("Finalize..."); Log.Int(SYSTEM.VAL(INTEGER, me)); Log.Ln
   END FINALIZE;
   
   PROCEDURE Go* ;
      VAR p: Object;
         n: INTEGER;
   BEGIN NEW(p);
      n := SYSTEM.VAL(INTEGER, p); (* имитируем "случайное совпадение" *)
      Log.String("Allocate..."); Log.Int(n); Log.Ln;
      p := NIL;
      Kernel.Collect
   END Go;

END FinTest.

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


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

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
Евгений Темиргалеев писал(а):
А вот делать это стандартным для всех, да ещё в языке... А если в какой-то платформе и такого понятия не будет как исключения? Эмулировать тогда? Или реализация будет крайне не эффективной, что лучше уж без них делать?
Т.е. совсем не будет исключений?
Как же на такой платформе бороться с разыменованием нулевых указателей, выходом за пределы массива и т.п.?


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

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Не пойму, речь-то о чем: о "в принципе" или "в конкретной реализации"?


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

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
Info21 писал(а):
Не пойму, речь-то о чем: о "в принципе" или "в конкретной реализации"?
Прежде всего, я хотел предупредить, что при разработке надёжного приложения в ББ не следует (слишком) полагаться на FINALIZE.
Что касается особенности "конкретной реализации", то создаётся впечатление, что это особенность всех известных реализаций Оберона. Возможно, консервативный подход к стеку вызван желанием повысить скорость сборки мусора.
Конечно, в принципе в Обероне возможна точная сборка мусора. Но по практическим соображениям (скажем, во встроенном приложении) может быть отдано предпочтение (полностью) консервативной сборке. Так что финализаторы остаются под вопросом.


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

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
Илья Ермаков писал(а):
(видимо, дело будущего - указатели фтопку и автопамять без сборки мусора... Пути к тому вроде видны.)
Это как - всё время выделять новые страницы памяти?
Насчёт указателей (пока) не очень понятно: ведь без них (явно или скрыто) не получится работать с динамическими структурами данных.


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

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
AVC писал(а):
Илья Ермаков писал(а):
(видимо, дело будущего - указатели фтопку и автопамять без сборки мусора... Пути к тому вроде видны.)
Это как ......

Горячится молодежь.
Главное -- не покупаться 8)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 23 Ноябрь, 2008 00:48 
Модератор
Аватара пользователя

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

Про новые страницы - ну, такая идея используется на платформах со 128-бит указателями (типа IBM AS/400 или "Эльбрусов"). Выделяемые виртуальные адреса не повторяются - поэтому повисший указатель всегда обнаружим. Я делал такую штуку и в малом адресном пространстве, с доп. косвенной таблицей. Правда, эти способы гарантируют безопасность, но не дают функциональности "якоря" (т.е. чтобы объект жил, пока кому-то нужен).

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

Вот пока всё, что я могу сказать по поводу "пути вроде видны".


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 24 Ноябрь, 2008 22:52 
Аватара пользователя

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
AVC писал(а):
Так что финализаторы остаются под вопросом.
... и остаётся открытым вопрос, как лучше освобождать внешние ресурсы.
Евгений Темиргалеев рекомендует PROCEDURE InstallCleaner (p: Command) (она определена в модуле Kernel).
Я сейчас использую вызов через процедуру Kernel.Try, гарантирующую перехват исключения.
Какие ещё могут быть подходы?


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

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


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

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


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

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