Iniziamo postulando che la memoria è di gran lunga più comune (dozzine, centinaia o addirittura migliaia di volte) rispetto a tutte le altre risorse combinate. Ogni singola variabile, oggetto, membro dell'oggetto ha bisogno di memoria assegnata e liberata in seguito. Per ogni file che apri, crei dozzine di milioni di oggetti per archiviare i dati estratti dal file. Ogni flusso TCP va insieme a un numero illimitato di stringhe di byte temporanee create per essere scritte nello stream. Siamo sulla stessa pagina qui? Grande.
Per far funzionare RAII (anche se hai puntatori intelligenti già pronti per ogni caso d'uso sotto il sole), devi ottenere il diritto proprietà . Devi analizzare chi dovrebbe possedere questo o quell'oggetto, chi non dovrebbe, e quando la proprietà dovrebbe essere trasferita da A a B. Certo, potresti usare la proprietà condivisa per tutto , ma poi dovresti emulare un GC tramite puntatori intelligenti. A quel punto diventa molto più facile e più veloce per costruire il GC nella lingua.
La raccolta dei dati inutili ti libera da questa preoccupazione per la risorsa, la memoria, di gran lunga più utilizzata. Certo, devi ancora prendere la stessa decisione per altre risorse, ma quelle sono molto meno comuni (vedi sopra), e anche la proprietà complicata (ad esempio condivisa) è meno comune. Il carico mentale è significativamente ridotto.
Ora, dai il nome di alcuni aspetti negativi a rendere i tutti valori garbage collection. Tuttavia, l'integrazione di entrambi i tipi di valore GC e con RAII in una sola lingua è estremamente difficile, quindi forse è meglio migare questi trade off con altri mezzi?
La perdita di determinismo risulta non essere così male nella pratica, perché influenza solo la durata dell'oggetto deterministica. Come descritto nel prossimo paragrafo, la maggior parte delle risorse (oltre alla memoria, che è abbondante e può essere riciclata piuttosto pigramente) sono non associate alla durata dell'oggetto in queste lingue. Ci sono alcuni altri casi d'uso, ma sono rari nella mia esperienza.
Il tuo secondo punto, la gestione manuale delle risorse, è attualmente affrontato tramite una dichiarazione che esegue la pulizia basata sull'ambito, ma non accoppiato alla pulizia dell'oggetto (quindi non all'interazione con GC e sicurezza della memoria). Questo è using
in C #, with
in Python, try
-with-resources nelle ultime versioni di Java.