如果您要设计一种具有自动内存管理功能的编程语言,那么使用引用计数是否可以提供确定性保证,而垃圾收集器是不可能做到的?

对于功能性语言还是命令性语言,这个问题会有不同的答案吗?

最佳答案



保证一词很重要。这是可以为您提供引用计数的保证:

  • 分配中用于调整引用计数的恒定时间开销。
  • 释放引用计数为零的对象的恒定时间。 (关键是您不能立即减少该对象的子代;相反,当该对象用于满足将来的分配请求时,必须懒惰地执行此操作。)
  • 当相关的空闲列表不为空时分配新对象的恒定时间。此保证是有条件的,并不值得。

  • 使用引用计数无法保证以下几点:
  • 分配新对象的恒定时间。 (在最坏的情况下,堆可能会增长,并且取决于系统,组织新内存的延迟可能会很大。甚至更糟的是,您可能会填满堆而无法分配。)
  • 回收并重用所有无法访问的对象,同时保持其他操作的恒定时间。 (标准的引用计数器不能收集循环垃圾。有许多巧妙的解决方法,但是通常它们会使用于简单操作的固定时间保证无效。)

  • 现在有一些实时垃圾收集器为暂停时间提供了非常有趣的保证,并且在最近5年中,引用计数和垃圾收集方面都有了非常有趣的发展。在我作为一个知情的局外人那里,没有明显的赢家。

    IBM的David Bacon和Technion的Erez Petrank进行了一些有关引用计数的最新最佳工作。如果您想学习复杂的现代引用计数系统可以做什么,请查阅他们的论文。除其他外,他们正在以惊人的方式使用多个处理器。

    有关更一般的内存管理和实时保证的信息,请查看International Symposium on Memory Management



    因为您询问担保问题,所以没有。但是对于内存管理而言,对于命令性语言(很多突变但分配率低),不纯功能语言(几乎没有任何突变但分配率高)和纯懒惰的功能语言(很多),性能折衷却大不相同。突变(所有这些都认为正在更新)和较高的分配率)。

    09-27 22:19