什么是简单的垃圾收集算法,用于试验简单的解释器?

Der*_*all 6 algorithm interpreter garbage-collection

我一直在尝试编程语言设计,并且已经到了需要实现垃圾收集系统的程度.现在我想到的第一件事是引用计数,但这不会处理引用循环.我在搜索算法时遇到的大多数页面都是关于调整现有语言(例如Java)中的垃圾收集器的参考.当我找到任何描述特定算法的内容时,我没有得到足够的实现细节.例如,大多数描述都包括"当你的程序内存运行不足时...",这在4 GB系统上很快就不会发生,并且有很多交换.所以我正在寻找的是一些具有良好实现细节的教程,例如如何调整何时启动垃圾收集器(即,在X次内存分配之后收集,或每隔Y分钟等).

为了更详细地介绍我正在尝试做的事情,我开始编写类似于Postscript的基于堆栈的解释器,我的下一次尝试可能是基于Lisp方言之一的S表达式语言.我正在直接实施C.我的目标是自我教育,并将各个阶段记录为"如何设计和编写解释器"教程.

至于我到目前为止所做的,我编写了一个简单的解释器,它实现了一种C风格的命令式语言,它由堆栈机器式VM进行解析和处理(参见lang2e.sourceforge.net).但是这种语言在输入任何函数时都没有分配新内存,并且没有任何指针数据类型,因此当时并不需要任何类型的高级内存管理.对于我的下一个项目,我想从非指针类型对象(整数,字符串等)的引用计数开始,然后在单独的内存池中跟踪任何指针类型对象(可以生成循环引用) .然后,每当池比上一个垃圾收集周期结束时增长超过X个分配单元时,再次启动收集器.

我的要求是它不是太低效,而且易于实现和清楚地记录(记住,我想把它发展成纸或书,供其他人遵循).我目前在前面获得的算法是三色标记,但看起来像分代收集器会好一些,但更难记录和理解.所以我正在寻找一些明确的参考资料(最好是在线提供),其中包含足够的实施细节以帮助我入门.

Ant*_*ima 5

有一本关于垃圾收集的好书.它被称为垃圾收集:自动动态内存管理的算法,它非常好.我已经读过了,所以我不推荐这个,因为你可以通过Google找到它.看看这里.

对于简单的原型设计,请使用标记和扫描或任何简单的非代数,非增量压缩收集器.只有当您需要从系统提供"实时"响应时,增量收集器才是好的.只要您的系统在任何特定时间点被允许任意滞后,您就不需要增量系统.分代收集器减少了平均垃圾收集开销,但需要花费一些关于对象生命周期的假设.

我实现了所有(分代/非代,增量/非增量)和调试垃圾收集器是相当困难的.因为您希望专注于语言的设计,而不是调试更复杂的垃圾收集器,所以您可以坚持使用简单的垃圾收集器.我最有可能去标记和扫描.

使用垃圾回收时,不需要引用计数.把它扔掉.