代码之家  ›  专栏  ›  技术社区  ›  MWB

编译/评估过程的内存是否在Chez方案中被垃圾收集?

  •  0
  • MWB  · 技术社区  · 5 年前

    在运行时包含编译器的多个(可能是大多数)语言实现忽略了垃圾收集丢弃的代码(例如,请参见 leads to memory leaks 在应用程序中,例如 )

    f g 事实上


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

    (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
    
    0 回复  |  直到 5 年前
        1
  •  1
  •   ad absurdum    5 年前

    考虑到过程和垃圾收集对Scheme的重要性,如果Chez Scheme不尝试垃圾收集,我会感到惊讶 动态创建的对象。这个 R6RS Standard says [我的重点]:

    如果他们能够证明某个对象不可能对未来的任何计算产生影响,则允许他们回收该对象占用的存储空间。

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

    不过,Chez方案手册似乎是确定的 (Chez Scheme Version 9 User's Guide, p. 82) :

    因为所有的方案对象,包括代码对象,都可以被垃圾收集器重新定位甚至回收。。。。

    20世纪90年代,肯特·戴维格(Kent Dybvig)与大卫·艾比(David Eby)和卡尔·布鲁格曼(Carl Bruggeman)共同撰写了一篇论文,名为 Don’t Stop the BIBOP: Flexible and Efficient Storage Management for Dynamically Typed Languages