纯语言中的垃圾回收有何不同?


26

在像Haskell这样的纯语言中,所有数据都是不可变的,并且无法以任何方式更改现有的数据结构。另外,许多关于不变数据的算法和功能性编程模式本质上会产生大量垃圾(map例如,创建中间列表的链)。

面对纯净性,垃圾收集器会采用哪些策略和技术?在不纯语言的GC中(不是在纯上下文中),什么功能很好?纯语言为GC创建了哪些其他新问题?



Answers:


13

ghc的当前实现使用一种策略,该策略只能起作用,因为该语言是纯函数性的,并且数据是不可变的:因为无法将任何变量更改为引用任何更新的对象,因此对象仅保留对较旧对象的引用,因此它运行代垃圾回收器; 由于更高世代引用的对象只有在该世代被GCd之前才能被删除,因此它会急切地将对象提升为更高世代。并且由于在GC扫描引用时不会改变任何引用,因此它可以并行运行。

这是更详细的论文


4
渴望晋升依靠懒惰-更新旧一代中的thunk可以为新一代创建指针,但是thunk只会变异一次,因此足以热心地推广年轻对象。其他旧的引用(例如,来自可变数组的引用)使用“记忆集”进行跟踪,以防急于升级失败。
乔恩·普迪

1

在像Haskell这样的纯语言中,所有数据都是不可变的,任何现有数据结构都无法以任何方式更改

实际上,通常情况并非如此。纯语言使用非严格(惰性)评估,因此推迟了对所有子表达式的评估。未求值的表达式通常堆分配为“ thunk”。需要时,对表达式进行求值,然后将thunk 突变为结果值。

面对纯净性,垃圾收集器会采用哪些策略和技术?

我唯一能想到的就是黑洞。我不记得在Haskell研究论文中在GC方面看到任何其他新内容。

在不纯语言的GC中(不是在纯上下文中),什么功能很好?

GC写屏障。不纯洁的语言倾向于将指针写入堆中的次数更多,因此它们倾向于更严格地优化其写入障碍。

其他GC算法(例如标记区域)在不纯语言的情况下更可行,因为它们的分配率比纯语言低得多。

纯语言为GC创建了哪些其他新问题?

纯语言非常罕见,因此有关纯程序如何使用内存的数据很少,因此,尝试为纯语言编写GC时,您的处境会更糟。


“在需要时,将对表达式求值,并将thunk变异为结果值。” 就Haskell用户而言,这是内部实现细节。无法观察到突变,因此从用户的角度来看,这并不是突变。
杰克

此外,纯语言完全可能是严格的-请参阅Idris作为示例。
杰克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.