RUST: Un langage peu commun abordé au DevFEST par Benjamin Coenen

Bold News | 6 février 2023

RUST: Un langage peu commun abordé au DevFEST par Benjamin Coenen

Pour le remercier, voici un petit article qui condense les informations et j’espère vous aidera à comprendre ce qu’est le langage RUST. Bien qu’il y ait de la technique, j’ai cherché à vulgariser au maximum pour que tout le monde puisse saisir les tenants et aboutissants du langage.

Mozilla a créé le langage RUST pour répondre à différentes problématiques qu’ils ont eues avec le langage C++ sur le code source de Firefox. C’est un langage assez proche de la machine et qui pourtant ne nous laisse pas gérer directement la mémoire nous-mêmes comme en C, évitant ainsi au programme de consommer de la mémoire jusqu’à la saturer.

Il nous empêche également de créer des data races et nous permet d’écrire du code multithread qui soit sans comportement indéfini, nous épargnant un éventuel plantage du programme.

Comment est-ce possible ?

RUST n’est pas magique et intègre de nouvelles règles et de nouveaux mots clés afin de mieux décrire ce que le code fait et permet au compilateur de s’assurer que tout soit OK pour gérer la mémoire sans fuites, sans data races etc…

Pour ce faire, il faut techniquement expliciter l’usage de la mémoire et pour cela, connaître les notions de stack et heap. Pour faire simple, la stack va être la mémoire que l’on va explicitement allouer et dont on ne connaît pas l’avenir. La heap est la mémoire connue et dont le compilateur peut savoir exactement quand elle ne sert plus afin de la libérer automatiquement.

Vous vous doutez que la mémoire stack est la responsable des fuites mémoires, lorsque nous oublions de la libérer. Certains codes complexes peuvent vite nous faire rater le coche et de la mémoire va rester allouée jusqu’à ce que le programme soit fermé.

Pour gérer ce problème, RUST va allouer la mémoire sur la stack par défaut et l’on ne pourra pas assigner de nouvelle valeur aux variables, on dit qu’elles sont immutables. C’est ici que la notion de propriété sur les variables intervient et RUST va gérer toutes les variables ainsi au travers du concept de BorrowChecker.

Il va nous falloir être très rigoureux et définir, par des mots clés, les manipulations futures dont nous aurons besoin sur nos variables. Pour un type T, on va pouvoir le déclarer basiquement comme type T, si vous avez bien suivi, la variable sera alors immutable. Pour un type &T, nous déclarons une ou plusieurs références immutables (passage à une ou plusieurs méthodes …). Pour un type &mut T, nous déclarons une référence mutable et exclusive de T pour un même scope.

Ne vous inquiétez pas, le compilateur nous aide en remontant des messages pertinents, à condition que vous ayez ingéré cette notion de scope des variables. À savoir qu’il est possible dans ce langage de définir des scopes à l’aide d’accolades, comme en C/C++, à la différence que RUST va gérer ces scopes comme des « zones » mémoires pour mieux gérer la mémoire.

D’autres notions telles que les « trait », les SmartPointers intégrés nativement et plus spécifiques pour une meilleure gestion de la mémoire, les marqueurs qui sont basiquement des interfaces vides jouant un rôle informatif pour aider le compilateur à comprendre nos besoins etc ..

L’article n’a pas pour vocation à aller dans les détails et c’est pourquoi je vous invite activement à commencer par lire un livre dédié au langage avant de vous lancer. Les notions pouvant être difficiles à ingérer si l’on décide de se lancer la tête la première.

Pour conclure, RUST est un bon choix pour :

  • Les entreprises ayant besoin de performances tout en évitant au maximum les plantages et bugs éventuels liés à la mémoire et aux tâches parallélisées.
  • Les développeurs qui souhaitent se séparer de la gestion mémoire et d’abstraire la complexité liée du multithreading. En échange, vous devrez suivre une courbe d’apprentissage un peu plus épineuse.