Компиляция функциональных языков в C

Предположим, вы компилируете функциональный язык для переносимого C, и предположим также, что по разным причинам вам нужна точная, а не консервативная сборка мусора. Нет переносимого способа (возможно, никак в общем случае), чтобы сборщик мусора определил, что является указателем на стек, а что нет. Мне кажется, есть два решения этой проблемы:

  1. Теневой стек. Заставьте каждую функцию C поддерживать учетная информация о том, что является указателем, а что нет. Такой подход рекомендуется, например, LLVM.

  2. Воспользуйтесь тем фактом, что вы компилируете функциональный язык, а это означает, что основной код не имеет побочных эффектов. Когда распределитель обнаруживает из памяти, вместо того, чтобы вызывать сам сборщик мусора, он прерывает текущую операцию с longjmp обратно в основной цикл, который вызывает сборщик мусора (в контексте, где набор переменных, которые могут содержать указатели, известен заранее), затем перезапускает операцию

Мне кажется, что если вы имеете дело с чисто функциональным языком, к которому применим второй подход, он должен быть более эффективным, чем первый подход, а также его легче сочетать с рукописным языком C.

Есть ли какие-то проблемы, которые я не замечаю? Есть ли ссылки на существующее обсуждение или реализации этого метода?

11
задан rwallace 8 August 2011 в 08:43
поделиться