对于我的类(class)项目,我必须实现一个(简单的)Scheme 编译器。
此时我正在集思广益如何实现各种功能。
为什么典型的 Scheme 实现会遇到复杂的 GC?如果代码真正起作用(没有副作用),则非当前正在执行的函数无法保留分配的内存。曾经! (除非是泄漏!)
因此,为什么不直接使用大多数命令式语言遵循的策略,例如 C
,即堆栈分配。每次输入一个新的词法上下文(即(define (foo ..)
或(letrec ...
)时,在堆栈上分配变量存储,然后简单地调整堆栈指针一旦上下文退出。
由于方案没有 malloc()
并且只允许分配预定义的类型,一个简单的实现可以使用池或区域分配器,因此“堆栈”永远不会碎片化。
我不必实现闭包,但我认为即使是那些也可以通过将绑定(bind)值复制到单独的堆栈来以同样的方式完成,该堆栈专门用于跟踪闭包状态。
想法?
最佳答案
即使没有闭包,别名也是困难的部分。具体来说,假设一个过程创建了一段结构化的数据,然后返回其中的一部分?您如何确定要释放的部分?如果你能解决这个问题......好吧,你刚刚重新发明了垃圾收集。
如果对此有所不同,您可能想看看 Rust (www.rust-lang.org),这是一种系统级语言,它允许程序员通过使用区域和要求程序员避免所有 GC使用不同的指针类型明确跟踪所有权。
关于garbage-collection - 在 Scheme/Lisp 实现中不使用垃圾收集器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16240183/