La Fondation Rust publie un énoncé de problème sur l'interopérabilité C++/Rust. Plutôt que de prescrire des solutions spécifiques, l'énoncé de problème sert de base à la contribution et à la participation de la communauté pour façonner à la fois la direction stratégique et la mise en œuvre tactique d'une interopérabilité améliorée entre C++ et Rust. L'« Initiative Interop » a été lancée en février 2024 avec la contribution de 1 million de dollars de Google. En février 2024, Google avait accordé une subvention d’un million de dollars à la Fondation Rust pour soutenir les efforts d’interopérabilité avec le langage C++. En toile de fond, le géant technologique cherche à faciliter la transition à Rust que de plus en plus d’observateurs jugent supérieur à C et à C++ pour la sécurisation des logiciels. La tendance dans l’industrie technologique est telle que même Linus Torvalds reconnaît que Rust, qui a été adopté comme deuxième langage pour le développement du noyau Linux, est digne d’intérêt d’un point de vue technique.
La Fondation Rust, une organisation indépendante à but non lucratif dédiée à la gestion et à l'avancement du langage de programmation Rust, a récemment publié un énoncé de problème complet abordant les défis et les opportunités de l'interopérabilité entre C++ et Rust. Cette publication marque une étape importante pour rendre le développement inter-langages plus accessible et plus abordable pour la communauté de programmation dans son ensemble.
L'énoncé du problème présente trois approches stratégiques clés :
- Améliorer les outils existants et résoudre les problèmes tactiques au sein du projet Rust afin de réduire les frictions et les risques liés à l'interopérabilité à court terme.
- Construire un consensus autour d'objectifs à long terme nécessitant des changements dans le projet Rust lui-même et développer des approches tactiques pour commencer à les poursuivre.
- S'engager avec la communauté et le comité C++ pour améliorer la qualité de l'interopérabilité pour les deux langages afin d'atteindre les objectifs mutuels de sécurité et de performance.
Concernant l'« Initiative Interop », elle a été lancée en février 2024 avec la contribution de 1 million de dollars de Google. L'initiative reconnaît que C++ et Rust ont tous deux un rôle essentiel à jouer dans l'avenir de la programmation des systèmes. Bien que les deux langages excellent dans des domaines similaires, les utiliser ensemble de manière efficace est crucial pour les organisations qui cherchent à équilibrer la sécurité et la performance avec la maintenabilité. Le défi principal réside dans le développement d'une approche mature et standardisée de l'interopérabilité entre C++ et Rust, malgré l'accent historique mis par Rust sur la compatibilité avec le langage C.
L'initiative propose une approche collaborative de l'espace-problème impliquant les principales parties prenantes des deux communautés linguistiques. Plutôt que de prescrire des solutions spécifiques, l'énoncé de problème sert de base à la contribution et à la participation de la communauté pour façonner à la fois la direction stratégique et la mise en œuvre tactique d'une interopérabilité améliorée entre C++ et Rust.
Voici l'énoncé de problème d'interopérabilité entre Rust et C++ :
[QUOTE]
Résumé
Le C++ et le Rust joueront tous deux un rôle important dans la programmation des systèmes dans un avenir prévisible. Avec un tel degré de chevauchement dans l'applicabilité, l'utilisation conjointe des deux langages est essentielle à la recherche de la sécurité et de la performance qui sont maintenables et évolutives. L'objectif principal de l'initiative est de permettre aux technologues de choisir le langage le mieux adapté à leur situation et de minimiser les coûts et les risques liés à l'interopérabilité.
Bien que l'interopérabilité du C ait été au centre des préoccupations de Rust depuis sa création, plusieurs facteurs ont empêché la mise en place d'une solution mature, standard et automatique pour le développement de logiciels utilisant conjointement C++ et Rust. Pour surmonter ces obstacles, l'initiative poursuivra une approche descendante, axée sur l'espace-problème, afin de faciliter la coopération et le consensus entre les parties prenantes, notamment le projet Rust, les organisations membres de la Fondation Rust et la communauté des individus et des organisations utilisant C++ ou Rust. Les ressources matérielles apportées à l'initiative seront utilisées pour poursuivre trois stratégies simultanées :
- Améliorer les outils existants et résoudre les problèmes tactiques au sein du projet Rust afin de réduire les frictions et les risques liés à l'interopérabilité à court terme.
- Construire un consensus autour d'objectifs à long terme nécessitant des changements dans le projet Rust lui-même et développer des approches tactiques pour commencer à les poursuivre.
- S'engager avec la communauté et le comité C++ pour améliorer la qualité de l'interopérabilité pour les deux langages afin d'atteindre les objectifs mutuels de sécurité et de performance.
L'approche axée sur les problèmes est essentielle pour surmonter les obstacles dans ce domaine. Beaucoup de travail a été fait sur les outils qui apportent une valeur considérable, mais il y a une limite à ce qui peut être réalisé avec des bibliothèques externes et des outils de génération de code ; motiver avec succès des changements plus profonds nécessite un consensus stratégique afin de définir un travail tactique concret. Par conséquent, le présent document ne définit pas de solutions ; il constitue un appel à la contribution et à la participation pour affiner ces stratégies et les tactiques qui en découlent. Le reste du document décrit plus en détail le problème lui-même et ces stratégies.
Le problème
L'interopérabilité C++/Rust est la capacité d'échanger des données et d'exécuter du code écrit dans les deux langages. Il existe un compromis inhérent entre la simplicité et l'efficacité et une dichotomie distincte entre la communication inter-processus et l'interopérabilité intra-processus. Cette dernière se produit au sein du même exécutable, soit par la compilation intégrée de plusieurs langages (inline embedding), soit par des interfaces de fonctions étrangères (FFI). L'initiative interop est exclusivement axée sur cette dernière forme, de sorte que toutes les mentions ultérieures de l'interopérabilité dans le présent document se réfèrent à l'interopérabilité intra-processus. De nombreuses questions ouvertes ne sont pas abordées ici, telles que les caractéristiques des langages Rust et C++ qui peuvent être efficacement prises en charge par les interfaces de fonctions étrangères et l'incidence de l'établissement de liens statiques ou dynamiques sur l'interopérabilité.
Qui est concerné ?
Bien que Rust et C++ soient tous deux utilisés en dehors de leur domaine principal en tant que langages de systèmes, ce type d'interopérabilité est particulièrement pertinent dans le domaine des systèmes où les ressources sont limitées. Le désir d'interopérabilité dépend du système en question, mais les cas d'utilisation les plus courants sont les suivants :
- les systèmes C++ qui ajoutent ou remplacent des fonctionnalités par Rust
- Systèmes Rust utilisant du code C++ existant
- Systèmes polyglottes supportant Rust (comme pour les architectures de plugins)
En raison de cette dynamique et de la longue histoire du C++ avant Rust, le premier cas est de loin le plus courant.
Comme il n'existe actuellement aucune chaîne d'outils permettant de mélanger C++ et Rust dans le même fichier source, les approches existantes en matière d'interopérabilité se concentrent sur les solutions basées sur la FFI. L'interopérabilité FFI s'effectue aujourd'hui via les ABI de plate-forme C, parce qu'elles sont moins dépendantes de la plate-forme et plus stables que les ABI de plate-forme C++. Ainsi, plus on s'appuie sur des facilités spécifiques au C++, plus il est difficile de les traduire efficacement à travers une interface basée sur le C.
Quand et où cela est-il pertinent ?
À l'approche du dixième anniversaire de sa version stable 1.0, Rust passe de la phase des « early adopters » à celle de la « early majority » dans le cycle de vie de l'adoption des technologies. Cette transition correspond à l'importance croissante accordée par l'industrie et les gouvernements à l'adoption de langages à mémoire sécurisée, et Rust se distingue comme un choix de premier ordre. Rust combine de manière unique une prise en charge robuste de la concurrence et une garantie d'absence de comportement non défini, ce qui en fait une alternative convaincante au C++ dans les environnements où le ramasse-miettes n'est pas possible. Sa fiabilité éprouvée dans ces domaines fait de Rust un outil essentiel pour des systèmes plus sûrs et plus performants.
Alors que Rust a considérablement évolué au cours de cette période, l'histoire de l'interopérabilité avec le C++ reste limitée par les fondements de l'ABI C. Une grande partie du développement a été consacrée aux bibliothèques pour faciliter l'interopérabilité avec les deux langages. Une quantité importante de développement a été consacrée aux bibliothèques pour faciliter l'interopérabilité avec C et C++, mais au niveau du langage et du compilateur, la situation reste largement inchangée par rapport aux premiers jours de Rust.
Alors que le désir d'intégrer Rust dans un plus grand nombre de codes C++ augmente, l'intérêt de rendre l'interopérabilité C++/Rust plus sûre, plus facile et plus efficace s'accroît rapidement. Bien que chaque langage adopte une approche globale différente, tous deux considèrent la sécurité comme une préoccupation essentielle dans les systèmes modernes. Rust et C++ disposent tous deux de facilités au niveau du langage et de la bibliothèque standard pour améliorer la sécurité de manière apparemment compatible, mais des avantages significatifs sont perdus lors du passage de la frontière FFI en utilisant l'ABI C.
Quel est l'impact ?
En tant que langage système, Rust a toujours été conçu pour être interopérable avec C. Même pour les langages non systèmes, C est la lingua franca pour la FFI en général et l'accès aux ressources au niveau du système d'exploitation en particulier. En tant que telle, l'interopérabilité C ↔︎ Rust est relativement simple et la charge qui pèse sur le programmeur Rust se présente sous deux formes principales :
- La communication est limitée aux interfaces exprimables dans le système de types C, ce qui exclut une grande partie des avantages de Rust en termes d'ergonomie et de sécurité.
- La frontière de la FFI elle-même n'est généralement pas sûre, ce qui signifie que des garanties telles que l'absence de comportement non défini et de course aux données sont perdues.
Les défis d'interopérabilité auxquels sont confrontés les développeurs de Rust se retrouvent chez les développeurs C++, qui doivent également sacrifier des caractéristiques de sécurité et d'ergonomie qui ne sont pas propres au C. La relation superset entre le C++ et le C simplifie...
La fin de cet article est réservée aux abonnés. Soutenez le Club Developpez.com en prenant un abonnement pour que nous puissions continuer à vous proposer des publications.