我曾经读过一些关于理想主义但“懒惰”程序员尝试实现编程语言的共同思想。它如下: -
'我知道,我会做一个易于实现和快速编写的引用计数GCer,然后在我有时间时将其重新实现为真正的GCer。'
当然,这种重新实现永远不会发生。
但是,我质疑为什么需要这样的重新实现。为什么增量和并发类型的标记和扫描收集器被认为优于Perl 5和Python等语言所谓的过时方法? (是的,我知道Python使用标记和扫描收集器来增强这种方法。)
循环引用是此类讨论中的第一个主题。是的,它可能是一种痛苦(参见Perl中的递归代码转换,并修复它涉及多个赋值和引用弱化。)是的,当编码器必须不断监视该类型的引用时,它并不那么优雅。
虽然替代品更好吗?我们可以讨论永恒的细粒度实现细节,但事实是,大多数标记和扫描GC实现都存在以下问题: -
标记和扫描的缺点是否合理地解决了引用计数问题,这些问题可以通过弱引用来缓解?