Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Julia 是已编译/eval’的内存;在Chez计划中收集垃圾的ed程序?_Julia_Genetic Programming_Garbage Collection_Scheme_Chez Scheme - Fatal编程技术网

Julia 是已编译/eval’的内存;在Chez计划中收集垃圾的ed程序?

Julia 是已编译/eval’的内存;在Chez计划中收集垃圾的ed程序?,julia,genetic-programming,garbage-collection,scheme,chez-scheme,Julia,Genetic Programming,Garbage Collection,Scheme,Chez Scheme,在运行时包含编译器的多个(可能是大多数)语言实现忽略了对废弃代码进行垃圾收集(例如,请参见类似应用程序中的位置) 我的初步测试表明Chez方案在这里不会泄漏内存,但我想更确切地知道,因为我甚至不知道f和g是否真的得到编译。(古老的咒语:“测试只能证明bug的存在,而不是它们的缺失”) 我尝试的测试:f和g互相调用,它们的定义在运行时被替换 (define f) (define g) (define (make-f x) (eval `(set! f (lambda (y)

在运行时包含编译器的多个(可能是大多数)语言实现忽略了对废弃代码进行垃圾收集(例如,请参见类似应用程序中的位置)

我的初步测试表明Chez方案在这里不会泄漏内存,但我想更确切地知道,因为我甚至不知道
f
g
是否真的得到编译。(古老的咒语:“测试只能证明bug的存在,而不是它们的缺失”)


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

(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
(定义f)
(定义g)
(定义(make-f x)
(eval`(set!f)(λ(y))
(如果(>y 100)
(+(余数,x3)(gy))
(+y 1(()())))
(定义(make-g x)
(eval`(set!g)(λ(y))
(如果(in)
行政协调会
(开始
(make-f i)
(make-g i)
(环路(+i 1)(+acc(f 33()())())))
(时间(制造和运行1000000法郎);运行时间为10分钟,内存可忽略不计

鉴于过程和垃圾收集对Scheme的重要性,如果Chez Scheme不尝试垃圾收集任何动态创建的对象,我会感到惊讶。[我的重点]:

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

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

Chez方案手册似乎是确定的,但:

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


在20世纪90年代,Kent Dybvig与David Eby和Carl Bruggeman共同撰写了一篇论文,这篇论文在这里可能会引起兴趣,名为,它描述了在Chez方案中实现的垃圾收集策略。在本文中,花了一些时间讨论“代码对象”,特别是在垃圾收集过程中如何对它们进行隔离和区别对待(因为它们可能包含指向其他对象的指针)。

您的代码
define
已定义的绑定,因此它不是合适的标准方案,结果未得到充分指定。定义它的顶层并使用
set。@Sylvester已更新,谢谢。我模模糊糊地记得使用了一个没有重新定义
的方案。开局?麻省理工学院?交互式开发因此很麻烦。