Démarrez avec Rust dans la programmation Windows

Microsoft pourrait-il passer de son utilisation de C, C ++ et C # à d'autres langages? Un récent article de blog du Microsoft Security Response Center (MSRC) a suggéré qu'il pourrait bien envisager des alternatives, dans le but de réduire les risques pour son code. Comme Gavin Thomas, le principal responsable de l'ingénierie de sécurité chez MSRC, a noté que l'une des principales causes des bogues dans le code Microsoft signalés au MSRC est la corruption de la mémoire, les bogues qui permettent d'écraser la mémoire ou d'accéder à ce qui devrait être protégé.

Garder la mémoire en sécurité

La sécurité de la mémoire a été un problème important pendant longtemps, mais le travail statistique effectué par MSRC montre que le problème ne disparaît pas. Vous disposez de nombreux outils pour vous aider à écrire du code sécurisé, du propre cycle de vie de développement sécurisé de Microsoft à l'utilisation de nouveaux langages sécurisés en mémoire comme C #. Mais ces approches ont leurs compromis: le code qu'elles produisent est plus lent et fonctionne à un niveau supérieur à C ++.

Ce n'est pas un problème pour le code client. Il n'y a pas de différence perceptuelle entre une expérience utilisateur C ++ - develoepd et une expérience C # intégrée. Mais au niveau du système, le code utilisé pour construire les systèmes d'exploitation et les pilotes de périphériques, il y a une grande différence. Les cycles de processeur sont importants lorsque vous travaillez au niveau des systèmes, et comme Thomas le souligne dans son article de blog, les langages non protégés comme C ++ et C sont vraiment les seuls outils qui fonctionnent historiquement à ce niveau.

Il est clair que les approches de sécurité mémoire utilisées par les langages de niveau supérieur ne fonctionnent pas au niveau du système. Bon nombre des problèmes qui ont tourmenté le projet abandonné Longhorn de Microsoft ont été causés par la tentative de créer un système d'exploitation entier sur la plate-forme .NET. Alors, comment pouvons-nous apporter la sécurité de la mémoire aux fondations du développement de système?

Présentation de Rust

La réponse vient avec une nouvelle génération de langages de programmation de systèmes comme Go et Rust, des langages qui ont les conceptions sans danger pour la mémoire de .Net avec la vitesse de C et C ++. Microsoft utilise déjà beaucoup Go dans Azure, car c'est le langage dans lequel Kubernetes est écrit. Mais ces approches n'ont pas encore atteint Windows, où C ++ est toujours le roi de la programmation de systèmes.

Dans son article de blog, Thomas soutient l'utilisation de Rust de Mozilla comme langage système sûr pour Windows. C'est une suggestion intéressante, et qui a déjà une grande preuve en sa faveur: le concepteur de langage Mozilla l'utilise déjà dans ses dernières versions de navigateur Web, où il alimente les moteurs de rendu actuels et de nouvelle génération de Mozilla. Les autres grands utilisateurs de Rust incluent le référentiel de modules JavaScript NPM, Dropbox et Oracle. Même Microsoft l'utilise déjà, avec du code Rust dans certains de ses outils Azure IoT Edge.

Configuration d'un environnement de développement Windows Rust

Le point de départ évident pour le développement Rust est Visual Studio Code. Dans son marché d'extensions, vous pouvez trouver plusieurs extensions qui installent le serveur de langage Rust et qui sont livrées avec une prise en charge complète du langage ainsi que des outils pour créer vos applications Rust à partir de Visual Studio Code. J'utilise l'extension officielle Rust de l'équipe linguistique Rust. D'autres outils prennent en charge les extraits de code pour démarrer le développement, ainsi que des outils de débogage et de test supplémentaires. Il existe même des outils pour créer la documentation de votre code. Cela vaut la peine d'installer le pack d'extension Rust dans le cadre de votre environnement Visual Studio Code Ruse, car cela ajoute des outils supplémentaires pour travailler avec les propres outils de développement de Rust.

Vous devez d'abord installer le compilateur Rust et le gestionnaire de paquets Cargo. Le site d'installation officiel de Rust détectera la version de Windows que vous utilisez et fournira le téléchargement approprié. Il existe même des instructions pour installer Rust sur le sous-système Windows pour Linux (WSL), si vous utilisez WSL dans le cadre d'une chaîne d'outils de développement Unix. L'exécution du programme d'installation de Rustup télécharge les composants de langue et définit le PATH Windows . Vous avez la possibilité de personnaliser l'installation, mais en pratique, il est préférable d'accepter les valeurs par défaut.

Comprendre la rouille et la sécurité de la mémoire

Si vous avez programmé C ou C ++, la transition vers Rust est relativement simple. Il y a beaucoup de similitudes entre les langues, bien que ce soit le concept de propriété de Rust qui le rend sûr pour la mémoire. La propriété permet à Rust de gérer la portée des variables, leur permettant d'être valides uniquement lorsqu'elles sont dans la portée. S'ils ne sont pas utilisés, ils ne sont pas en mémoire. Certaines variables sont des valeurs littérales, immuables codées en dur dans votre code. Mais des types de variables plus complexes peuvent demander de la mémoire lorsqu'ils sont définis, un processus qui, dans de nombreux autres langages, vous oblige à allouer explicitement de la mémoire, puis à la libérer lorsque la variable ou l'objet n'est plus nécessaire. Rust automatise cela, en gérant l'utilisation de la mémoire dans le cadre de sa gestion de l'étendue.

L'équipe de Mozilla qui a créé Rust a profondément réfléchi à la sécurité de la mémoire et aux compromis qui peuvent se produire dans un environnement sûr. Le résultat est un langage à la fois sûr et rapide, avec des outils qui gèrent à la fois les piles de mémoire et les tas. L'attribution d'une valeur à une fonction modifie sa propriété, la déplaçant d'une portée à une autre; un processus similaire gère les valeurs renvoyées par un appel de fonction.

La propriété est un concept complexe, mais c'est un concept important. Il protège la mémoire et ne laisse que les fonctions qui possèdent une valeur la modifier, même lorsque vous utilisez une référence à une variable. Étant donné que Rust traite une référence comme empruntant la variable, essayer de la modifier ne générera qu'une erreur, sauf si vous la déclarez mutable.

L'avenir de Rust sous Windows

Il est important de se rappeler que Rust est encore un langage jeune et qu'une grande partie de ce que vous tenez pour acquis dans le développement Windows n'est pas là. Il n'y a pas d'intégration directe avec Win32 ou d'autres SDK Windows de base, et vous ne trouverez aucune prise en charge des outils d'interface graphique Windows sans installer de bibliothèques supplémentaires. Cependant, ce n'est pas aussi un problème que vous pourriez le penser: Rust, comme Go, est un langage de programmation système. C'est un outil de bas niveau, rapide et sûr. Cela le rend idéal pour créer du code qui manipule vos données, analyse des nombres et traite des tableaux. Au lieu d'utiliser des routines C ++ où vous travaillez avec de grandes quantités de mémoire, utilisez plutôt Rust, ce qui réduit le risque associé à la corruption de la mémoire.

Si vous souhaitez développer des applications GUI dans Rust, vous avez la possibilité d'utiliser l'une des nombreuses bibliothèques d'interface utilisateur. Le plus simple à utiliser est peut-être Kiss-ui, qui prend en charge le développement d'interface graphique Windows et Linux, avec un accès à l'API Win32 ainsi qu'une prise en charge de la GTK multiplateforme. D'autres bibliothèques ajoutent une prise en charge plus approfondie de l'API Win32.

Même si Microsoft ne prend pas en charge Rust directement, il y a beaucoup de soutien de la communauté. Bien que l'assemblage d'une chaîne d'outils complète puisse toujours être une question de choix des différents éléments dont vous avez besoin et d'utiliser des outils comme Rustup pour les installer, l'arrivée des extensions et packs d'extension Visual Studio Code semble devoir simplifier le processus. Des mises à jour régulières montrent qu'il s'agit vraiment d'un projet en direct, avec l'équipe Rust et une foule de contributeurs tiers qui travaillent dessus.

Le principe sous-jacent de l'utilisation de langages sûrs pour la mémoire est important, et il est certainement bon de voir les gens de MSRC résoudre le problème. Jusqu'à ce qu'il y ait une version officielle d'un langage de programmation de systèmes de bas niveau sûr en mémoire, il vaut certainement la peine de donner une fois à Rust. Si Microsoft le choisit, vous serez bien en avance sur le jeu.

En dehors de Windows, Rust est un langage clé pour le développement WebAssembly et devrait aider à fournir des applications Web beaucoup plus puissantes dans la prochaine version d'Edge optimisée par Chromium - une autre raison de lui donner un examen attentif.