编译/评估过程的内存在Chez Scheme中是垃圾收集的吗



多个,也许是大多数,包括编译器的语言实现在运行时忽略了垃圾收集丢弃的代码(例如,参见julia,这会导致遗传编程等应用程序中的内存泄漏(

我的初步测试表明,Chez Scheme在这里不会泄漏内存,但我想更确切地知道,因为我甚至不知道fg是否真的编译了。(古老的咒语:"测试只能证明bug的存在,而不能证明它们的存在"(


我尝试的测试:fg相互调用,它们的定义在运行时被替换。

(define f)
(define g)
(define (make-f x)
(eval `(set! f (lambda (y)
(if (> y 100)
(+ (remainder ,x 3) (g y))
(+ y 1))))))
(define (make-g x)
(eval `(set! g (lambda (y)
(if (< y 10)
(+ (remainder ,x 5) (f y))
(div y 2))))))
(define (make-and-run-f n)
(begin
(make-f 1)
(make-g 1)
(let loop ((i 0) (acc 0))
(if (> i n)
acc
(begin
(make-f i)
(make-g i)
(loop (+ i 1) (+ acc (f 33))))))))
(time (make-and-run-f 1000000)) ; runs in 10 min and negligible memory

考虑到过程和垃圾收集对Scheme的重要性,如果Chez-Scheme没有尝试垃圾收集任何动态创建的对象,我会感到惊讶。R6RS标准称[强调矿]:

Scheme计算过程中创建的所有对象,包括过程和延续,都具有无限的范围。任何Scheme对象都不会被销毁。Scheme的实现不会(通常!(耗尽存储空间的原因是,如果它们能够证明对象不可能对未来的任何计算产生影响,则允许它们回收对象占用的存储空间

过程是一个对象,如果实现能够证明计算不再需要它,那么任何对象都可能被垃圾收集。这不是一个要求,但适用于任何对象,而不仅仅是程序。

Chez Scheme手册似乎是决定性的,尽管(Chez Schem版本9用户指南,第82页(:

由于所有Scheme对象,包括代码对象,都可以由垃圾收集器重新定位甚至回收。。。。

20世纪90年代,Kent Dybvig与David Eby和Carl Bruggeman共同撰写了一篇论文,名为《不要停止BIBOP:动态类型语言的灵活高效存储管理》,描述了Chez Scheme中实现的垃圾收集策略。在论文中花了一些时间讨论";代码对象";特别是它们在垃圾收集过程中如何被隔离和区别对待(因为它们可能包含指向其他对象的指针(。

相关内容

最新更新