Автоматическое удаление временных объектов

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Re: Автоматическое удаление временных объектов

Сообщение sts » 07.07.2017 23:38:12

pda писал(а):Как это нет, когда он туда передан и там хранится ссылка? Да ещё и сильная в современных терминах. Да ещё и все переменные в Delphi/FPC считаются volatile, потому что это ключевое слово в язык не завезли.


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

Добавлено спустя 8 минут 45 секунд:
ничего не отслеживает.

Добавлено спустя 1 минуту 58 секунд:
fpc 3.0.0
sts
постоялец
 
Сообщения: 406
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: Автоматическое удаление временных объектов

Сообщение zub » 08.07.2017 00:57:14

>>ничего не отслеживает.
и слава богу.

за "слежкой" нужно сюда https://svn.freepascal.org/cgi-bin/view ... _pointers/
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Re: Автоматическое удаление временных объектов

Сообщение Снег Север » 08.07.2017 04:50:24

olegy123 писал(а):эти фокусы TObjectList умеет делать
Собственно - да. И не понимаю, зачем еще велосипеды городить...
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: Автоматическое удаление временных объектов

Сообщение vitaly_l » 08.07.2017 09:26:41

С одной стороны, вроде как удобно и познавательно, с другой стрёмно, т.к. не проверяется компилятором, с третьей уже есть стандартный вариант. В итоге не дай бог, что-то там слетит, и искать баг становится сложнее в 10 000 раз. А если ещё и слетит при обновлении версии FPC, т.к. они там чего-то доделают, то найти баг станет невозможно. А так, очень хорошая и удобная фишка, но безопаснее стандартные инструменты (даже если Ваш вариант, так же надёжен, как и стандартный). ИМХО
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Автоматическое удаление временных объектов

Сообщение Лекс Айрин » 08.07.2017 09:59:43

pda писал(а): Три на создание, три на удаление.


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


pda писал(а): Ну и try/finally. Счастливого рефакторинга.


Ой, вот про try/finally ты точно зря сказал. Эту конструкцию, в подавляющем количестве случаев, используют неправильно, когда лень писать проверки. Если их вдруг, написать, то необходимость внезапно (!) пропадает. При этом, почему-то, завывают, что обработка прерываний это дополнительные накладные расходы. И если у тебя несколько вложенных исключений там где достаточно одного, то это уже клиника. Если функция клеит ласты, то неважно по какой причине -- выполнение все равно невозможно.

pda писал(а):Gzip поток создай.


распотроши и преобразуй в функцию... даже в три (общая, создание таблицы преобразований и собственно распаковка).
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Автоматическое удаление временных объектов

Сообщение olegy123 » 08.07.2017 11:41:29

Лекс Айрин писал(а):Ой, вот про try/finally ты точно зря сказал. Эту конструкцию, в подавляющем количестве случаев, используют неправильно, когда лень писать проверки.

Бывают случаи когда проверки не спасают - например работа в сети. finally гарантированно будет выполнено.
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: Автоматическое удаление временных объектов

Сообщение Лекс Айрин » 08.07.2017 12:12:24

olegy123 писал(а):Бывают случаи когда проверки не спасают - например работа в сети.


А никто не говорит, что их не нужно использовать совсем. Понятное дело, что иногда без этого не обойтись... но не при каждом же чихе.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Автоматическое удаление временных объектов

Сообщение Дож » 08.07.2017 17:31:49

Потрясающая идея и библиотека!

pda, а действительно ли необходима зависимость от тяжёлого SysUtils?
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Автоматическое удаление временных объектов

Сообщение pda » 11.07.2017 18:04:34

wadman писал(а):Линуксы и иже с ними поддерживаются?

Тесты в Linux проходят. Потребовалось чуть поправить проект (вечная проблема с регистрочувствительными именами файлов).

zub писал(а):ненадо нам в паскале такого))

Зря. Вполне полезная вещь, позволяющая компилятору не перечитывать код из памяти.

olegy123 писал(а):эти фокусы TObjectList умеет делать

TObjectList не умеет сам себя удалять.

P.S. Довёл до версии 1.0.2. Теперь добавлена защита от исключения в деструкторе (все знают, что деструкторы не должны бросать исключения, но всякое бывает). Если такое случится - удаление объектов продолжится так, чтобы минимизировать утечки памяти только теми объектами, которые не смогли разрушиться. Потом первое из случившихся исключений будет перевыброшено.

Провёл изучение ассемблерного листинга кода функций с оптимизацией и без, а так же с разными режимами оптимизации в Free Pascal. Больше всего меня конечно Delphi x64 смущал. Там llvm используется, а это довольно умный компилятор. Но нет. Похоже кодогенератор жёстко вставляет @InitializeRecord/@FinalizeRecord в Delphi и fpc_initialize/fpc_finalize до и после тела функции соответственно.

Тем не менее. Добавил тест на рекурсивное решение ханойских башен. В процессе создаются и удаляются объекты. Работает как часы.

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

Добавлено спустя 3 минуты 40 секунд:
Дож писал(а):Потрясающая идея и библиотека!

Идея к сожалению не совсем моя. :) Как-то читал очередной срач про C++ и там показывали шаблонный класс умных указателей, удаляющий объекты при выходе из области видимости. И я подумал: "Какого чёрта! Это и в Pascal можно сделать!"

Дож писал(а): а действительно ли необходима зависимость от тяжёлого SysUtils?

Он нужен чтобы обрабатывать исключения. Но если это важно можно предусмотреть варианты компиляции, при которых на исключения будет забито, как и на SysUtils.

Добавлено спустя 5 минут 6 секунд:
А вообще, посмотрел как сейчас обрабатываются исключения. SysUtils им уже не нужен. Удалил его.

Добавлено спустя 14 минут 20 секунд:
Лекс Айрин писал(а):Если функция клеит ласты, то неважно по какой причине -- выполнение все равно невозможно.

Хорошо, посмотрим ещё на мой пример. Что тут может пойти не так? Может быть передано имя несуществующего файла. Может быль передано имя файла, прав на чтение которого нет. Файл может быть битый и gzip не распакует его. В указанном месте сохранения нельзя создать файл.

Итого. Допустим у нас не приложение-калькулятор, а сервис, который месяцами нон-стопом работать будет. Проигнорировали исключений - сервис обвалился. Замели их под ковёр - утечка памяти. Понимаете? Вон, на веб-сервисах на скриптах память обычно только выделяется. Потому что скрипт живёт 0.000 секунды. А потом всё равно умирает. А бывает и наоборот.

Лекс Айрин писал(а):распотроши и преобразуй в функцию

Вот это вообще - без комментариев. :) Потрошить стандартные пакеты или сторонние библиотеки. Чтобы с новой версией делать всё заново. И ради чего? Там по любом есть своё выделение памяти под какие-нибудь буферы.

Добавлено спустя 3 минуты 48 секунд:
vitaly_l писал(а):и искать баг становится сложнее в 10 000 раз

Это немедленно палится модулем heaptrq. (Объекты не удалены.) Который по хорошему должен быть включен в отладочной сборке вообще у каждого. :)
Аватара пользователя
pda
постоялец
 
Сообщения: 303
Зарегистрирован: 27.05.2005 19:59:53

Re: Автоматическое удаление временных объектов

Сообщение Лекс Айрин » 11.07.2017 20:02:04

pda писал(а):Хорошо, посмотрим ещё на мой пример.


Хорошо..
pda писал(а): Может быть передано имя несуществующего файла.


ласты дружно вместе, программу в топку. Программиста на кол как диверсанта.

pda писал(а):Может быль передано имя файла, прав на чтение которого нет.


Как бы это тоже проверяется ДО передачи файла в функцию.

pda писал(а):Файл может быть битый и gzip не распакует его.



Ласты дружно вместе (если, конечно, не используется механизм восстановления данных архива.)

pda писал(а): В указанном месте сохранения нельзя создать файл.


Вопрос года! Зачем создавать файл в месте, в котором его нельзя создать? Да и это можно (и нужно) проверить ДО функции. Насчет ласт... как обычно.

Ну и, к вопросу о файлах... зачем функции имена файлов, если можно передать дескрипторы? И не стоит забывать то, что архив может быть из нескольких результирующих файлов.

В общем, из перечисленного только битость архива можно как то обработать... все остальное это КРИТИЧЕСКИЕ ошибки, когда работа просто не может быть продолжена. И давать на все это несколько исключений это бессмыслица -- программа все равно падает.

pda писал(а): Проигнорировали исключений - сервис обвалился. Замели их под ковёр - утечка памяти. Понимаете?



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

pda писал(а):Потрошить стандартные пакеты или сторонние библиотеки. Чтобы с новой версией делать всё заново.


А зачем потом потрошить новую версию? Просто поддерживай свою на уровне. Или слабо?

pda писал(а):И ради чего?


Да чтобы сделать лучше, чем есть.

pda писал(а):Итого. Допустим у нас не приложение-калькулятор, а сервис, который месяцами нон-стопом работать будет.


Сервис, который работает нон-стопом должен писаться так, чтобы у него не было никаких левых исключений. Файлы проверяются до открытия/записи/чтения, проверяется равенство на ноль и права заранее, в общем, если исключение произошло по вине программы, а не системы (аппаратуры), то это причина сервис переписать. Причем, ладно если исключение произошло... а если нет? если идет доступ к критически важным данным?
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Автоматическое удаление временных объектов

Сообщение vitaly_l » 11.07.2017 20:49:18

pda писал(а):Это немедленно палится модулем heaptrq. (Объекты не удалены.) Который по хорошему должен быть включен в отладочной сборке вообще у каждого.

И тут ВДРУГ в версии FPC 4.0 выясняется, что FPC - больше не разрешает такие финты (подпись - злобная старушка Шапокляк). И чел, начинает переписывать всю программу с ноля, меняя всё обратно на стандарт. А вообще, как я уже говорил выше - фича мне нравится. Я сам раньше злился, что их нужно освобождать ручками, а не автоматом.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Автоматическое удаление временных объектов

Сообщение olegy123 » 11.07.2017 22:03:06

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

Лекс Айрин - дышите спокойно.. если что то произойдет, для этого создали exception.. он нужен на случай если пошло не так. А finally - поработал, убери за собой..
А по поводу критически важным данным - то на это есть критические секции...

Добавлено спустя 13 минут 24 секунды:
pda писал(а):TObjectList не умеет сам себя удалять.

Зато другие объекты, в списке удаляет.

У вас сборщик мусора будет?
Или ограничитесь рамками одной функции?
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: Автоматическое удаление временных объектов

Сообщение pda » 11.07.2017 23:25:57

Лекс Айрин писал(а):Как бы это тоже проверяется ДО передачи файла в функцию.

Опционально. Потому что это двойная проверка. Ведь WinAPI/libc её всё равно выполнит. И что интересно вы сделаете, если FileExists вернёт Flase? Выбросите точно такое же исключение? ;-)

Лекс Айрин писал(а):Зачем создавать файл в месте, в котором его нельзя создать?

А какой у вас стаж? Мне просто интересно, на сколько грабель вы наступили? Причин может быть чуть менее, чем миллион. Целевой путь был на сетевом диске - сеть отвалилась. Целевой путь был на отдельном диске - диск отказал. Проводили перенастройку сети - пропали права на доступ. Целевой каталог удалён. В целевом каталоге уже есть такой файл и он открыт с блокировкой другой программой. И т.д.

Лекс Айрин писал(а):И давать на все это несколько исключений это бессмыслица -- программа все равно падает.

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

Лекс Айрин писал(а):Вообще-то, непонятно как можно их "замести под ковер"?

Как-как... :)
Код: Выделить всё
try
  <...>
except
  // По фиг
end;


Лекс Айрин писал(а):Просто поддерживай свою на уровне. Или слабо?

Вот теперь я уже не про стаж, а про возраст спрошу. И про то с какой самой большой программой вам приходилось иметь дело.

Лекс Айрин писал(а):Сервис, который работает нон-стопом должен писаться так, чтобы у него не было никаких левых исключений.

Спасибо за науку. Я сейчас пойду передам ядру системы чтобы никаких левых ошибок там не было. А то их rtl в исключения переводит. :)

Лекс Айрин писал(а):Файлы проверяются до открытия/записи/чтения, проверяется равенство на ноль и права заранее

"Не надо пытаться быть святее папы римского", "чинить то, что не сломано" и "изобретать велосипеды". Выше вы там писали, что исключения не бесплатны. Правда сейчас 2017 год, а не 1997. И у вас 4-гигагерцовый многоядерный монстр, а не Pentium 100. Но так все ваши дополнительные проверки стоят дороже. И знаете что? Они ничего не гарантируют. Мы в многозадачной среде. Пока вы на 1000% убедились, что есть файл, есть права, есть свободное место, ожил соседний процесс и снёс ваш файл и съел всё свободное место. И что теперь? Вот по этому эти проверки и выполняет операционная система. Потому что она сама решает эти вопросы. Если уж она открыла файл - значит открыла.

И самое интересно. Ну напишите вы все ваши проверки. Дальше что? Что вы напишете в ветку else? Выброс такого же исключения? Halt? Кого-то на кол.

Лекс Айрин писал(а):если исключение произошло по вине программы, а не системы (аппаратуры), то это причина сервис переписать

Что такое вина программы? Соседний процесс открыл слишком много файлов (а в Windows их всего 16384 на сессию). Через пару минут его отпустит. Но вот прямо сейчас никто в этой сессии не может открыть ни одного файла. Что прикажете переписывать?

vitaly_l писал(а):И тут ВДРУГ в версии FPC 4.0 выясняется, что FPC - больше не разрешает такие финты

Вероятность стремиться к нулю. Во первых разрабы трясутся над обратной совместимостью. Баги порой править не хотят, чтобы текущие программы не отвалились. Во вторых, учитывая, что FPC медленно но верно ползёт за Delphi скорее в 4.0 появится ARC и код выродится до пустого вызова. :) Не говоря уже о том, что в 3.2 record'ам завезут Initialize, Finalize, Copy, Addref и т.д.
Но пожалуй стоит закинуть ссылку на форумы FPC/Delphi. Будут пользователи - не сломают. :mrgreen:

olegy123 писал(а):У вас сборщик мусора будет?

Нет, конечно. Зачем здесь GC? Это аналог Smart Pointer.
Аватара пользователя
pda
постоялец
 
Сообщения: 303
Зарегистрирован: 27.05.2005 19:59:53

Re: Автоматическое удаление временных объектов

Сообщение olegy123 » 12.07.2017 00:39:41

pda писал(а):Нет, конечно. Зачем здесь GC? Это аналог Smart Pointer.

как раз пишут, что "Умный указатель" может устроить протечку.

Я не большой спец в таких делах, но чувствую, что данное решение породит кучу условностей.
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: Автоматическое удаление временных объектов

Сообщение Снег Север » 12.07.2017 08:31:10

pda писал(а):TObjectList не умеет сам себя удалять.
А зачем ему удалять себя??? Сэкономить несколько байт на ссылке? А всеми динамическими объектами он управляет прекрасно, сто раз использовал.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Пред.След.

Вернуться в Общее

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

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

Рейтинг@Mail.ru