Qu'est-ce que la rouille? Développement logiciel sûr, rapide et facile

Rapide, sûr, facile à écrire - choisissez-en deux. C'est l'état du développement logiciel depuis longtemps maintenant. Les langages qui mettent l'accent sur la commodité et la sécurité ont tendance à être lents (comme Python). Les langages qui mettent l'accent sur les performances ont tendance à être difficiles à utiliser et faciles à utiliser (comme C et C ++).

Ces trois attributs peuvent-ils être fournis dans une seule langue? Plus important encore, pouvez-vous amener le monde à travailler avec? Le langage Rust, créé à l'origine par Graydon Hoare et actuellement sponsorisé par Mozilla Research, est une tentative de faire exactement ces choses. (Le langage Google Go a des ambitions similaires, mais Rust vise à faire le moins de concessions possible sur les performances.)

Vidéo connexe: Développement de logiciels plus sûrs avec Rust

Soyez rapidement au courant du nouveau venu Rust, conçu pour créer des logiciels rapides au niveau du système. Cet explicatif animé de deux minutes montre comment Rust contourne les problèmes de programmation épineux de la mémoire et de la gestion.

Rust est censé être rapide, sûr et raisonnablement facile à programmer. Il est également destiné à être largement utilisé, et pas simplement à devenir une curiosité ou un tirage au sort des langues. Les bonnes raisons abondent pour créer un langage où la sécurité est à égalité avec la vitesse et la puissance de développement. Après tout, il existe une énorme quantité de logiciels - dont certains gèrent des infrastructures critiques - construits avec des langages où la sécurité n'était pas la première préoccupation.

Avantages du langage de programmation Rust

Rust a commencé comme un projet de recherche Mozilla destiné en partie à réimplémenter des composants clés du navigateur Firefox. Quelques raisons principales ont motivé cette décision: Firefox méritait de mieux utiliser les processeurs modernes et multicœurs; et l'omniprésence des navigateurs Web signifie qu'ils doivent être sûrs à utiliser.

Mais ces avantages sont nécessaires à tous les logiciels, pas seulement aux navigateurs, c'est pourquoi Rust est devenu un projet de langage à partir d'un projet de navigateur. La rouille réalise sa sécurité, sa vitesse et sa facilité d'utilisation grâce aux caractéristiques suivantes.

La rouille est rapide

Le code Rust se compile en code machine natif sur plusieurs plates-formes. Les binaires sont autonomes, sans runtime, et le code généré est censé fonctionner aussi bien que du code comparable écrit en C ou C ++.

La rouille est sans danger pour la mémoire

Rust ne compilera pas les programmes qui tentent d'utiliser la mémoire non sécurisée. La plupart des erreurs de mémoire sont découvertes lors de l'exécution d'un programme. La syntaxe et les métaphores de langage de Rust garantissent que les problèmes communs liés à la mémoire dans d'autres langages - pointeurs nuls ou pendants, courses de données, etc. - ne parviennent jamais à la production. Le compilateur signale ces problèmes et les force à être résolus avant que le programme ne s'exécute.

La rouille est faible

Rust contrôle la gestion de la mémoire via des règles strictes. Le système de gestion de la mémoire de Rust est exprimé dans la syntaxe du langage à travers une métaphore appelée propriété . Toute valeur donnée dans le langage ne peut être «possédée» ou détenue et manipulée que par une seule variable à la fois.

La façon dont la propriété est transférée entre les objets est strictement régie par le compilateur, il n'y a donc pas de surprises à l'exécution sous la forme d'erreurs d'allocation de mémoire. L'approche de propriété signifie également qu'il n'y a pas de gestion de la mémoire récupérée, comme dans des langages comme Go ou C #. (Cela donne également à Rust une autre amélioration des performances.) Chaque bit de mémoire dans un programme Rust est suivi et libéré automatiquement via la métaphore de la propriété.

La rouille est flexible

Rust vous permet de vivre dangereusement si vous en avez besoin, jusqu'à un certain point. Les sécurités de Rust peuvent être en partie suspendues là où vous devez manipuler directement la mémoire, comme par exemple déréférencer un pointeur brut à la C / C ++. Le mot clé est en partie , parce que les opérations de sécurité de la mémoire de Rust ne peuvent jamais être complètement désactivées. Même dans ce cas, vous n'avez presque jamais à enlever les ceintures de sécurité pour les cas d'utilisation courants, de sorte que le résultat final est un logiciel plus sûr par défaut.

La rouille est facile à utiliser

Aucune des fonctionnalités de sécurité et d'intégrité de Rust n'ajoute beaucoup si elles ne sont pas utilisées. C'est pourquoi les développeurs et la communauté de Rust ont essayé de rendre le langage aussi utile et accueillant que possible pour les nouveaux arrivants.

Tout le nécessaire pour produire des binaires Rust est livré dans le même package. Les compilateurs externes, comme GCC, ne sont nécessaires que si vous compilez d'autres composants en dehors de l'écosystème Rust (comme une bibliothèque C que vous compilez à partir des sources). Les utilisateurs de Microsoft Windows ne sont pas non plus des citoyens de seconde zone; la chaîne d'outils Rust y est aussi performante que sur Linux et MacOS.

La rouille est multiplateforme

Rust fonctionne sur les trois principales plates-formes: Linux, Windows et MacOS. D'autres sont soutenus au-delà de ces trois. Si vous souhaitez effectuer une compilation croisée ou produire des binaires pour une architecture ou une plate-forme différente de celle que vous utilisez actuellement, un peu plus de travail est nécessaire, mais l'une des missions générales de Rust est de minimiser la quantité de travail lourd nécessaire pour un tel travail. De plus, bien que Rust fonctionne sur la majorité des plates-formes actuelles, ce n'est pas l'objectif de ses créateurs de faire compiler Rust absolument partout - sur toutes les plates-formes populaires et partout où ils n'ont pas à faire de compromis inutiles pour le faire.

Rust a de puissantes fonctionnalités linguistiques

Peu de développeurs souhaitent commencer à travailler dans une nouvelle langue s'ils trouvent qu'elle a moins de fonctionnalités, ou plus faibles, que celles auxquelles ils sont habitués. Les fonctionnalités du langage natif de Rust se comparent favorablement à celles des langages comme C ++: les macros, les génériques, la correspondance de motifs et la composition (via des «traits») sont tous des citoyens de première classe dans Rust.

Rust a une bibliothèque standard utile

Une partie de la mission plus large de Rust est d'encourager les développeurs C et C ++ à utiliser Rust au lieu de ces langages chaque fois que possible. Mais les utilisateurs C et C ++ s'attendent à avoir une bibliothèque standard décente - ils veulent pouvoir utiliser des conteneurs, des collections et des itérateurs, effectuer des manipulations de chaînes, gérer les processus et les threads, effectuer des E / S réseau et fichier, etc. Rust fait tout cela, et plus encore, dans sa bibliothèque standard. Parce que Rust est conçu pour être multiplateforme, sa bibliothèque standard ne peut contenir que des éléments qui peuvent être portés de manière fiable sur les plates-formes. Les fonctions spécifiques à la plate-forme comme epoll de Linux doivent être prises en charge via des fonctions dans des bibliothèques tierces telles que libc, mio ​​ou tokio. 

Il est également possible d'utiliser Rust sans sa bibliothèque standard. Une raison courante de le faire est de créer des binaires qui n'ont pas de dépendances de plate-forme - par exemple, un système intégré ou un noyau de système d'exploitation.

Rust possède de nombreuses bibliothèques tierces, ou «caisses»

Une mesure de l'utilité d'une langue est de savoir tout ce qui peut être fait avec elle grâce à des tiers. Cargo, le référentiel officiel des bibliothèques Rust (appelé «crates») répertorie quelque dix mille caisses. Un bon nombre d'entre eux sont des liaisons API avec des bibliothèques ou des frameworks communs, donc Rust peut être utilisé comme une option de langage viable avec ces frameworks. Cependant, la communauté Rust ne fournit pas encore une curation détaillée ou un classement des caisses en fonction de leur qualité et de leur utilité globales, vous ne pouvez donc pas dire ce qui fonctionne bien sans essayer les choses vous-même ou interroger la communauté.

Rust a un bon support IDE 

Encore une fois, peu de développeurs souhaitent adopter un langage avec peu ou pas de support dans l'EDI de leur choix. C'est pourquoi Rust a récemment introduit le Rust Language Server, qui fournit des commentaires en direct du compilateur Rust aux IDE tels que Microsoft Visual Studio Code.

Inconvénients du langage de programmation Rust

Outre toutes ses capacités attrayantes, puissantes et utiles, Rust a ses inconvénients. Certains de ces obstacles font trébucher les nouveaux «rustaceans» (comme les fans de Rust s'appellent les uns les autres) et les anciens. 

La rouille est nouvelle

Rust est encore un langage jeune, n'ayant livré sa version 1.0 qu'en 2015. Ainsi, alors qu'une grande partie de la syntaxe et des fonctionnalités du langage de base a été martelée, beaucoup d'autres choses autour de lui sont encore fluides.

Les opérations asynchrones, par exemple, ne sont toujours pas bien représentées dans la syntaxe du langage. Des travaux sont en cours pour implémenter des opérations asynchrones via asyncet des awaitmots - clés.

La rouille est difficile à apprendre

Si une chose à propos de Rust est la plus problématique, c'est à quel point il peut être difficile de comprendre les métaphores de Rust. La propriété, l'emprunt et l'autre gestion de la mémoire de Rust font trébucher tout le monde la première fois. De nombreux programmeurs Rust débutants ont un rite de passage commun, «lutter contre le vérificateur d'emprunt», où ils découvrent de première main à quel point le compilateur est méticuleux pour séparer les choses mutables et immuables.

La rouille est complexe

Une partie de la difficulté vient de la façon dont les métaphores de Rust produisent un code plus détaillé, par rapport à d'autres langages. Par exemple, la concaténation de chaînes dans Rust n'est pas toujours aussi simple que string1+string2. Un objet peut être mutable et l'autre immuable. Rust est enclin à insister pour que le programmeur explique comment gérer de telles choses, plutôt que de laisser le compilateur deviner.

Un autre exemple: comment Rust et C / C ++ fonctionnent ensemble. La plupart du temps, Rust est utilisé pour se connecter à des bibliothèques existantes écrites en C ou C ++; peu de projets en C et C ++ sont réécrits à partir de zéro dans Rust. (Et quand ils le sont, ils ont tendance à être réécrits progressivement.)

La feuille de route de la langue de Rust

L'équipe Rust est consciente de bon nombre de ces problèmes et s'efforce de les améliorer. Par exemple, pour faciliter l'utilisation de Rust avec C et C ++, l'équipe Rust étudie l'opportunité d'étendre des projets tels que bindgen, qui génère automatiquement des liaisons Rust avec du code C. L'équipe envisage également de rendre les emprunts et les durées de vie plus flexibles et plus faciles à comprendre. 

Néanmoins, Rust atteint son objectif de fournir un langage système sûr, concurrent et pratique, comme d'autres langages ne le font pas, et de le faire d'une manière qui complète la façon dont les développeurs travaillent déjà.