5

对于我的班级项目,我必须实现一个(简单的)Scheme 编译器。

在这一点上,我正在集思广益如何实现各种功能。

为什么典型的 Scheme 实现会为复杂的 GC 所困扰?如果代码真正起作用(没有副作用),则当前未执行的函数无法保留分配的内存。曾经!(除非它是泄漏!)

因此,为什么不直接使用大多数命令式语言遵循的策略,例如C堆栈分配。每次进入新的词法上下文时(即(define (foo ..)or (letrec ...),在堆栈上分配变量存储,然后在退出上下文时简单地调整堆栈指针。

由于方案没有malloc()并且只允许分配预定义类型,一个简单的实现可以使用池或区域分配器,因此“堆栈”不应该碎片化。

我不必实现闭包,但我认为即使是那些也可以通过将绑定值复制到一个单独的堆栈来完成,该堆栈专门用于跟踪闭包状态。

想法?

4

2 回答 2

7

即使没有闭包,别名也是困难的部分。具体来说,假设一个过程创建了一段结构化的数据,然后返回其中的一部分?您如何确定要释放哪些部分?如果你能解决这个问题......好吧,你刚刚重新发明了垃圾收集。

对于这个有点不同的看法,你可能想看看 Rust (www.rust-lang.org),这是一种系统级语言,它允许程序员通过使用区域和要求程序员显式跟踪所有权来避免所有 GC使用不同的指针类型。

于 2013-04-26T16:43:19.560 回答
6

完成执行的函数将对象返回给它们的调用者。这些对象不能在这些函数的堆栈帧中分配。

所以要么你必须禁止返回值(在这种情况下,你有不是函数式编程的过程:为了做任何有用的事情,这些过程必须有副作用)。

或者您必须按值制作所有内容:当返回一个对象时,它会从返回函数的堆栈帧(随后被释放)复制到调用者的堆栈帧中。

按值系统具有性能和语义限制。

于 2013-04-26T18:03:07.747 回答