2012-07-05 65 views
1

我編寫了一個非常簡單的編譯器,它將我的源語言翻譯爲字節碼,該代碼由VM處理(作爲簡單的堆棧機器,因此3 + 3將獲得翻譯成編譯器:如何實現引用計數(在一個簡單的VM中)

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? 

一些更具體的例子,我會很高興,如果有人可以給我教程的鏈接實現引用計數或幫我這個非常具體的問題,如果有人收到這個問題(我問題是,我不明白何時增加,刪除參考或計數存儲在哪裏)

回答

0

我認爲文字可能會發生一些事情。你可以像字面數字那樣對待它們,它們是常量並永遠存在,或者你可以有一個隱含變量,在print之前重新計數爲1,並在之後釋放它。

在回答您的編輯: 可以使用隱含變量的解決方案,也可以使用從Objective-C中的「自動釋放」的概念。你有一個放置在自動釋放池中的對象,它會在很短的時間內釋放,對象的接收者可以保留它。

0

首先,你的語言允許放在堆上什麼類型的對象?字符串?你有可變或不可變的字符串嗎?

看看這個帖子關於Strings in Java。所以在像Java這樣的語言中,每次連接它們時,字符串都會被複制,因爲它們是不可變的。另外"this is a string"實際上是對字符串類構造函數的調用。

如果print()的參數是對構造函數(new Object())的調用,那麼在調用該函數的作用域中沒有對該對象的引用,因此該對象位於該函數的作用域中,並且計數器應相應地遞增和遞減進入和離開print()功能的範圍。如果構造函數在調用範圍內調用並分配給變量,則它位於調用範圍內。

在閱讀有關東西時,維基百科是一個很好的開始,但Andrew Appel's compiler book會很方便(應該有第二版,並且還有C和ML版本的書)。 Lambda-the-Ultimate是許多編程語言研究人員討論的地方,絕對值得一看。

相關問題