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

时间:2017-05-04 17:47:05

标签: java compiler-construction garbage-collection interpreter vm-implementation

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

我是否可以控制我自己的GC实施时间而不是实施语言的GC?

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

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

    1. 我更喜欢第二个选项,因为我可以在所有语言中使用该构造。
    2. 我不喜欢第一个选项,因为我也必须管理我的翻译记忆。
    3. (我不喜欢第三种选择,但我无法控制)
    4. 这不是I build a interpreter on a language with a garbage collector. I need a garbage collector for the interpreter?的重复,因为我想要使用底层GC引导我的解释器。

4 个答案:

答案 0 :(得分:6)

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

你的解释器控制你的上下文中的所有“对象”时;当然,你的翻译可能会保留所有“它”对象的列表。因此,即使这些对象以某种方式对JVM可见,它们也都可以访问,因此它们是活的;所以他们不能接受JVM gc。

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

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

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

所以,如上所述:它在很大程度上取决于你的“真实”目标。

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

答案 1 :(得分:1)

你已经明确地决定了这个问题。从远程来看,GC方案可能会以某种方式比JVM提供的方案更好。但请考虑一下:在所有已经移植到JVM的语言中,有多少利用JVM,包括它的GC?

不过,这是一个意见和实验问题。希望我们都有智慧将一个想法作为一个假设,并试图在一个潜在的错误方向旋转之前反驳它。如果它能够经受住反击尝试,那就去吧。

我建议使用您自己设计的相对强大的示例应用程序实际编写不同的方法。找出GC效率的指标。弄清楚你自己编写的工作量,以及它如何影响好或坏的指标。您自己的经验将指导您。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

如果用Java编写程序,JVM的GC将自动管理程序的内存。您现在想要为另一种编程语言实现一个新的GC,但它也是一个程序。因此,JVM的GC将为您自己的GC管理内存,然后您自己的GC将管理目标编程语言的内存。

问题是,如果JVM的GC停止了全世界,那么它将停止你自己的GC,你自己的GC也将停止你的目标编程语言的世界。

所以,是的,您可以使用Java或其他语言使用GC实现自己的GC,但这不是必需的。如果您自己的GC不会被其他GC管理,那就没问题。