Pour Ashley Williams, directeur exécutif par intérim de la fondation Rust, Rust est un langage qui donne du pouvoir à tout le monde, mais surtout aux gens qui pensent que la programmation système n'est pas pour eux. « L'une des forces motrices les plus puissantes du projet Rust est la croyance simultanée dans le pouvoir de la programmation système et l'engagement à faire en sorte que ce pouvoir soit utilisable par tous », avait-t-il déclaré lors de son discours d’ouverture de la RustConf 2020.
Les responsables du projet Rune estiment que « Rune est parfois plus rapide que le C. » Au lieu de la programmation basée sur les array-of-structure (AoS), Rune utilise les structure-of-array (SoA). Cela permet d'améliorer les performances du cache et de réduire l'utilisation de la mémoire, en partie parce que la plupart des références d'objets peuvent être 32 bits plutôt que 64 bits. Les tests de référence effectués à ce jour montreraient que les applications gourmandes en mémoire, telles que l'automatisation de la conception électronique, gagnent environ 40 % de vitesse tout en réduisant la mémoire de 20 %.
Code : | Sélectionner tout |
1 2 3 4 5 6 | func bignumModularMul(a, b, modulus, isSecret) { if isSecret { return fastModularMul(a, b, modulus) } return constTimeModularMul(a, b, modulus) } |
Considérons l'exemple suivant pour le traitement des secrets :
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 | // Vérifier le MAC (code d'authentification du message) d'un message. Un MAC est dérivé // d'un hachage sur le `macSecret` et le message. Il garantit que le message n'a pas été // modifié, et a été envoyé par quelqu'un qui connaît `macSecret`. func checkMac(macSecret : secret(string), message : string, mac : string) -> bool { computedMac = computeMac(macSecret, message) return mac == computedMac } func computeMac(macSecret : string, message:string) -> string { // Un algorithme MAC populaire. return hmacSha256(macSecret, message) } |
Dans la plupart des langages, un acteur malveillant disposant de données temporelles précises peut falsifier un MAC sur un message de son choix, ce qui amène un serveur à l'accepter comme authentique.
Supposons que l’acteur malveillant puisse savoir combien de temps il faut pour que mac == computedMac s'exécute. Si le premier octet d'un MAC choisi par l’acteur malveillant est faux pour le message, la boucle se termine après une seule comparaison. Avec 256 tentatives, l’acteur malveillant peut trouver le premier octet du MAC attendu pour le message contrôlé par l'attaquant. En répétant ce processus, l’acteur malveillant peut falsifier un MAC entier.
Les responsables de Rune prétendent que ses utilisateurs sont protégés, car le compilateur voit que macSecret est secret, et donc que le résultat de hmacSha256 est secret. L'opérateur de comparaison de chaînes de caractères, lorsque l'un ou l'autre des opérandes est secret, s'exécute en temps constant, ne révélant aucune information temporelle à l’acteur de la menace. « Il faut toujours être prudent dans Rune, mais de nombreuses erreurs courantes comme celle-ci sont détectées par le compilateur, qui les corrige ou les signale comme des erreurs », écrivent-ils.
En ce qui concerne la vitesse et la sécurité de la gestion de la mémoire de Rune, la classe ci-dessous peut être difficile à modéliser dans certains langages, mais elle est triviale dans SQL et Rune. Considérons une classe Humain.
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | class Human(self, name: string, mother: Human = null, father: Human = null) { self.name = name if !isnull(mother) { mother.appendMotheredHuman(self) } if !isnull(father) { father.appendFatheredHuman(self) } func printFamilyTree(self, level: u32) { for i in range(level) { print " " } println self.name for child in self.motheredHumans() { child.printFamilyTree(level + 1) } for child in self.fatheredHumans() { child.printFamilyTree(level + 1) } } } relation DoublyLinked Human:"Mother" Human:"Mothered" cascade relation DoublyLinked Human:"Fater" Human:"Fathered" cascade adam = Human("Adam") eve = Human("Eve") cain = Human("Cain", eve, adam) abel = Human("Abel", eve, adam) alice = Human("Alice", eve, adam) bob = Human ("Bob", eve, adam) malory = Human("Malory", alice, abel) abel.destroy() adam.printFamilyTree(0u32) eve.printFamilyTree(0u32) |
Lorsqu'il est exécuté, il affiche
Abel et Malory ne sont pas listés. Cela s'explique par le fait que Rune n'a pas seulement éliminé Abel, il a été détruit, ce qui a entraîné la destruction récursive de tous les enfants d'Abel. Les instructions de relation sont similaires aux colonnes des tables SQL. Une table avec une colonne Mère et Père a deux relations de plusieurs à un dans une base de données.
Les instructions de relation donnent au compilateur Rune des indications essentielles pour l'optimisation de la mémoire. Les objets dont le compilateur peut prouver qu'ils sont toujours dans des relations de type cascade-suppression n'auraient pas besoin d'être comptés par référence. Les déclarations de relation indiquent également au compilateur qu'il doit mettre à jour le destructeur de Node pour détruire récursivement les enfants.
Tout langage peut utiliser un type de données distinct pour les secrets et l'opérateur correspondant pour la comparaison en temps constant.
Rune comme bibliothèque dans la plupart des langages existants
Pour certains analystes, il n’existe pas de raisons nécessitant un nouveau langage et qui ne pourrait pas être implémenté sous forme de bibliothèque dans la plupart des langages existants (y compris les langages populaires comme le C++).
RUST répond au besoin de sécurité mémoire
Rust a été créé pour garantir des performances élevées similaires à celles offertes par le C et le C++, mais en mettant l'accent sur la sécurité du code, dont le manque est le talon d'Achille de ces deux langages. Cependant, Rust a plus que la sécurité de la mémoire de son côté. Les hautes performances lors du traitement de grandes quantités de données, le support de la programmation concurrente, ainsi qu'un compilateur efficace sont d'autres raisons pour lesquelles des poids lourds du logiciel utilisent le langage de programmation Rust.
Caractéristiques du langage Rust
Rust est un langage entièrement développé de façon ouverte. Il offre la possibilité de construire des logiciels fiables et efficaces. Ses domaines de prédilection étant la programmation système, les applications en ligne de commande, les applications Web via WebAssembly, les services réseaux et les systèmes embarqués. Le langage est également apprécié par sa communauté pour les raisons suivantes :
- performance : Rust est un langage rapide et économique en mémoire, sans environnement d'exécution, ni ramasse-miettes, il peut dynamiser des services à hautes performances, s'exécuter dans des systèmes embarqués, et s'intégrer facilement à d'autres langages ;
- fiabilité : le système de typage et le modèle d’ownership de Rust garantissent la sécurité mémoire ainsi que la sécurité des threads. Il permet d'éliminer de nombreuses variétés de bugs dès la compilation ;
- productivité : Rust dispose d'une excellente documentation, d'un compilateur bienveillant, avec des messages d'erreur utiles. Le langage a également un gestionnaire de paquet et de compilation intégré, divers éditeurs intelligents avec autocomplétions et analyse de type. Il dispose également d’un outil de mise en forme automatique.
C++
C++ est un langage de programmation compilé permettant la programmation sous de multiples paradigmes, dont la programmation procédurale, la programmation orientée objet et la programmation générique. Ses bonnes performances, et sa compatibilité avec le C en font un des langages de programmation les plus utilisés dans les applications où la performance est critique.
C'est un langage polyvalent, ce qui signifie qu'il peut être utilisé dans presque tous les cas. Cependant, en raison de ses règles syntaxiques complexes et de son utilisation globalement difficile, il est principalement dominant dans les applications qui nécessitent une grande vitesse, la simultanéité et un examen plus approfondi du fonctionnement du matériel.
C++ est le langage de programmation qui a permis de créer des systèmes d'exploitation comme Microsoft Windows. En outre, le C++ est utilisé pour produire la majorité des jeux vidéo sur le marché.
Source : Rune Team's
Et vous ?
À votre avis, le langage de programmation système Rune est-il pertinent ?
Que pensez-vous de l'idée selon laquelle il n'existe pas de raison pour la création du langage Rune ?
Croyez-vous qu'une bibliothèque pour les langages existants serait mieux qu'un nouveau langage ?
Voir aussi :
Rust est approuvé pour une utilisation côté serveur chez Meta, les principaux langages côté serveur supportés par Meta sont Hack, C++, Rust et Python
Rust 1.63 est disponible et s'accompagne des fils d'exécution délimités, des propriété Rust pour les descripteurs de fichiers