On a enfin eu la peau de l'ARC sur les objets !!!

Comme Embarcadero m'y a autorisé et que Marco Cantù en a parlé sur son blog il y a quelques jours, je peux enfin parler publiquement de ARC dans Delphi 10.3 Rio et de ce que j'en pense donc n'hésitez pas à aborder la question si on se croise ici ou dans le vrai monde (par exemple le 15 novembre lors de la conférence de présentation de Delphi 10.3 Rio à Paris).

Parmi les nouveautés prévues pour Delphi 10.3 Rio il y a un retour en arrière et franchement, même si certains considèrent que c'est un échec, j'en suis ravi.

ARC ne sera plus de la partie pour le compilateur Linux et devrait à terme disparaître pour la gestion mémoire des objets. Nous allons à nouveau pouvoir maitriser les suppressions des objets que nous créons nous-mêmes et ne pas laisser un ramasse miettes automatisé faire le travail quand il le désire et appeler les méthodes de destruction d'objets quand ça lui chante. J'ai l'air un peu excessif comme ça mais ça m'a embêté plus d'une fois dans des projets complexes (encore la semaine dernière sur Pumpkin Killer qui n'est pourtant pas si compliqué).

Vous l'aurez compris : le principe même de ARC me dérange. Je considère qu'un développeur doit être capable de faire un code propre et d'apprendre à le faire quand ce n'est pas le cas. Supprimer un truc qu'on a créé nous-mêmes me semble la base de la programmation objets et d'une manière générale de la vie en société.

Quand Apple a imposé ARC sur ses langages de développement et appareils ça passait simplement. Il n'y avait pas vraiment d'antériorité.

En revanche pour Delphi il y a quand même un écosystème imposant d'applications existantes en maintenance et des développeurs VCL qui se sont retrouvés un peu perdus avec la gestion mémoire sur les mobiles, Mac et Linux.

Heureusement Embarcadero sait prendre en compte les contraintes du terrain et a décidé à terme d'éliminer globalement ARC pour les objets. L'automatic reference counting restera cependant en place dans Delphi pour des cas précis comme c'était le cas avec les chaines de caractères depuis le début. Son utilisation est prévue sur les interfaces. Marco aborde la question dans son article.

Sous réserve de modification de la roadmap officielle et des disponibilités des prochaines versions nous devrions donc avoir le modèle mémoire habituel de Windows en VCL, console et Firemonkey repris sur le compilateur Linux dans Delphi 10.3 Rio.

Viendra ensuite le compilateur pour macOS en 64 bits et je suppose que le 32 bits suivra s'il est toujours proposé vu qu'Apple n'en veut plus sur ses (nos !) ordinateurs.

Pour Android et iOS il faudra patienter un peu plus longtemps mais ça devrait se faire d'ici un an ou deux. Mine de rien ça fait beaucoup de code à (ré)écrire et tester. Mieux vaut ne pas se louper avant la sortie d'une si grosse modification.

En attendant, mon conseil reste de base d'allouer et libérer les objets dont on a besoin comme on le faisait en VCL. L'utilisation de FreeAndNil() provenant de Windows.SysUtils permet de forcer le ménage avec ARC puisque c'est l'affectation de la valeur nil à un pointeur d'objet qui déclenche l'exécution de son destructeur. Vous devez donc écrire ceci dans vos sources pour avoir un fonctionnement globalement identique sur toutes les plateformes, avec ou sans ARC, et à terme avec ARC désactivé.

MonObjetMachin := TMonObjetMachin.create;
try
  // utilisation de MonObjetMachin
finally
  FreeAndNil(MonObjetMachin);
end;

 

Et n'hésitez pas à tester en activant les alertes de fuites mémoires en sortie de programme avec ces lignes dans l'initialisation de votre fiche principale.

unit uMainForm;

// ...

initialization

{$IFDEF DEBUG}
  ReportMemoryLeaksOnShutdown := true;
{$ENDIF}

// ...

end.

 

Ce sera tout pour les news de Delphi 10.3 Rio pour aujourd'hui, mais d'autres arrivent, notamment sur des changements liés au langage Pascal lui-même.


Mug Toucan DX dans la baie de RioMug Toucan DX dans la baie de Rio