7

私はかなり標準的なスタック マシン用のコンパイラを書いています。ここで、ガベージ コレクターを追加します。各アクティベーション レコードでどの変数が gc ルートであるかを知るために、ある種の「スタック マップ」を生成できることがわかります。ただし、実行中にスタックにプッシュされた中間値を処理する方法がわかりません。私がコンパイルしている言語は Pascal に似ているので、タグを使用して他のデータ型からのポインターを識別する必要はありません。

方法に関するヒント/ポインタをいただければ幸いです

  1. 任意の時点でスタック内の gc ルートを見つけます (つまり、スタックにプッシュされた中間値のどれが gc ルートであるかを識別する方法)。
  2. この情報をエンコードする通常の形式 (つまり、「スタック マップ」を生成してエンコードする方法)

どうもありがとうございました!ニコラス

4

2 に答える 2

4

もう 1 つのオプションは、シャドウ スタックを使用することです。つまり、自分で維持する参照のスタックです。これは、実装する最も簡単なオプションです。

于 2013-07-10T11:11:08.403 に答える
2

簡単な解決策は、各スタック エントリのタイプを明示的に格納することです。次に、スタック マップは必要ありません。タイプが「参照」の場合、エントリは GC ルートです。このアプローチは、スタックの (入力された) 内容を簡単に表示できるため、特にデバッグに便利です。

本当にスタック マップを使用したい場合、簡単な解決策は、すべての命令に対応するスタック マップを生成することです。これを行うには、コンパイル中にスタックの内容を追跡するか、コンパイル済みの命令に対して 2 回目のパスを実行します。次に、GC ルートを探すときに、スタック上の各フレームに対して、現在の命令に対応するマップを使用します。

于 2013-07-02T19:59:29.323 に答える