Penso che Haskell sia un linguaggio bellissimo e, a giudicare dai benchmark, le sue implementazioni possono generare codice veloce.Haskell è appropriato per le applicazioni di lunga durata?
Tuttavia, mi chiedo se sia appropriato per le applicazioni di lunga durata o se inseguiremo tutte le potenziali perdite indotte dalla pigrizia, che uno potrebbe ignorare in un'applicazione di breve durata, dimostrarsi frustrante?
This Reddit comment Echos le mie preoccupazioni:
Non appena si dispone di più di una funzione che si fa chiamare ricorsivamente, il profilo mucchio cessa di dare alcun aiuto individuare dove la perdita si sta verificando.
(che tutta la discussione sembra penetranti e franca)
Sono personalmente interessato a calcolo ad alte prestazioni, ma credo che i server e HPC avere questo requisito in comune.
Se Haskell è appropriato per tali applicazioni, vi sono esempi che dimostrano questo punto, cioè applicazioni che
- necessario eseguire per giorni o settimane, richiedendo quindi l'eliminazione di tutte le perdite rilevanti (il momento in cui il il programma trascorre dormendo o in attesa di qualche libreria C sottostante per tornare ovviamente non conta)
- non banali (se l'applicazione è semplice, lo sviluppatore potrebbe solo indovinare l'origine della perdita e tentare varie correzioni. Non credo che questo approccio si adatti bene e la disponibilità del profilo dell'heap nell'individuare l'origine della/e perdita/e con più [reciprocamente] ricorre Le funzioni ive sembrano essere di particolare interesse, come da discussione Reddit sopra)
Se Haskell non è appropriato per tali applicazioni, allora perché?
Update: Il framework web server Yesod per Haskell, che è stato messo davanti come esempio, may have issues with memory. Mi chiedo se qualcuno ha testato l'utilizzo della memoria dopo aver servito le richieste continuamente per giorni.
Sembra un po 'come se un sistema con un garbage collector sia appropriato: a causa della gente 'gc' normalmente non si distruggono oggetti che non sono più necessari: contano che alla fine il gc li troverà. Ma questo può comportare un gran numero di oggetti heap che sono attivi solo perché un riferimento non è impostato su 'null' rendendo tutti questi oggetti inutili. –
La pigrizia non significa perdite di spazio, proprio come la severità no. Esistono diverse tecniche per gestire entrambi i tipi di modelli di memoria. Il modo in cui scrivi la tua domanda determina se la tua applicazione sarà in grado di funzionare per lunghi periodi di tempo. So che [Facebook utilizza Haskell] (https://github.com/facebook/Haxl) come uno strato intermedio tra più archivi di dati e alcuni dei loro servizi di frontend, ma non so se si tratta di processi di breve durata. La mia ipotesi è che avrebbero bisogno di essere a lungo in esecuzione, quindi se questo è il caso avresti un esempio abbastanza solido proprio lì. – bheklilr
@bheklilr: Non penso che MaxB si riferisca a perdite di spazio: Haskell gestisce correttamente la memoria (o dovrebbe provenire da un pov teorico), ma può richiedere anni prima che gli oggetti morti vengano riciclati. –