VT2015 Rust Programming Language

From air
Jump to navigation Jump to search

Présentation

Enseignants : D. Donsez, GP. Bonneau

Sujet : The Rust Programing Language


Abstract

Inspired by many predecessors, the new programming language Rust developed by Mozilla is designed to combine most of their features in a single language. While some of those strengths seem to be impossible to reunite at first, Rust offers a solution allowing to combine two major advantages in programming: security and control.

Résumé

Inspiré par de nombreux prédécesseurs, le nouveau langage de programmation Rust développé par Mozilla propose de combiner la plupart de leurs forces en un seul langage. Alors que certaines forces semblent à priori impossibles à réunir, Rust propose une solution permettant de combiner deux avantages majeurs en programmation : la sécurité et l’efficacité.

Synthèse écrite

Origines

Rust est un langage de programmation compilé multi-paradigme conçu et développé par Mozilla Research. Bien que ce soit Mozilla qui développe principalement ce projet, le code est open source et sollicite la participation de la communauté.

Son développement a été initialement réalisé dans le but d’améliorer les performances du navigateur Web Mozilla Firefox, actuellement en perte de vitesse en comparaison à son principal concurrent Google Chrome.

Afin d’améliorer les performances de leur navigateur, Mozilla développe actuellement le moteur de rendu Servo avec la participation de Samsung. L’efficacité supérieure de Servo en comparaison à celle du moteur actuel, Gecko, devrait selon Mozilla rétablir la popularité de Mozilla Firefox.

Fig. 1 : Changement de moteur de rendu de Mozilla firefox

Caractéristiques du langage

Rust est un langage sécurisé permettant la programmation fonctionnelle, impérative, orientée objet, et notamment concurrente. Sa principale caractéristique est à la fois d’effectuer de la programmation orientée bas niveau, et donc plus performante lorsqu’elle est bien gérée, mais également sûre. Rust permet d’obtenir les performances du C++ sans les segfaults et autres soucis de corruption mémoire causant un temps important pour débugger, mais également des erreurs résiduelles lors de l’exécution des utilisateurs. Un logiciel ne pouvant se permettre ce type d’erreur pourra ainsi gagner en performances en utilisant Rust à la place d’autres langages plus sécurisés mais moins axés sur la rapidité du code.

Sécurité mémoire en Rust

Rust considère que pour éviter les segfaults et autres problèmes mémoire courants dans la programmation à bas niveau, il faut empêcher les cas à risques de se produire.

Les problèmes arrivent lorsque pour un même pointeur, plusieurs variables ont un accès à la valeur pointée et que l’une de ces variables modifie la valeur de manière à ce qu’une autre ne puisse plus l’utiliser comme elle le souhaitait. Pour résumer, les erreurs mémoire surviennent lorsque les situations suivantes sont mal gérées :

  • Accès multiples à un pointeur
  • Modifications de la valeur pointée
Fig. 2 : Écritures parallèles à la même donnée en mémoire

Afin d’éviter ces situations à problèmes, un pointeur est associé à un unique propriétaire qui peut ensuite autoriser un accès en lecture à d’autres fonctions sur ce pointeur. Il peut également offrir la propriété du pointeur à une autre fonction ou un autre thread de manière temporaire ou définitive. Au moment de la compilation, le compilateur vérifie les aspects suivants :

  • Pour tout pointeur, les accès en lecture parallèles sont autorisés, et tant qu’au moins un élément a un accès en lecture au pointeur, aucun accès en écriture n’est permis.
  • Tout accès en écriture sur pointeur donné est unique, les écritures parallèles sont interdites.


De la même manière, les problèmes mémoire lors de la programmation concurrente surviennent lorsque des threads non ordonnés peuvent écrire en parallèle vers le même pointeur en mémoire. Les problèmes surviennent donc lorsque ces trois éléments sont combinés :

  • Accès multiples à un pointeur
  • Modifications de la valeur pointée
  • Absence d’ordonnancement

La programmation concurrente en Rust est faite de manière à pouvoir gérer les accès aux pointeurs et les autorisations d’écriture de la même manière que lors de la programmation de base, réglant ainsi les problèmes de sécurité en programmation concurrente.


Lorsque cela est absolument nécessaire, certaines restrictions du compilateur peuvent être outrepassées à l’aide de blocs unsafe dont le contenu n’est pas aussi contraint que le reste. Il est cependant recommandé d’apporter une attention particulière lorsque des cas similaires doivent apparaître, notamment en assurant la sécurité du programme autour du bloc en question.

Fig. 3 : Exemple d’utilisation d’un bloc unsafe

Rust : une valeur sûre, ou un langage de passage ?

Rust est un langage de programmation encore relativement récent. Bien que la version actuelle soit stable, la syntaxe du langage n’est pas à l’abri de modifications futures. Cette même syntaxe demande un temps d’apprentissage non négligeable, à ajouter au temps d’adaptation aux contraintes du compilateur. Par ailleurs, le manque d’IDE prenant en charge Rust peut rebuter la plupart des développeurs. Ce langage peut n’être au final qu’un effet de mode soulevé par Mozilla avant de tomber dans l’oubli, ce risque n’étant pas inexistant, migrer des logiciels déjà existants pour en faire des versions développées en Rust est une manœuvre risquée.

Conclusion

Rust offre une approche de la programmation bas niveau sécurisée, permettant d’assurer un développement logiciel plus sûr et d’éviter des bugs lors de l’utilisation. Il est cependant utilisé principalement pour les développements de Mozilla, les autres entreprises préférant garder les bases précédentes. Il est possible de se dire que s’il y a des problèmes de programmation, cela vient du développeur, et donc continuer la programmation C++ qui a fait ses preuves est une meilleure option. Il reste donc à voir si Rust percera dans le monde de la programmation grâce ou s’il sera abandonné comme beaucoup d’autres nouveaux langages.