Предположим, вы компилируете функциональный язык для переносимого C, и предположите также, что по разным причинам вам нужна точная, а не консервативная сборка мусора. Нет никакого переносного способа (возможно, вообще никакого способа в общем случае) для сборщика мусора, чтобы выяснить, что есть и не является указателем на стек C. Мне кажется, что есть две проблемы:
-
Теневой стек. Сделать каждую функцию C поддерживать бухгалтерскую информацию о том, что есть и не является указателем. Это подход, рекомендованный, например, LLVM.
-
Воспользуйтесь тем, что вы компилируете функциональный язык, что означает, что код основной линии не имеет побочных эффектов. Когда распределитель обнаруживает вне памяти, вместо вызова сборщика мусора он прерывает текущую операцию с longjmp обратно в основной цикл, который вызывает сборщик мусора (в контексте, где известен набор переменных, которые могут содержать указатели заранее), а затем перезапускает операцию.
Мне кажется, что если вы имеете дело с чистым функциональным языком, где применим второй подход, он должен быть более эффективным, чем первый подход, а также проще смешиваться с рукописным C.
Есть ли какие-то проблемы, с которыми я сталкиваюсь? Любые ссылки на существующее обсуждение или реализации этой техники?