【问题标题】:Compiler: How to implement Reference Counting (in a simple VM)编译器:如何实现引用计数(在一个简单的 VM 中)
【发布时间】:2012-07-05 16:49:07
【问题描述】:

我写了一个非常简单的编译器,将我的源语言翻译成字节码,这段代码由虚拟机处理(作为一个简单的堆栈机器,所以 3 + 3 将被翻译成

push 3
push 3
add

现在我在垃圾收集方面很挣扎(我想使用引用计数)。 我知道它的基本概念,如果分配了引用,则该对象的引用计数器会增加,如果它离开范围,则会减少,但我不清楚的是 GC 如何释放获得的对象传递给函数...

这里有一些更具体的例子来说明我的意思

string a = "im a string" //ok, assignment, refcount + 1 at declare time and - 1 when it leaves scope    
print(new Object()) //how is a parameter solved? is the reference incremented before calling the function?

string b = "a" + "b" + "c" //dont know how to solve this, because 2 strings get pushed, then concanated, then the last gets pushed and concanated again, but should the push operation increase the ref count too or what, and where to decrease them then?

如果有人能给我提供实现引用计数的教程的链接,或者如果有人以前遇到过这个问题,我会很高兴帮助我解决这个非常具体的问题(我的问题是我不明白何时增加、减少引用或在哪里计数已存储)

【问题讨论】:

    标签: garbage-collection implementation reference-counting


    【解决方案1】:

    我认为文字可能会发生一些事情。您可以将它们视为文字数字,它们是常量并且永远存在,或者您可以有一个隐式变量,在 print 之前重新训练计数为 1,然后释放它。

    针对您的编辑: 您可以使用隐式变量解决方案,也可以使用 Objective-C 中的“自动释放”概念。你有一个对象被放置在自动释放池中,该对象将在很短的时间内释放,对象的接收者可以在其中保留它。

    【讨论】:

      【解决方案2】:

      首先,您的语言允许将哪些类型的对象放入堆中?字符串?你有可变或不可变的字符串吗?

      查看这篇关于Strings in Java 的帖子。因此,在类似 Java 的语言中,每次连接它们时都会复制字符串,因为它们是不可变的。还有"this is a string"其实是对字符串类的构造函数的调用。

      如果print() 的参数是对构造函数(new Object()) 的调用,则在调用函数的范围内没有对对象的引用,因此该对象位于函数的范围内,计数器应该递增并随着进入和离开print() 函数的范围而相应递减。如果在调用范围内调用构造函数并将其分配给变量,则它位于调用范围内。

      在阅读相关内容时,维基百科是一个好的开始,但Andrew Appel's compiler book 会很方便(那里应该有第二版,并且还有 C 和 ML 版本的书)。 Lambda-the-Ultimate 是许多编程语言研究人员讨论事物的地方,所以绝对值得一看。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-30
        • 2011-04-26
        • 1970-01-01
        • 2013-05-26
        • 1970-01-01
        • 1970-01-01
        • 2011-03-25
        相关资源
        最近更新 更多