Оберон-клуб «ВЄДАsoft»

Твердыня модульных языков
Текущее время: 25 янв 2020, 19:26

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




Начать новую тему Ответить на тему  [ Сообщений: 31 ]  На страницу Пред.  1, 2, 3, 4  След.
Автор Сообщение
 Заголовок сообщения: Re: Слабые указатели
СообщениеДобавлено: 26 янв 2018, 09:21 
Не в сети

Сообщения: 338
Финалайзеры - это примерно такое же расширение GC, как и слабые ссылки. И если я правильно понял, что в BB сборщик мусора отвечает за освобождение COM-интерфейсов, то это большая ошибка.


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Слабые указатели
СообщениеДобавлено: 27 янв 2018, 08:06 
Не в сети

Сообщения: 108
budden писал(а):
Финалайзеры - это примерно такое же расширение GC, как и слабые ссылки. И если я правильно понял, что в BB сборщик мусора отвечает за освобождение COM-интерфейсов, то это большая ошибка.


Почему и что вместо? Финалайзеры - вполне сложившийся подход к "аварийному" освобождению ресурсов (не памяти)...


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Слабые указатели
СообщениеДобавлено: 27 янв 2018, 08:39 
Не в сети

Сообщения: 338
Аварийная деинициализация по идее должна содержать в себе грозное и неубираемое предупреждение со словами: данная кривая программа не подчистила за собой. В идеале программа должна падать. Причина проста - неизвестно, когда произойдёт сборка мусора, а при консервативном сборщике мусора - неизвестно, произойдёт ли она вообще. Поэтому отпускание ресурсов не гарантировано.

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

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

Вместо этого использовать - try .. finally, RAII, или есть вариант, основанный на подсчёте ссылок, когда объект "сторож" имеет только одну ссылку - локальную переменную, и деструктор, и неявно освобождается при выходе из области видимости. С помощью этого приёма я реализовал аналог RAII для Дельфи и 1С.

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


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Слабые указатели
СообщениеДобавлено: 27 янв 2018, 09:00 
Не в сети

Сообщения: 338
Ну или я чего-то недопонял, я вот что читаю:
Цитата:
For programmers, the integration of COM into a strongly typed, garbage-collected language has two major advantages. Firstly, it brings all the amenities of automatic garbage collection to COM. Secondly, it makes the handling of COM interfaces typesafe.

И смотрю тестовое приложение KoalaTest. Вроде всё так и есть.
И да, циклы надо разрывать вручную, иначе будет утечка ресурсов. Именно этот случай финалайзер с предупреждением и поможет продиагностировать.


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Слабые указатели
СообщениеДобавлено: 27 янв 2018, 17:05 
Не в сети

Сообщения: 108
budden писал(а):
Аварийная деинициализация по идее должна содержать в себе грозное и неубираемое предупреждение со словами: данная кривая программа не подчистила за собой. В идеале программа должна падать.


Я тебя умоляю. Падать? В продакшине? Что за экстремизм. Диагностика - да, хотя и зависит от характера потреянного ресурса.

budden писал(а):
Причина проста - неизвестно, когда произойдёт сборка мусора, а при консервативном сборщике мусора - неизвестно, произойдёт ли она вообще. Поэтому отпускание ресурсов не гарантировано.


Все правильно. Но применительно к COM и BB - такая аварийная деинициализация это компромисс. Ты давно вручную ссылки считал? Мне вот до сих пор приходится время от времени, когда надо состыковаться с ObjectiveC кодом на macOS. Это каждый раз как первый раз - тупые трудноуловимые баги. В языке без RAII или аналога ARC от Apple остаются только GC и финалайзеры.

Если в языках без GC ты уже заботишься об освобождении памяти, то тебе достаточно естественно добавить и ручной декремент ссылок. Но если у тебя язык с GC в котором отродясь не было никаких Free() и т.п., то добавление всего-лишь одной COM ссылки, которую надо считать, затрагивает сразу всю иерархию объектов - у всех у них теперь должен быть Free(), на который можно повесить декремент ссылки. Работать на практике это не будет, остаются только финалайзеры, так что разработчики ББ выбрали абсолютно правильное решение.


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Слабые указатели
СообщениеДобавлено: 27 янв 2018, 20:09 
Не в сети

Сообщения: 338
Ну, может быть, я что-то недопонял в том, как оно должно использоваться. В Kernel есть процедура Release, т.е. есть возможность уничтожать COM-объекты руками. Но в примерах она не используется. И во введении говорится про сборку мусора для COM-объектов. Мне видится тут какое-то несоответствие.

Но хорошо, если те, кто реально пишут COM на Обероне, понимают, что финалайзеры - это только аварийная соломка, а не штатное средство, то всё Ок.

Ладно, пусть не падает программа в продакшене, но ругаться она всё же должна достаточно внятно, чего мы в ББ не наблюдаем.


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Слабые указатели
СообщениеДобавлено: 28 янв 2018, 07:58 
Не в сети

Сообщения: 108
budden писал(а):
Ну, может быть, я что-то недопонял в том, как оно должно использоваться.


Ну представь, что нет поддержки COM и тебе надо ее реализовать. Ну или просто использовать COM. Вот ты создал COM объект, получил ссылку и положил ее как поле в RECORD, и эта RECORD пошла гулять по системе (т.е. время жизни RECORD неизвестно). Когда будешь освобождать (Release) COM объект? Кроме как в финалайзере негде...


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Слабые указатели
СообщениеДобавлено: 28 янв 2018, 12:28 
Не в сети

Сообщения: 338
Release делать явно, когда COM-объект больше не нужен, и в Record-е это помечать. А сама запись пусть дальше живёт - это уже просто запись, а не COM-объект. Финалайзер должен лишь проверять, что объект уже освобождён и в противном случае ругаться. Только так и никак иначе.


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Слабые указатели
СообщениеДобавлено: 28 янв 2018, 15:53 
Не в сети

Сообщения: 108
budden писал(а):
Release делать явно, когда COM-объект больше не нужен, и в Record-е это помечать. А сама запись пусть дальше живёт - это уже просто запись, а не COM-объект. Финалайзер должен лишь проверять, что объект уже освобождён и в противном случае ругаться. Только так и никак иначе.


Представь, что RECORD реализует некий абстрактный интерфейс. COM-объект инкапсулирован и используется для реализацией абстрактного интерфейса RECORD'а. Все по канонам ООП. Кто и в какой момент будет дергать Release при условии, что это не scoped-объект? В случае языка без GC все понятно - Release дергается в деструкторе. В случае GC выбор не велик - только финализатор.


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Слабые указатели
СообщениеДобавлено: 29 янв 2018, 09:27 
Не в сети

Сообщения: 338
Для файлов же есть Close. В чём разница?


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

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


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

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


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

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
© VEDAsoft Oberon Club