tgoop.com/gdb_dbg/34
Last Update:
Люблю запах финализаторов по утрам! (часть 4, заключительная)
Почему же все так плохо с финализацией? За простейшей, казалось бы идеей, кроется какое-то бесконечное минное поле, продолжать описывать проблемы можно было бы еще очень долго. Мне кажется, что ответа здесь два:
1) Финализация зачастую неотрывно связана с интеропом с unmanaged языками. По моему опыту главный клиент финализации - человек, который хочет почистить нативные ресурсы, это описывает прям большинство юзкейсов. А managed и unmanaged языки - это миры принципиально разного устройства: понятие времени жизни объектов, детерминированность исполнения и ее отсутствие, концепция владения ресурсами, все это может очень сильно отличаться. Когда вы пишите финализатор, вы зачастую начинаете эти миры смешивать, случается сопряжение сфер, отсюда и лезут всякие черти.
2) Финализация - это попытка вмешаться в работу GC, т.е. фича языка, заведомо тесно связанная с реализацией. И как бы не хотелось от реализации абстрагироваться, в этом случае реальность будет больно бить пользователя этой фичи по голове.
Как видите, разные рантаймы стараются решить проблему финализации, но все они имеют свои недостатки. Я видел еще несколько вариантов механизмов финализации в других языках, включая запретительные (когда в финализаторах почти ничего нельзя делать), но все они были не лишены изъянов, а точнее все так же создавали кошмарные ситуации и интересные баги. Мои фавориты на данный момент - это C# (SafeHandle
- круто!) и, на удивление, Python с weakrefs.finilze(...)
.
Если вы знаете managed язык, где проблема финализации полностью решена, напишите, пожалуйста, в комментарии, как именно там это было достигнуто, это действительно очень интересно!
BY Алло, это отладочная?
Share with your friend now:
tgoop.com/gdb_dbg/34