2

ソース言語をバイトコードに変換する非常に単純なコンパイラを作成しました。このコードは VM によって処理されます (単純なスタック マシンとして、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

まず、あなたの言語ではどのタイプのオブジェクトをヒープに置くことができますか? 弦?可変または不変の文字列はありますか?

Java の文字列に関するこの投稿を確認してください。したがって、Java のような言語では、文字列は不変であるため、連結するたびに文字列がコピーされます。また"this is a string"、実際には文字列クラスのコンストラクターへの呼び出しです。

への引数がprint()コンストラクターへの呼び出しで(new Object())ある場合、関数を呼び出しているスコープ内のオブジェクトへの参照はありません。したがって、オブジェクトは関数のスコープ内に存在し、カウンターはスコープの出入りに応じて増減する必要があります。print()関数の。コンストラクターが呼び出しスコープで呼び出され、変数に割り当てられている場合、コンストラクターは呼び出しスコープに存在します。

ウィキペディアは良い出発点ですが、Andrew Appel のコンパイラの本があると便利です (そこには第 2 版があり、本の C および ML バージョンも利用可能です)。ラムダ・ザ・アルティメットは、プログラミング言語の研究者の多くが議論する場所なので、一見の価値がある場所です。

于 2012-07-05T17:25:43.860 に答える
0

リテラルではいくつかのことが起こり得ると思います。それらをリテラル数値のように扱うことができます。それらは定数であり、永遠に存在します。または、前に 1 の再トレーニング カウントを持ちprint、後に解放する暗黙の変数を持つことができます。

編集に応じて: 暗黙的な変数ソリューションを使用するか、Objective-C の「自動解放」の概念を使用できます。オブジェクトの受信者がそれを保持できる、短時間で解放される自動解放プールに配置されたオブジェクトがあります。

于 2012-07-05T16:54:13.033 に答える