在垃圾收集语言中实现垃圾收集器是否有意义

Lit*_*per 4 java compiler-construction interpreter garbage-collection vm-implementation

我想在Java或Haskell中实现垃圾收集器(GC),但这有意义吗?

我是否能够控制我自己的GC实现何时启动而不是GC的实现语言?

我想这个问题可以有三种答案:

  1. 在运行禁用实现语言的GC的虚拟机(VM)时设置标志.
  2. 使用一个特殊的构造,让我管理自己的记忆,比如使用延续传递方式(CPS)来管理我自己的评估策略.
  3. 不,使用没有GC的语言.

看看这些:

  1. 我更喜欢第二种选择,因为我将能够在所有语言中使用该构造.
  2. 我不喜欢第一个选项,因为我还必须管理我的解释器的内存.
  3. (而且我不喜欢第三种选择,但我无法控制它)

这与我在带有垃圾收集器的语言上构建解释器并不重复.我需要一个翻译垃圾收集器?因为我希望我的引导与解释底层GC.

Gho*_*ica 6

正如在IT中经常这样,答案是:它取决于.

您的口译员在您的语境中控制所有"对象"时; 当然,你的翻译可能会保留所有"它"对象的列表.因此,即使这些对象以某种方式对JVM可见,它们也都可以访问,因此它们是活的; 所以他们不能接受JVM gc.

但是当你以某种方式"将"解释器处理的对象"嵌入"到周围的java上下文中时 - 那么JVM gc可能会对它们负责.

从那里开始,答案就会朝着这个方向发展:是的,这可能是可能的.但除此之外; 这实际上取决于你的目标和驾驶要求.您是否为纯粹的教育目的实施此项目; 或者您是否有兴趣创建某种对其他人具有"真正"价值的"真实"产品?

如果是后一种情况,那么您可能希望将解释器与JVM紧密地嵌入 - 以便从将JVM变为今天的优秀平台的大量投资中获益.你看,近20年的研究进入了当前的JVM JIT编译器和GC技术.你想利用它来"做你自己的事情"......

因此,如上所述:它在很大程度上取决于您的"真实"目标.

最后:您可能会发现JRuby和JVM平台上的这个SE-Radio 播客对您的问题有帮助.JRuby人员对标准Ruby引擎的性能不满意; 他们选择JVM作为平台来构建更好的 Ruby引擎......


uli*_*ess 2

有什么意义?如果你想实现自己的GC只是为了学习涉及的算法,那也没关系。GC 基本上只管理相互引用的资源,直到它们不再引用为止。这在 Java 和其他 GCed 语言中完全可行。您只需调用该对象的另一个方法并将其从“活动”对象列表中删除,而不是释放内存。

对于运输产品?没有把握。您可以利用实现语言中的现有机制,但 GC 通常需要控制何时应放弃内存。如果实现语言阻止了这一点,那就是一个问题。