SORU
31 Mart 2012, CUMARTESİ


Haskell çöp toplayıcı gerektiriyor mu?

Neden Haskell bir GC olarak merak ediyorum.

GC saf bir dil gerekli olabileceği bir durum düşünemiyorum. Sadece kopyalama azaltmak için bir iyileştirme mi, yoksa gerçekten gerekli mi?

Eğer bir GC hediye olmasa sızıntısı olur örnek kod arıyorum.

CEVAP
31 Mart 2012, CUMARTESİ


Diğerleri zaten belirttiği gibi, Haskell gerektirirotomatik,dinamikbellek yönetimi: Otomatik bellek yönetimi bellek yönetimi güvensiz olduğu için gereklidir; bellek yönetimi, bazı programlar için, bir nesnenin ömrü sadece çalışma zamanında belirlenebilir. gereklidir, çünkü dinamik

Örneğin, aşağıdaki programı deneyin:

main = loop (Just [1..1000]) where
  loop :: Maybe [Int] -> IO ()
  loop obj = do
    print obj
    resp <- getLine
    if resp == "clear"
     then loop Nothing
     else loop obj

Bu programda, [1..1000] kullanıcı türleri kadar bellekte tutulmalıdır listesi""; ömür boyu bu yüzden . net ^em>gerekirdinamik olarak tespit edilmesi, ve bu yüzden dinamik bir yönetim gereklidir.

Bu anlamda, otomatik dinamik bellek ayırma gerekli ve pratikte bu şu anlama gelir:EvetÇöp toplama yüksek performanslı otomatik dinamik bellek yöneticisi olduğu için Haskell bir çöp toplayıcı gerektirir.

Ancak...

Çöp toplayıcı gerekli olmasına rağmen, derleyici daha ucuz bir bellek çöp toplama daha yönetim düzeni kullanabileceğiniz bazı özel durumlarda bulmayı deneyebiliriz. Örneğin, belirli

f :: Integer -> Integer
f x = let x2 = x*x in x2*x2

x2 Güvenli f döndüğü zaman ayırmanın olabilir algılamak için derleyici (yerine çöp toplayıcı için x2 ayırması için bekleyen) için bir umudumuz olabilir. Aslında, derleyici mümkün olan her yerde escape analysis ayırma çöp toplama allocations on the stack yığın dönüştürmek için gerçekleştirmek istiyoruz.

Bunun için sormak çok mantıksız değil: jhc haskell compiler DZD olmasa da bunu yapar. Simon DZD bu kuşak çöp toplayıcı kaçış analizi çoğunlukla gereksiz kılar says Marlow.

jhc aslında kaçış analiz sofistike bir form region inference olarak bilinen kullanır. Düşünün

f :: Integer -> (Integer, Integer)
f x = let x2 = x * x in (x2, x2 1)

g :: Integer -> Integer
g x = case f x of (y, z) -> y   z

Bu durumda, basit bir kaçış analiz eder sonuçlandırmak x2 kaçar f (çünkü döndürülen satır), ve dolayısıyla x2 ayrılması gerekir üzerinde atık olarak toplanmış öbek. Bölge kesmesi, diğer yandan, algılayabilir x2 olabilir ayırmanın ne zaman g döner; burada fikir olduğunu x2 olmalı ayrılmış g'In bölge yerine f'In bölge.

Haskell Ötesinde

Bölge kesmesi yukarıda açıklandığı gibi bazı durumlarda yararlı olsa da, zor etkili tembel değerlendirme (Edward Kmett's Simon Peyton Jones' yorumlar) ile bağdaştırmak gibi görünüyor. Örneğin, düşünün

f :: Integer -> Integer
f n = product [1..n]

Belki biri cazip tahsis listesi [1..n] yığın ve ayırması sonra f döndürür, ama bunun yıkıcı: bunu değiştireceğini f kullanarak O(1) bellek (altında çöp toplama) için O(n) bellek.

Yoğun bir çalışma 1990'larda yapıldı ve 2000'li yılların başlarında bu bölge için çıkarımkatıişlevsel dil ML. Mads Tofte, Lars Birkedal, Martin Elsman, Niels Hallenberg kadar MLKit compiler içine entegre bölge çıkarım, çalışmalarını oldukça okunabilir retrospective yazdım. Onlar tecrübe ile tamamen bölge tabanlı bellek yönetimi (örneğin, çöp toplayıcı) gibi melez bölge tabanlı/çöp toplama, bellek yönetimi ve rapor kendi test programı koştu "arasında 10 kat daha hızlı ve 4 kat daha yavaş" daha saf çöp toplama sürümleri.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BeginnersTech

    BeginnersTec

    8 NİSAN 2011
  • Mark Hyder

    Mark Hyder

    6 EKİM 2011
  • The Warp Zone

    The Warp Zon

    24 AĞUSTOS 2007