Co powstrzymuje ghc przed przetłumaczeniem Haskell na konkatenatywny język programowania, taki jak logika kombinacyjna, a następnie po prostu użycie alokacji stosu do wszystkiego? Według Wikipedii tłumaczenie z rachunku lambda na logikę kombinacyjną jest banalne, a także konkatenatywne języki programowania mogą polegać wyłącznie na stosie przy alokacji pamięci. Czy to możliwe, aby wykonać to tłumaczenie, a tym samym wyeliminować zbieranie śmieci dla języków takich jak Haskell i ocaml? Czy są to wady?
EDYCJA: przeniesiono tutaj /programming/39440412/why-do-functional-programming-languages-require-garbage-collection
functional-programming
haskell
Mikołaj Grasevski
źródło
źródło
Odpowiedzi:
Wszystkie poniższe komentarze opierają się na wyborze standardowej strategii implementacji przy użyciu zamknięć do reprezentowania wartości funkcji i kolejności oceny według wartości:
W przypadku rachunku czystego lambda zbieranie śmieci nie jest konieczne. Wynika to z faktu, że nie można tworzyć cykli w stercie: każda nowo przydzielona wartość może zawierać tylko odwołania do wcześniej przydzielonych wartości, dlatego wykres pamięci tworzy DAG - zliczanie odniesień wystarcza do zarządzania pamięcią.
Większość implementacji nie korzysta z liczenia referencji z dwóch powodów.
ref
Konstruktor typu w ML), dzięki czemu można tworzyć prawdziwe cykle w stercie.Języki o typie liniowym mogą wyeliminować liczbę odwołań (zasadniczo dlatego, że liczby wynoszą 0-1: albo wartość ma jedno odniesienie do niej, albo jest martwa i można ją zwolnić).
Jednak alokacja stosu wciąż nie wystarcza. Jest tak, ponieważ możliwe jest tworzenie wartości funkcji, które odnoszą się do zmiennych swobodnych (tj. Musimy zaimplementować zamknięcia funkcji), jeśli przydzielisz rzeczy na stosie, wówczas wartości na żywo mogą być przeplatane z wartościami martwymi, co spowoduje niepoprawną asymptozę wykorzystanie miejsca.
Możesz uzyskać właściwą asymptotę, zastępując stos „stosem spaghetti” (tj. Zaimplementuj stos jako listę połączoną w stosie, aby w razie potrzeby wyciąć martwe ramki).
Jeśli chcesz prawdziwej dyscypliny stosu, możesz użyć systemów typów opartych na „logice uporządkowanej” (zasadniczo typy liniowe minus zamiana).
źródło