Что мешает ghc перевести Haskell на конкатенативный язык программирования, такой как комбинаторная логика, а затем просто использовать выделение стека для всего? Согласно Википедии, перевод из лямбда-исчисления в комбинаторную логику тривиален, и конкатенативные языки программирования могут полагаться исключительно на стек при распределении памяти. Реально ли выполнить этот перевод и тем самым исключить сборку мусора для таких языков, как Haskell и ocaml? Есть ли недостатки в этом?
РЕДАКТИРОВАТЬ: перенесено сюда /programming/39440412/why-do-functional-programming-languages-require-garbage-collection
functional-programming
haskell
Николай Грасевский
источник
источник
Ответы:
Все последующие комментарии основаны на выборе стандартной стратегии реализации с использованием замыканий для представления значений функций и порядка оценки по вызовам:
Для чистого лямбда-исчисления сбор мусора не является необходимым. Это связано с тем, что невозможно сформировать циклы в куче: каждое вновь выделенное значение может содержать только ссылки на ранее выделенные значения, и поэтому граф памяти образует DAG - поэтому для управления памятью достаточно подсчета ссылок.
Большинство реализаций не используют подсчет ссылок по двум причинам.
ref
конструктор типа в ML), и поэтому могут формироваться истинные циклы в куче.Языки с линейной типизацией могут исключить счетчик ссылок (в основном потому, что счетчики равны 0-1: либо значение имеет единственную ссылку на него, либо оно мертвое и может быть освобождено).
Однако выделения стека все еще недостаточно. Это связано с тем, что можно формировать значения функций, которые ссылаются на свободные переменные (т. Е. Нам нужно реализовать замыкания функций), если вы размещаете вещи в стеке, то действующие значения могут чередоваться с мертвыми значениями, что приведет к неправильной асимптотике. использование пространства
Вы можете получить правильную асимптотику, заменив стек «стеком спагетти» (т. Е. Реализуйте этот стек как связанный список в куче, чтобы при необходимости можно было вырезать мертвые кадры).
Если вам нужна дисциплина реального стека, вы можете использовать системы типов, основанные на «упорядоченной логике» (по существу, линейные типы за вычетом обмена).
источник