Lire l'article original sur packagemain.tech
Devez-vous rouiller ou devriez-vous partir ? Quelle langue est la meilleure, et cette question a-t-elle un sens ? Parlons de Go contre Rust en 2024, avec notre invité spécial, John Arundel. John est l'auteur de For the Love of Go, Cloud Native DevOps with Kubernetes et de nombreux autres livres. Il enseigne également Go et Rust, il sera donc intéressant d’entendre son point de vue. Voici l’interview !
John, il semble que nous entendons de plus en plus parler de Rust ces jours-ci. Pouvez-vous nous faire une brève introduction ? À quoi sert Rust et pourquoi existe-t-il ?
Bien sûr, c’est facile. Rust est un langage pour contrôler les ascenseurs.
Vous plaisantez ?
Pas du tout. Graydon Hoare, le créateur de Rust, a été frustré lorsque les ascenseurs de son immeuble tombaient en panne à cause de problèmes logiciels. Il s’est dit : « Nous pouvons sûrement faire mieux que ça ! » Et le reste appartient à l'histoire.
Nous ne pouvons pas prévenir tous les bugs, mais nous pouvons au moins utiliser un langage de programmation qui élimine certaines grandes catégories de bugs, tels que les débordements de tampon, les courses de données et les problèmes d'« utilisation après utilisation gratuite ». Ainsi, dès le début, Rust s'est concentré sur la création de logiciels fiables, en automatisant de nombreuses vérifications de sécurité que les bons programmeurs effectuent de toute façon et en aidant à détecter les erreurs avant qu'elles n'atteignent la production.
Cela semble être une bonne idée, mais j'ai l'impression que Rust est un langage difficile à apprendre, surtout comparé à Go. Est-ce juste, et si oui, pourquoi ?
Go et Rust tentent tous deux, de différentes manières, de résoudre le même problème : il est difficile d'écrire des logiciels à grande échelle dans des langages traditionnels comme le C et le C++, car les programmeurs doivent être très expérimentés et compétents pour éviter de commettre des erreurs. Même les experts peuvent faire des erreurs de temps en temps, et il faut beaucoup de temps pour former des programmeurs pour devenir des experts.
Go s'attaque à ce problème en simplifiant radicalement le langage : comparé à quelque chose comme le C++, il a beaucoup moins de syntaxe à apprendre. Ainsi, les programmeurs peuvent passer leur temps à apprendre à bien écrire des programmes, plutôt que de maîtriser un langage volumineux et complexe. Go est simple, mais efficace.
Pour utiliser une analogie, il est plus facile d’apprendre à conduire un tracteur que de piloter un vaisseau spatial. Le tracteur est peut-être une machine humble et pragmatique, mais il fait parfaitement son travail, et c'est en fait un meilleur choix que le vaisseau spatial pour de nombreuses tâches : labourer un champ, par exemple.
J’aime votre analogie. Je suppose que Rust est le vaisseau spatial ?
Oui, Rust est grand, compliqué et puissant, combinant bon nombre des meilleures idées des langages impératifs traditionnels comme C avec des concepts de programmation fonctionnelle empruntés à des langages comme Haskell et Lisp.
Il y a plus à apprendre dans Rust que dans Go, mais il en fait plus ! Si vous souhaitez vous rendre sur Mars, un vaisseau spatial est un meilleur choix qu'un tracteur. Bien sûr, il faut un peu plus de temps pour former un astronaute que pour former un conducteur de tracteur.
Go intègre un système de collecte des déchets, ce qui est idéal pour la simplicité. Comment fonctionne la gestion de la mémoire dans Rust, et est-ce un gros défi à apprendre ?
Oui, le garbage collection signifie que vous n’avez pas à vous soucier de l’allocation et de la libération de mémoire vous-même, comme vous le faites dans des langages comme C++. Cela facilite la programmation et élimine toutes sortes de bugs liés à la mémoire. D'un autre côté, vous avez besoin d'un runtime relativement complexe et le garbage collection affecte les performances.
Rust adopte une approche différente. Il récupère automatiquement la mémoire, mais sans avoir à mettre le programme en pause. Il peut le faire en gardant une trace de toutes les références existantes à une donnée particulière. Lorsqu'aucune partie du programme ne peut plus faire référence aux données, Rust sait qu'un peu de mémoire peut être immédiatement recyclé en toute sécurité.
Oui, j'ai entendu dire que Rust se concentre fortement sur la propriété et l'emprunt. Comment ces concepts se comparent-ils au travail avec des pointeurs dans Go, et quelles sont les bonnes façons de les comprendre ?
Eh bien, j'ai une bonne nouvelle : si vous êtes déjà habitué aux pointeurs dans Go, alors les références dans Rust fonctionnent fondamentalement de la même manière, mais en plus sûr. Si vous créez une référence mutable à une variable, cela fonctionne comme un pointeur Go : vous pouvez la transmettre à une fonction ou la stocker quelque part.
Mais, contrairement à Go, tant que cette référence mutable existe, elle a un accès exclusif aux données : personne d'autre ne peut la modifier, ni même la lire. En termes Go, c’est comme avoir un verrouillage mutex automatique. Et lorsqu'une fonction n'a pas besoin de modifier les données, elle peut à la place emprunter une référence partagée, qui est en lecture seule, et plusieurs d'entre elles peuvent exister en même temps.
Rust garde également une trace des données d'origine : lorsqu'elles sortent du champ d'application, toute référence à celles-ci n'est plus valide. Ainsi, le compilateur peut détecter de nombreux types de bogues de pointeur en suspens lorsque vous essayez d'utiliser une référence à une valeur qui n'existe plus. Cela se traduit par un comportement indéfini, ce qui est une belle façon de dire que quelque chose d’horrible va se produire, et une partie de la proposition de valeur de Rust est « aucun comportement indéfini, jamais ».
Dans Rust, nous devons donc trouver un moyen d'écrire nos programmes de manière à ce que les références aux données soient toujours valides et qu'une seule référence mutable existe à la fois. Il faut un certain temps pour s'y habituer (les programmeurs de Rust appellent cela « combattre le vérificateur d'emprunt »), mais les programmes qui en résultent sont plus fiables et plus susceptibles d'être corrects.
Par exemple, tous les programmeurs Go sont familiers avec les courses aux données, où deux goroutines ou plus tentent d'accéder à certaines données partagées en même temps, avec des résultats imprévisibles : au mieux, le programme plantera, et au pire, il continuera. avec des données corrompues ou invalides.
Dans Rust, un programme comme celui-ci ne se compilera pas ! Les règles de propriété et de référence signifient que deux références mutables à la même chose ne peuvent pas exister simultanément. Il vous suffit de résoudre le problème d'une manière différente.
Cela nous amène parfaitement à la concurrence. J'aime les fonctionnalités de concurrence de Go avec les canaux et les goroutines. Comment Rust gère-t-il la concurrence et existe-t-il des similitudes que je peux tirer de mon expérience Go ?
Oui, les goroutines et les canaux sont géniaux : une abstraction de tâches ultra légère et très bon marché par rapport au multithreading traditionnel. D’un autre côté, Go ne nous donne que les éléments de base : à nous de veiller à les utiliser en toute sécurité, en évitant les courses aux données ou les blocages. Et cela peut être difficile à faire !
Rust n'a pas de goroutines, mais il a des tâches asynchrones, qui ressemblent beaucoup à des goroutines, uniquement avec les garanties de sécurité habituelles de Rust. Il existe également d'excellents frameworks tiers tels que Tokio et Rayon qui peuvent simplement prendre un tas de données et déterminer automatiquement le moyen le plus efficace de les traiter en parallèle.
Ainsi, même si les programmes simultanés seront toujours difficiles à bien écrire, si vous pouvez le faire dans Go, vous constaterez que ces compétences se transfèrent également bien vers Rust.
J'aime apprendre par la pratique. Y a-t-il de bons exercices ou projets pratiques que vous recommanderiez à un programmeur Go qui débute avec Rust, comme le Tour of Go, par exemple ?
Rustlings est un excellent point de départ : il s'agit d'une série d'exercices interactifs en petits morceaux qui vous guident à travers tous les principes fondamentaux du langage. Si vous souhaitez obtenir les commentaires d'un véritable humain, consultez la piste Rust sur Exercism. Il existe également Rust by Exemple, qui est une formidable ressource pour des extraits d’exemples fonctionnels.
On dirait que vous êtes fan des deux langues. Lequel préférez-vous, et recommanderiez-vous à quelqu'un qui connaît déjà Go d'essayer également d'apprendre Rust ?
Oui, Go et Rust font chacun appel à différentes parties de mon cerveau. J'aime la simplicité radicale et le pragmatisme de Go : il fait beaucoup avec très peu et résout plutôt bien la plupart des problèmes.
Rust, en revanche, comble parfaitement les lacunes où Go n'est pas un choix idéal : noyaux, micrologiciels, appareils embarqués et applications critiques pour la sécurité telles que les dispositifs médicaux, l'industrie, l'aérospatiale, etc.
Et les ascenseurs, bien sûr.
Naturellement ! J’aime donc cet aspect de Rust, et c’est aussi un langage vraiment amusant et expressif. Je pense que cela vaut la peine que chacun prenne le temps de jouer avec Rust et de s'y tenir suffisamment longtemps pour surmonter la méconnaissance initiale de la syntaxe et les difficultés avec le vérificateur d'emprunt.
Même si vous décidez que Rust n'est pas pour vous, vous apprendrez de nouvelles façons intéressantes de réfléchir aux problèmes, et cela vous aidera également à mieux comprendre les différents compromis que fait Go.
D'un point de vue professionnel, Go et Rust seront des compétences très précieuses dans un avenir prévisible. Je pense que très bientôt, au lieu de « Go contre Rust », nous parlerons de « Go et Rust contre tout le reste ».
John, merci d'être notre invité et de nous donner votre point de vue sur Go et Rust. Où les gens peuvent-ils en savoir plus sur vous, par exemple s'ils sont intéressés par vos livres ou vos formations ?
C'est avec plaisir ! Visitez mon site Web à l'adresse bitfieldconsulting.com si vous souhaitez en savoir plus ou contactez-nous, je me ferai un plaisir de discuter.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!