Commençons par postuler que la mémoire est de loin (des dizaines, des centaines voire des milliers de fois) plus commune que toutes les autres ressources combinées. Chaque variable, objet, membre d'objet a besoin de mémoire allouée et libérée ultérieurement. Pour chaque fichier que vous ouvrez, vous créez des dizaines à des millions d'objets pour stocker les données extraites du fichier. Chaque flux TCP est associé à un nombre illimité de chaînes d'octets temporaires créées pour être écrites dans le flux. Sommes-nous sur la même page ici? Génial.
Pour que RAII fonctionne (même si vous avez des pointeurs intelligents prêts à l'emploi pour chaque cas d'utilisation sous le soleil), vous devez en assurer la propriété . Vous devez analyser qui doit posséder tel ou tel objet, qui ne doit pas, et lorsque la propriété doit être transférée de A à B. Bien sûr, vous pouvez utiliser la propriété partagée pour tout , mais vous émuleriez un GC par des pointeurs intelligents. À ce stade, il devient beaucoup plus facile et rapide d’intégrer le CPG dans le langage.
Le ramassage des ordures vous libère de cette préoccupation pour la ressource de loin la plus utilisée, la mémoire. Bien sûr, vous devez toujours prendre la même décision pour les autres ressources, mais celles-ci sont beaucoup moins courantes (voir ci-dessus) et la propriété complexe (par exemple, partagée) l'est également. La charge mentale est réduite de manière significative.
Maintenant, vous nommez quelques inconvénients à rendre toutes les valeurs ramassées. Cependant, il est extrêmement difficile d’ intégrer à la fois des types de CPG et de valeur sécurisés avec RAII dans une seule langue. Il est donc peut-être préférable de migrer ces compromis par d’autres moyens.
La perte de déterminisme n’est pas si grave dans la pratique, car elle n’affecte que la durée de vie des objets déterministes . Comme décrit dans le paragraphe suivant, la plupart des ressources (hormis la mémoire, qui est abondante et peut être recyclée assez lentement) ne sont pas tenues de faire l'objet d'une durée de vie dans ces langues. Il existe quelques autres cas d'utilisation, mais ils sont rares dans mon expérience.
Votre deuxième point, la gestion manuelle des ressources, est à présent traité via une instruction qui effectue un nettoyage basé sur la portée, mais ne couple pas ce nettoyage à la durée de vie de l'objet (donc n'interagissant pas avec le GC et la sécurité de la mémoire). Ceci est using
en C #, with
en Python, try
avec les ressources dans les versions récentes de Java.