对于我的班级项目,我必须实现一个(简单的)Scheme 编译器。
在这一点上,我正在集思广益如何实现各种功能。
为什么典型的 Scheme 实现会为复杂的 GC 所困扰?如果代码真正起作用(没有副作用),则当前未执行的函数无法保留分配的内存。曾经!(除非它是泄漏!)
因此,为什么不直接使用大多数命令式语言遵循的策略,例如C
堆栈分配。每次进入新的词法上下文时(即(define (foo ..)
or (letrec ...
),在堆栈上分配变量存储,然后在退出上下文时简单地调整堆栈指针。
由于方案没有malloc()
并且只允许分配预定义类型,一个简单的实现可以使用池或区域分配器,因此“堆栈”不应该碎片化。
我不必实现闭包,但我认为即使是那些也可以通过将绑定值复制到一个单独的堆栈来完成,该堆栈专门用于跟踪闭包状态。
想法?