関数型言語をポータブルCにコンパイルしていると仮定します。また、さまざまな理由から、保守的なガベージコレクションではなく正確なガベージコレクションが必要であると仮定します。ガベージコレクターがCスタック上のポインターであるかどうかを把握するための移植可能な方法はありません(おそらく一般的な場合はまったく方法がありません)。この問題には2つの解決策があるように思われます。
シャドウスタック。各C関数に、ポインターであるものとポインターではないものに関する簿記情報を保持させます。これは、LLVMなどで推奨されているアプローチです。
関数型言語をコンパイルしているという事実を利用してください。つまり、メインラインコードには副作用がありません。アロケータがメモリ不足を検出すると、ガベージコレクタ自体を呼び出す代わりに、longjmpを使用して現在の操作を中止し、メインループに戻ります。メインループは、ガベージコレクタを呼び出します(ポインタを含む可能性のある変数のセットがわかっている場合)。事前に)その後、操作を再開します。
2番目のアプローチが適用できる純粋な関数型言語を扱っている場合は、最初のアプローチよりも効率的であり、手書きのCと簡単に組み合わせることができる必要があるように思われます。
私が見落としている問題はありますか?この手法の既存の議論または実装への参照はありますか?