C++ vs Rust : une comparaison pratique de la vitesse de compilation et de test des deux langages de programmation,
par Matthew Glazar, ingénieur en génie logiciel
L’ingénieur en génie logiciel, Matthew Glazar, pour qui coder en C++ serait « un cauchemar » reproche entre autre au langage de programmation C++ sa lenteur. Ce dernier n’est pas le seul à haïr le langage de programmation qui, de par son histoire, ou encore son intérêt pour des projets importants, mériterait mieux en termes de respect. On se souvient que Linus Torvalds avait déjà qualifié le C++ « de langage horrible » en 2011, pour ensuite indiquer en 2021 qu’il s’agit « d’un langage de m... » Le codage en Rust est-il aussi mauvais qu'en C++ ? S'interroge Matthew Glazar
Nous avons vu de nombreux langages de programmation se développer en fonction de leur fonctionnalité et de leur popularité, mais les langages ne sont pas destinés à être utilisés en fonction de leur popularité. Nous devrions considérer l'efficacité et la productivité globales lorsqu'il s'agit d'utiliser un langage de programmation. En parlant d'efficacité et de popularité, l'un des langages de programmation les plus utilisés à l'heure actuelle est le C++. Il est connu pour sa contribution aux systèmes d'exploitation et à l'industrie du jeu, et c'est le langage le plus utilisé en termes de programmation compétitive en raison de sa bibliothèque prédéfinie de modèles standard (STL). D'autre part, Rust semble être un sujet brûlant ces temps-ci en référence au C++ en raison de « sa syntaxe similaire ». En-dehors de la syntaxe, il existe d'autres facteurs comme le temps de compilation qui explique pourquoi Rust se fait de la place face au C++.
C++
1 2 3 4 5
| #include <iostream>
int main() {
std::cout << "Hello, world!";
return 0;
} |
Hello, world!
Rust
1 2 3
| fn main() {
println!("Hello World!");
} |
Hello, world!
Rust est un langage de niveau système plus innovant en termes de gestion plus sûre de la mémoire. Il est créé pour être sûr et sécurisé sans affecter les performances et la vitesse. Rust est principalement utilisé pour développer des pilotes de périphériques, des systèmes d'exploitation tels que BlogOS, intermezzOS, QuiltOS, Redox, RustOS, Rux, Tefflin et Tock. Il est également utilisé dans les navigateurs comme Mozilla firefox, les jeux.
En Avril 2021, Microsoft a annoncé Rust preview pour Windows, elle permet la création d'applications Rust pour le célèbre système d’exploitation de Microsoft en utilisant n'importe quelle API Windows. Avec Rust pour Windows, les développeurs peuvent non seulement utiliser Rust sur Windows, mais aussi développer des applications pour Windows en utilisant Rust.
Faisant référence à un cours publié par Microsoft sur les premiers pas avec Rust, Miguel de Icaza, ingénieur distingué de Microsoft a tweeté : « le "Rustening" a commencé chez Microsoft ». Ce que la plupart des adeptes de Rust sur Twitter voient comme un signe que l'entreprise augmente encore ses faveurs pour son langage de prédilection. Bien sûr, ce n'est pas la première fois que Microsoft se tourne vers Rust pour gérer les 70 % de vulnérabilités de Microsoft qui, selon l'entreprise, proviennent de l'utilisation du langage de programmation C++, peu sûr pour la mémoire, dans ses logiciels.
Pour certains analystes, le C++ possède des bases plus solides en ce qui concerne la communauté et les informations générales sur ses principes. En outre, par rapport au C++, Rust est un nouveau venu dans le monde de la programmation, et de nombreux développeurs hésitent à s'y intéresser.
Ce développement ne semble pas être du goût de Linus Torvalds, ingénieur logiciel, créateur principal et développeur du noyau Linux, pour lui, le C++ est un langage horrible, le créateur du noyau Linux n’a d’ailleurs pas hésité à traiter également le C++ de langage de merde. Dans un post publié sur son blog le 14 avril, l’équipe de développement de Google a annoncé qu’elle participe à l'évaluation du langage Rust pour le développement du noyau Linux. Suite à cette déclaration, Linus Torvalds a déclaré lors d’une interview que des discussions sur le sujet seraient beaucoup plus importantes qu'un long post de Google sur le langage. Interrogé sur la suggestion d'un internaute qui a indiqué que, « la solution ici est simple : il suffit d'utiliser C++ au lieu de Rust », Linus Torvalds n'a pas pu se retenir et aurait traité le C++ de « langage de merde ».
Rappelons pour les détracteurs du C++ que, le langage de programmation compilé permettant la programmation sous de multiples paradigmes (le C++), a dépassé Java le mois dernier dans l'indice mensuel TIOBE de popularité du langage, C++a été déclaré langage de l'année 2022 sur l'indice. Non seulement c’est la première fois dans l'histoire de l'indice TIOBE que le C++ dépasse Java, mais il est intéressant de noter au passage que des langages très souvent soutenus dans des forums comme Java ne figure pas dans le top 3 de l'indice mensuel TIOBE.
Si le trio de tête n'a pas changé depuis décembre, C++ a revêtu le maillot jaune en termes de popularité sur l'année écoulée : la popularité de C++ a augmenté de 4,62 points de pourcentage d'une année sur l'autre, suffisamment pour remporter le prix du langage de programmation TIOBE de l'année 2022. L'index TIOBE mesure la popularité des langages de programmation en se basant sur le nombre de pages web retournées par les principaux moteurs de recherche lorsqu'on leur soumet le nom du langage de programmation. Il est mis à jour une fois par mois et donne l'historique depuis 2002.
Le C++ est le langage de programmation de TIOBE de l'année 2022. Il a remporté ce titre parce que le C++ a gagné le plus de popularité (+4,62 %) en 2022. Les seconds sont C (+3,82 %) et Python (+2,78 %). « La raison de la popularité du C++ est son excellente performance tout en étant un langage orienté objet de haut niveau. De ce fait, il est possible de développer des systèmes logiciels rapides et vastes (plus de millions de lignes de code) en C++ sans nécessairement se retrouver dans un cauchemar de maintenance », l'organisation TIOBE.
La décaration de l'organisation TIOBE au sujet du C++ contraste avec ce que disent les détracteurs du C++.
![Citation](https://forum.developpez.be/images/misc/quote_icon.png)
Envoyé par
Matthew Glazar
« Des projets comme Google Chromium prennent une heure pour être construits sur du matériel neuf et 6 heures sur du matériel plus ancien. Il existe des tonnes d'ajustements documentés pour accélérer les constructions et des raccourcis sujets aux erreurs pour compiler moins de choses. Même avec des milliers de dollars de puissance de calcul en nuage, les temps de construction de Chromium sont toujours de l'ordre d'une demi-douzaine de minutes. C'est totalement inacceptable pour moi. Comment des gens peuvent-ils travailler comme ça tous les jours ?
J'ai entendu la même chose à propos de Rust : les temps de construction sont un énorme problème. Mais est-ce vraiment un problème dans Rust, ou est-ce de la propagande anti-Rust ? Comment se compare-t-il au problème de temps de construction du C++ ?
Je me soucie profondément de la vitesse de construction et des performances d'exécution. Des cycles de construction-test rapides font de moi un programmeur productif et heureux, et je me plie en quatre pour que mes logiciels soient rapides afin que mes clients soient également heureux.
»
Pour en avoir le cœur net, Matthew Glazar va :
- trouver un projet C++ open source ;
- isoler une partie du projet dans son propre mini-projet ;
- réécrire le code C++ ligne par ligne en Rust ;
- optimiser la compilation pour le projet C++ et le projet Rust ;
- comparer les temps de compilation+test entre les deux projets.
Voici, ci-dessous, ses hypothèses qui sont selon lui des suppositions éclairées, pas des conclusions :
- le portage Rust aura légèrement moins de lignes de code que la version C++ : la plupart des fonctions et méthodes doivent être déclarées deux fois en C++ (une dans l'en-tête et une dans le fichier d'implémentation). Ce n'est pas nécessaire dans Rust, ce qui réduit le nombre de lignes ;
- pour les constructions complètes, C++ prendra plus de temps à compiler que Rust : ceci est dû à la fonction #include de C++ et aux templates C++, qui doivent être compilés une fois par fichier .cpp. Cette compilation est effectuée en parallèle, mais le parallélisme est imparfait ;
- pour les constructions incrémentales, Rust prendra plus de temps à compiler que C++ : ceci est dû au fait que Rust compile un module à la fois, plutôt qu'un fichier à la fois comme en C++, donc Rust doit regarder plus de code après chaque petit changement.
Optimiser la compilation de Rust
Dans le passé, Matthew Glazar aurait réussi à améliorer les temps de construction du C++ en passant au linker Mold. Voyons cela avec son projet Rust :
Linux : les performances des éditeurs de liens sont à peu près les mêmes, c'est mieux plus bas
« Dommage ; l'amélioration, si elle existe, est à peine perceptible », conclu Matthew Glazar. C'était Linux. macOS a aussi des alternatives à l'éditeur de liens par défaut : lld et zld.
macOS : les performances des éditeurs de liens sont à peu près les mêmes
Sur macOS, Matthew Glazar ne voit également que peu ou pas d'amélioration en changeant l'éditeur de liens par défaut. « Je pense que les éditeurs de liens par défaut sur Linux et macOS font un travail suffisant pour mon petit projet. Les linkers optimisés (Mold, lld, zld) brillent pour les gros projets », dit-il.
Agencement des espaces de travail et des tests
Rust et Cargo ont une certaine flexibilité dans la façon de placer les fichiers sur le disque. Pour ce projet, il y a trois dispositions raisonnables :
Disposant d'un processeur à 32 threads sur sa machine Linux, et d'un processeur à 10 threads sur sa machine macOS, Matthew Glazar s'attend à ce que le déblocage de la parallélisation réduise les temps de construction. Pour un module donné, il y a aussi plusieurs endroits pour vos tests dans un projet Rust :
Optimisation de la compilation C++
Comme dans le cas de Rust, Matthew Glazar fait savoir qu’il a de l’expérience sur la compilation de C++. « Lorsque j'ai travaillé sur le projet C++ original, quick-lint-js, j'ai déjà optimisé les temps de compilation en utilisant des techniques courantes, comme l'utilisation de PCH, la désactivation des exceptions et de RTTI, la modification des tags de compilation, la suppression des #includeS inutiles, le transfert du code hors des en-têtes et l'externalisation des instanciations de template. »
Selon Glazar, GCC est clairement hors norme sur Linux. Clang s'en sort beaucoup mieux. « Mon Clang personnalisé (qui est construit avec PGO et BOLT, comme ma chaîne d'outils Rust personnalisée) améliore vraiment les temps de construction par rapport au Clang d'Ubuntu. libstdc++ se construit légèrement plus vite en moyenne que libc++ », écrit-il.
Utilisation de Clang personnalisée avec libstdc++ dans la comparaison C++ vs Rust.
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é.
Rust
Avec Rust, il est possible de développer des pilotes de périphériques, des systèmes embarqués, des systèmes d'exploitation, des jeux, des applications web, et bien d'autres choses encore. Des centaines d'entreprises dans le monde entier utilisent Rust en production pour des solutions multiplateformes et économes en ressources. Des logiciels connus et appréciés, comme Firefox, Dropbox, et Cloudflare, utilisent ce langage. De la startup à la multinationale, du système embarqué au service web à haute disponibilité, Rust est une excellente solution.
« Mon meilleur compliment envers Rust est qu'il est ennuyeux, et c'est un fantastique compliment », déclare Chris Dickinson, Ingénieur chez npm Inc. Pour Antonio Verardi, Ingénieur infrastructure chez Yelp, les développeurs disposent de tous les outils pour réussir à écrire du code en Rust. La documentation, l’outillage et la communauté sont tous simplement fantastiques.
Temps de construction C++ vs Rust
C++ ou Rust ? Lequel des deux compile le plus rapidement ?
« J'ai porté le projet C++ vers Rust et optimisé les temps de compilation Rust autant que possible », indique Matthew Glazar.
A l’issue de son expérience, Matthew Glazar constate :
- Le portage Rust avait plus de lignes que la version C++, pas moins ;
- Pour les builds complets, comparés à Rust, les builds C++ ont pris à peu près le même temps (17k SLOC) ou ont pris moins de temps (100k+ SLOC), pas plus ;
- Pour les constructions incrémentales, par rapport à C++, les constructions Rust étaient parfois plus courtes et parfois plus longues (17k SLOC) ou beaucoup plus longues (100k+ SLOC), mais pas toujours plus longues.
Le SLOC (Source lines of code), également connu sous le nom de lignes de code (LOC), est une métrique logicielle utilisée pour mesurer la taille d'un programme informatique en comptant le nombre de lignes dans le texte du code source du programme. Le SLOC est généralement utilisé pour prévoir l'effort nécessaire au développement d'un programme, ainsi que pour estimer la productivité ou la maintenabilité du programme une fois le logiciel produit.
« Au cours du processus de portage, j'ai appris à aimer certains aspects de Rust. Par exemple, les proc macros me permettent de remplacer trois générateurs de code différents, ce qui simplifie le pipeline de compilation et facilite la vie des nouveaux contributeurs. Les fichiers d'en-tête ne me manquent pas du tout. Et j'apprécie les outils de Rust (en particulier Cargo, rustup et miri). »
Les temps de compilation sont-ils un problème avec Rust ? Oui selon Matthew Glazar. « Il existe quelques trucs et astuces pour accélérer les compilations, mais je n'ai pas trouvé les améliorations magiques de l'ordre de grandeur qui me rendraient heureux de développer en Rust », dit-il. Les temps de compilation sont-ils aussi mauvais avec Rust qu'avec C++ ? Oui selon Matthew Glazar. « Pour les projets plus importants, les temps de compilation du développement sont pires avec Rust qu'avec C++, du moins avec mon style de code », précise-t-il.
Au-delà de l’analyse de Matthew Glazar, beaucoup s’accordent à reconnaître que les deux langages de programmation ont leurs propres avantages et inconvénients. Par exemple, comme dit précédemment, le C++ bénéficie d'un énorme soutien de la part de la communauté et de nombreux cadres de travail pour le développement de logiciels, alors que Rust ne bénéficie pas d'un tel soutien par rapport au C++. D'un autre côté, il se dit que Rust est bien meilleur dans plusieurs aspects, comme la sécurité de la mémoire, la concurrence et il permet de réfléchir plus attentivement à l'utilisation de la mémoire et des pointeurs.
De nombreux utilisateurs Rust affirment que la programmation dans ce langage est plus facile grâce à une sémantique bien définie et à la prévention des comportements indésirables. En C++, les développeurs auraient plus de problèmes lorsqu'ils essaient d'éviter les comportements non définis. En outre, le C++ est un océan profond comparé à Rust, car le C++ possède tellement de fonctionnalités et de possibilités d'implémentation qu'il peut devenir difficile d'en garder la trace.
Au final, tout dépend si vous êtes à l'aise avec C++ ou Rust.
Source : A practical comparison of build by Matthew Glazar
Et vous ?
Les conclusions de Matthew Glazar sont-elles pertinentes ?
Selon vous, quel langage compile le plus rapidement ? C++ ou Rust ?
Rust remplacera-t-il C++ à l'avenir ?
Voir aussi :
Linus Torvalds souligne une bonne avancée du langage Rust dans le développement du noyau Linux, et aurait qualifié le C++ de « langage de m... », après le message de Google
Microsoft, Google, AWS, Huawei et Mozilla s'associent pour créer la Fondation Rust, une organisation à but non lucratif chargée de gérer le langage de programmation
C++ est sacré langage de programmation de 2022 sur l'indice TIOBE. En termes de popularité, sur l'année écoulée, il est suivi respectivement par C et Python
Partager