2

我写了一个非常简单的编译器,将我的源语言翻译成字节码,这段代码由虚拟机处理(作为一个简单的堆栈机器,所以 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?

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

4

2 回答 2

0

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

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

于 2012-07-05T16:54:13.033 回答
0

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

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

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

在阅读这些内容时,Wikipedia 是一个好的开始,但是Andrew Appel 的编译器书会很方便(那里应该有第二版,并且也有该书的 C 和 ML 版本)。Lambda-the-Ultimate是许多编程语言研究人员讨论事物的地方,因此绝对值得一看。

于 2012-07-05T17:25:43.860 回答