6

私は歴史的な関数型言語インタープリター (EMAS の KRC) を最新のシステム (Unix の C) に移植しようとしていますが、再配置する必要があるポインターを知るために、ヒープへのポインターのスタックをスキャンできることを期待するガベージ コレクターがあります。 GC 中にヒープ内のオブジェクトが移動されたとき。これが機能するには、ヒープを指すすべての関数引数とローカル変数がスタック内にある必要があります。

現在、「レジスタ」キーワードが「必要に応じてこの変数をレジスタに入れることができる」ことを意味し、それ以外の場合はスタック上にあった時代がありましたが、最近ではすべての (GCC、Clang、Tinyc/tcc) C コンパイラはこの動作を無効にする方法がないため、ローカル変数をレジスタに入れます。その結果、GC は進行中の関数に属するいくつかの値を失い、それらを保持できず、ヒープが破損します。

これらのコンパイラのいずれかに元の C セマンティクスを使用するように指示する方法はありますか?「登録」と言わない限り、すべてのローカル変数はスタック上にありますか?

私はいくつかの疣贅の「解決策」を持っています:

  • 各ヒープ指向のローカル変数のアドレスを取得するための余分なコードをあらゆる場所に追加し、それをダミー関数に渡します。
  • 関数のインライン化とその結果としてのインライン化された関数のパラメータの最適化を回避するために、すべての静的関数をグローバルにします。
  • すべてのマシン レジスタをスタックにプッシュするスタブで GC() 関数を囲み、実際の G​​C() 関数を呼び出してからそれらをポップします。

これらはすべて問題を改善しているように見えますが、非常にハックで信頼性が低くなります。

すべての関数パラメーターとローカル変数がスタック上にあることを確認するために、必要な結果を達成するためのより良い方法はありますか?

4

4 に答える 4

4

わかりました、それは奇妙な GC です。まあ、あなたはvolatileキーワードを使うかもしれません。

もともとは、コンパイラに変数を最適化しないように強制したい、メモリマップされたデバイスなどを対象としていました。その使用と乱用は、長年にわたって議論の対象となってきました。

必要な結果を達成するためのより良い方法はありますか

本当に本当に答えにくいです。一方では、明らかに、そうです。信頼できないものに GC を依存させないでください。しかし、それはそれを書き直すことを意味します。一方、スタック配置を確実にするための追加コードのようなものが機能するのであれば、なぜそれをしないのでしょうか? パフォーマンスのために歴史的なインタープリターをコード移植しているわけではありません。

于 2015-03-08T10:15:19.483 に答える
4

一種の「マーク アンド スイープ」GC を使用していると思います。このような場合、マーキング フェーズが開始された時点でレジスタを保存するだけで済みます。私のアドバイスは、GC を調べて、「マークとスイープ」操作が開始される場所を見つけ、ここですべてのレジスタをアクセス可能なメモリに配置するコードを配置することです。setjmpは、これを達成するためのセミポータブルな方法です (sparc で作業している場合を除きます)。

于 2015-03-08T10:28:34.187 に答える
0

あなたの問題には簡単な解決策があるようです: GC が同期的に実行される場合、たとえば、割り当て関数から呼び出された場合、他の関数がポインターをスタックまたはレジスターに格納するかどうかは、すべてのレジスターが保存されている限り、実際には問題ではありません。 GC が実行される前のある時点でスタックをスキャンし、スタックをスキャンします。すべてのレジスタをスタックに保存する関数で GC コードをラップすれば完了です。これにはインラインアセンブリが必要になる場合がsetjmpありますが、マリアンが述べたように十分なはずです。

于 2015-03-08T10:35:42.083 に答える
0

それがどのように展開されたかをお知らせしようと思いました。GC に通知されていないコード内のデータ項目をいくつか見つけ、GC に入る前に setjmp() でレジスタをスタックに置きました。リンクされたリストのセルを先頭ではなくヒープに配置して、すばやく追加できるようにします。セル境界に整列していないとして、これらを無視していました。これらのうち、setjmp() のトリックについては考えたことはありませんでした。どうもありがとうございました。あなたの提案は、interpが機能するかどうかの違いを生み出しました。祝福!

于 2015-04-06T09:26:25.830 に答える