Çöp toplama saf dillerde ne kadar farklıdır?


26

Haskell gibi saf bir dilde, tüm veriler değişmezdir ve mevcut hiçbir veri yapısı hiçbir şekilde değiştirilemez. Ek olarak, değişken veri ve fonksiyonel programlama kalıpları üzerine birçok algoritma, doğadan büyük miktarda çöp üretir ( mapörneğin, ara listeler oluşturma zincirleri ).

Çöp toplayıcılar saflık karşısında başka türlü kullanamayacakları stratejileri ve teknikleri kullanıyor? Saf bir dilin GC'sinde saf bağlamda olmayan çok iyi çalışan nedir? Saf diller GC'ler için başka hangi yeni problemleri yaratır?



Yanıtlar:


13

Ghc'nin şu anki uygulaması, sadece dil tamamen işlevsel olduğu ve verilerin değişmediği için işe yarayan bir strateji kullanmaktadır: çünkü hiçbir değişken daha yeni bir şeye atıfta bulunacak şekilde değiştirilemez; ; daha yüksek bir nesil tarafından belirtilen bir nesne bu nesil GCd olana kadar silinemediğinden, nesneleri daha yüksek nesillere hevesle teşvik eder; ve GC onları süpürürken hiçbir şey referansları değiştirmeyeceğinden, paralel olarak çalışabilir.

İşte daha ayrıntılı bir yazı .


4
İstekli promosyon tembellik üzerine kuruludur - eski nesillerdeki bir sopayı güncellemek yeni nesle bir işaretçi oluşturabilir, ancak sivri uçlar yalnızca bir kez mutasyona uğrar, bu yüzden genç nesneyi hevesle teşvik etmek yeterlidir. Diğer yaşlı-genç referanslar (örneğin, değişken dizilerden) istekli tanıtımın başarısız olması durumunda da kullanılan “hatırlanan setler” kullanılarak izlenir.
Jon Purdy

1

Haskell gibi saf bir dilde, tüm veriler değişkendir ve hiçbir şekilde mevcut veri yapısı değiştirilemez

Aslında bu genel olarak doğru değil. Saf diller kesin olmayan (tembel) bir değerlendirme kullanır, böylece potansiyel olarak tüm alt ifadelerin değerlendirilmesi ertelenir. Ortalanmamış ifadeler genellikle bir "thunk" olarak tahsis edilen yığınlardır. Gerektiğinde ifade değerlendirilir ve parça var mutasyona uğramış elde edilen değer olarak.

Çöp toplayıcılar saflık karşısında başka türlü kullanamayacakları stratejileri ve teknikleri kullanıyor?

Aklıma gelen tek şey kara delikler . Haskell araştırma raporlarında GC tarafında yeni bir şey gördüğümü hatırlamıyorum.

Saf bir dilin GC'sinde saf bağlamda olmayan çok iyi çalışan nedir?

GC yazma engeli. Saf olmayan diller işaretçilere daha çok işaretçi yazma eğilimindedir, bu nedenle yazma engellerini daha yoğun bir şekilde optimize etme eğilimindedirler.

Marka-bölge gibi diğer GC algoritmaları saf olmayan diller bağlamında çok daha uygundur çünkü saf dillerden çok daha düşük tahsis oranlarına sahip olabilirler.

Saf diller GC'ler için başka hangi yeni problemleri yaratır?

Saf diller çok nadirdir, bu nedenle, saf programların belleği nasıl kullandığı hakkında çok daha az veri vardır ve bu nedenle, saf bir dil için bir GC yazmaya çalışırken daha kötü bir pozisyonda başlarsınız.


"İhtiyaç duyulduğunda ifade değerlendirilir ve thunk sonuç değerine dönüştürülür." Bu bir Haskell kullanıcısı için bir iç uygulama detayıdır. Mutasyonu gözlemlemenin bir yolu yoktur, bu nedenle kullanıcının bakış açısından bu mutasyon değildir.
Jack

Ek olarak, saf bir dilin katı olması tamamen mümkündür - örneğin İdrar'a bakınız.
Jack
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.