garbage-collection - 在 Scheme/Lisp 实现中不使用垃圾收集器

标签 garbage-collection lisp scheme

对于我的类(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/

相关文章:

java - 垃圾收集和 Picasso 的问题

vim - 如何更改 'Screen' 中的字体大小,Limp 用来连接到 SBCL 的屏幕管理器?

linux - 打印前 Lisp 奇怪的新行

functional-programming - 列表作为通用数据类型表示的缺点是什么?

c# - 窗体关闭后如何显示?

c# - 什么时候分配和租用阵列更合适?

python - 为什么迭代器在 Python 文档中被认为是函数式的?

计划 - 二十一点计划 (SICP)/学习编程

java - 为什么当你有 finalize() 时关闭资源很重要

raspberry-pi - 使用命令行参数调用 CCL + Quicklisp 脚本作为可执行文件并实现所需的输出