recherche
Maisondéveloppement back-endGolangJ'ai essayé tous les langages de programmation populaires

Dans cet article, je vais tenter de comparer GoLang, Zig et Rust. Et pourquoi Rust gagne cette comparaison (pour moi).

L’heure du conte !

J'ai écrit 3 de mes projets en GoLang, Zig & Rust. Ces projets sont suffisamment importants pour avoir une bonne idée des fondamentaux du langage, de ses lacunes et s'il y a un problème avec le langage, le framework ou l'écosystème.

CONSEIL : n'hésitez pas à accéder à la section TLDR pour obtenir la foutue réponse.

GoLang

J'ai commencé à créer des outils de développement il y a quelques mois, d'abord avec GoLang.

Le premier était un utilitaire de base de gestion et de migration de bases de données (dbdaddy) et j'ai vraiment eu beaucoup de plaisir à travailler avec GoLang.

Même s'il s'agissait de ma toute première tentative avec GoLang pour créer quelque chose de plus sérieux que Advent Of Code et les problèmes de défi d'un milliard de lignes, J'ai été surpris qu'il m'ait fallu moins d'une semaine pour maîtriser ce domaine .

Zig

Pendant ce temps-là, je barbotais avec Zig à côté (rien de bien grave). J'ai entendu dire que Redis avait changé sa licence en une licence « techniquement non open source ».

Et je me suis dit : à quel point cela peut-il être difficile de créer un nouveau Redis open source en zig ?

I Tried Every Hot Programming Language

Avance rapide 2 mois plus tard : merde.

L'idée de base derrière "GbCache" était un cache en mémoire basé sur LRU, mais la véritable source de vérité devait être enregistrée sur le disque avec des fonctionnalités telles que les notifications pour les changements de clé/valeur spécifiques provoqués et évidemment les TTL attribués aux clés.

Il est impressionnant de voir à quel point Zig est explicite, ce qui le rend d'autant plus simple et plus facile à utiliser.

J'ai démarré GbCache dans la perspective de « s'il devait passer à HyperScale™ demain, pourra-t-il gérer la charge ? »

Cette perspective m'a conduit à exclure GoLang car si je suis incapable de raisonner avec une extrême certitude sur les allocations de mémoire, je n'aurai pas un contrôle total sur la vitesse.

Faire les choses dans cette perspective est une très bonne expérience d'apprentissage car tout à coup, vous commencez à voir tous les points de votre programme qui pourraient exploser, manquer de mémoire ou devenir un goulot d'étranglement -les chemins chauds de votre code.

Grâce au caractère explicite de Zig, j'étais sûr de exactement où et quand j'allouais de la mémoire.

Mais... Zig n'est PAS un langage sans danger pour la mémoire en fin de compte et je suis un gars avec des problèmes de compétences de la taille de l'Everest.

entre dans la rouille

Au cours des 2 dernières années, j'ai essayé d'arrêter avec rage sur Rust 3 fois. Venant d'un environnement JavaScript où nous avons un milliard de Go de RAM dans nos macbook m69 max, je n'ai jamais vraiment compris pourquoi Rust avait ces règles, et se lancer dans le battage médiatique était probablement un mauvais angle de vue. .

Même si j'ai arrêté de fumer à plusieurs reprises, Rust était toujours dans un coin de mon esprit, avec sa syntaxe étrange, ses règles de mémoire frustrantes et ses durées de vie ahurissantes.

Mais quelque chose m'a frappé en écrivant Zig... Je gardais déjà une trace de toutes ces règles de mémoire et de toutes ces vies mais comme une surcharge mentale.

J'ai commencé à remarquer des modèles et des passe-partout dans mon code Zig en essayant de faire ce que Rust fait déjà.

Rouiller

Lors de la création du client CLI pour SFS (nom SFW - "Simple File Storage"), j'ai décidé de réessayer Rust.

Cette fois-ci, en parcourant le livre de rouille, j'ai commencé à ressentir le « pourquoi » de tout cela.

La chose la plus fondamentale que j'aime chez Rust est le modèle mental de la mémoire basé sur la propriété et l'emprunt.

Même si ce modèle de mémoire détenue et référencée est imaginaire, il s'agit d'un modèle mental pratique sur lequel raisonner et qui entraîne moins de surcharge au-dessus de ma tête.

Contrairement au modèle de mémoire mentale classique que des langages comme C & Zig infligent à votre tête. Devez-vous suivre les allocations de mémoire individuelles et leur durée de vie dans ma tête ? non merci !

TLDR

GoLang

  • RAPIDE (comme si vos 5 MAU en auraient besoin lmao)
  • fiable
  • stupide et simple, le langage ne s'interpose jamais entre vous et votre objectif
  • grand écosystème de forfaits

Zig

  • ULTRA RAPIDE
  • stupide simple

Rouiller

  • ULTRA RAPIDE
  • fiable
  • grand écosystème de forfaits

Tous

  • gestion incroyable des erreurs

Si vous êtes un ingénieur back-end normal au quotidien et que vous aimez faire des calculs sur leurs performances de sprint, votre meilleur choix est probablement GoLang.

"mais mon entreprise n'utilise pas GoLa—"
"quittez l'entreprise, quittez-la, utilisez le bon travail pour l'outil. quittez l'entreprise."

Pour moi, GoLang est comme un mariage arrangé où vous ne ressentez cette précipitation dans votre cœur mais il ne vous laisse jamais tomber, c'est votre compagnon de route ou de mort et vous pouvez parier toute votre vie dessus ça.

Mais mon ami, si vous cherchez ce rush, continuez à lire !

Puran de rouille

bu— mais je veux cette précipitation... je veux sentir mon cœur exploser en jetant un simple coup d'œil à leur syntaxe oculaire... je veux avoir l'impression d'être au paradis quand je suis avec eux et dans bon sang quand je ne le suis pas...

I Tried Every Hot Programming Language

Jetons un coup d'œil rapide à un exemple de sécurité multithread dans Rust.

use std::thread;

fn main() {
    let mut counter = Box::new(0); // 32-bit integer allocated on the heap
    let mut handles = vec![];

    for _ in 0..10 {
        let handle = thread::spawn(|| {
            *counter += 1; // trying to edit the value
        });
        handles.push(handle);
    }

    for handle in handles {
        handle.join().unwrap(); // WAITING FOR ALL THE THREADS TO COMPLETE
    }

    println!("Result: {}", *counter);
}

Nous avons une valeur allouée au tas et 10 threads tentent de la modifier indépendamment.

Ce code accède de manière dangereuse à la variable compteur car tous les threads tenteront de modifier le compteur simultanément.

Dans d'autres langages, un code similaire sera volontiers compilé et exécuté.

Si vous avez déjà travaillé dans un environnement multithread, votre première pensée pourrait être d'utiliser un "mutex" pour éviter les conditions de concurrence lors de la mise à jour de la variable compteur.

Mais il est facile de manquer de petites choses comme celle-ci dans une grande base de code à cause d'une erreur humaine.

Rust ne laissera même pas ce programme se compiler.

En raison des règles de propriété et d'emprunt, le compilateur détectera que vous empruntez un compteur de manière mutable dans le premier thread de la première itération de la boucle for... ok jusqu'à maintenant... la deuxième itération veut aussi emprunter de manière mutable en parallèle ? dangereux ! déclenche une ERREUR DE TEMPS DE COMPILATION!!.

Référencer ou « emprunter » une valeur à son propriétaire avec l'intention de muter/modifier est appelé un « emprunt mutable »

use std::thread;

fn main() {
    let mut counter = Box::new(0); // 32-bit integer allocated on the heap
    let mut handles = vec![];

    for _ in 0..10 {
        let handle = thread::spawn(|| {
            *counter += 1; // trying to edit the value
        });
        handles.push(handle);
    }

    for handle in handles {
        handle.join().unwrap(); // WAITING FOR ALL THE THREADS TO COMPLETE
    }

    println!("Result: {}", *counter);
}

Dans des situations comme celles-ci, les autres langues ne vous donnent aucune erreur. Il est de votre responsabilité d'inspecter l'exactitude, Rust l'empêche.

Des constructions comme celles-ci réparties dans toute la langue vous aident à ne pas vous tirer une balle dans le pied (souvent).

Conclusion

ÇA DÉPEND !

J'aurais vraiment aimé qu'il y ait un langage qui soit la réponse et même si GoLang s'en rapproche assez, cela dépend vraiment de votre cas d'utilisation et, surtout, de votre équipe.

pour moi, Rust est un plaisir de travailler avec (pour l'instant, qui sait... hehe)

les gens de TigerBeetle ont tenté leur chance avec Zig et ils en sont satisfaits.

Primeagen est plus heureux avec Zig.

pour Jarred Sumner, Zig c'est bien, il a écrit Bun en Zig.

Mitchell Hashimoto (le gars derrière HashiCorp) écrit ghostty dans Zig, un terme BLAZING FAST—

.
.
.

attends...

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!

Déclaration
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Golang en action: Exemples et applications du monde réelGolang en action: Exemples et applications du monde réelApr 12, 2025 am 12:11 AM

Golang excelle dans les applications pratiques et est connu pour sa simplicité, son efficacité et sa concurrence. 1) La programmation simultanée est implémentée via des goroutines et des canaux, 2) le code flexible est écrit à l'aide d'interfaces et de polymorphismes, 3) Simplifier la programmation réseau avec des packages Net / HTTP, 4) Construire des robots concurrents efficaces, 5) Déboggage et optimisation par le biais d'outils et de meilleures pratiques.

Golang: le langage de programmation Go expliquéGolang: le langage de programmation Go expliquéApr 10, 2025 am 11:18 AM

Les caractéristiques principales de GO incluent la collection de déchets, la liaison statique et le support de concurrence. 1. Le modèle de concurrence du langage GO réalise une programmation concurrente efficace via le goroutine et le canal. 2. Les interfaces et les polymorphismes sont implémentés via des méthodes d'interface, de sorte que différents types peuvent être traités de manière unifiée. 3. L'utilisation de base démontre l'efficacité de la définition et de l'appel des fonctions. 4. Dans une utilisation avancée, les tranches offrent des fonctions puissantes de redimensionnement dynamique. 5. Des erreurs courantes telles que les conditions de course peuvent être détectées et résolues par l'imagerie. 6. Optimisation des performances Réutiliser les objets via Sync.Pool pour réduire la pression de collecte des ordures.

Objectif de Golang: Construire des systèmes efficaces et évolutifsObjectif de Golang: Construire des systèmes efficaces et évolutifsApr 09, 2025 pm 05:17 PM

GO Language fonctionne bien dans la construction de systèmes efficaces et évolutifs. Ses avantages incluent: 1. Haute performance: compilé en code machine, vitesse de course rapide; 2. Programmation simultanée: simplifier le multitâche via les goroutines et les canaux; 3. Simplicité: syntaxe concise, réduction des coûts d'apprentissage et de maintenance; 4. Plate-forme multipliée: prend en charge la compilation multiplateforme, déploiement facile.

Pourquoi les résultats d'ordre par des déclarations dans le tri SQL semblent-ils parfois aléatoires?Pourquoi les résultats d'ordre par des déclarations dans le tri SQL semblent-ils parfois aléatoires?Apr 02, 2025 pm 05:24 PM

Confus quant au tri des résultats de la requête SQL. Dans le processus d'apprentissage de SQL, vous rencontrez souvent des problèmes déroutants. Récemment, l'auteur lit "Mick-SQL Basics" ...

La convergence de la pile technologique est-elle juste un processus de sélection de la pile technologique?La convergence de la pile technologique est-elle juste un processus de sélection de la pile technologique?Apr 02, 2025 pm 05:21 PM

La relation entre la convergence des piles technologiques et la sélection de la technologie dans le développement de logiciels, la sélection et la gestion des piles technologiques sont un problème très critique. Récemment, certains lecteurs ont proposé ...

Comment utiliser la comparaison de la réflexion et gérer les différences entre trois structures en Go?Comment utiliser la comparaison de la réflexion et gérer les différences entre trois structures en Go?Apr 02, 2025 pm 05:15 PM

Comment comparer et gérer trois structures en langue go. Dans la programmation GO, il est parfois nécessaire de comparer les différences entre deux structures et d'appliquer ces différences au ...

Comment afficher les packages installés à l'échelle mondiale dans Go?Comment afficher les packages installés à l'échelle mondiale dans Go?Apr 02, 2025 pm 05:12 PM

Comment afficher les packages installés à l'échelle mondiale dans Go? En train de se développer avec le langage Go, GO utilise souvent ...

See all articles

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
3 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Version Mac de WebStorm

Version Mac de WebStorm

Outils de développement JavaScript utiles

Dreamweaver Mac

Dreamweaver Mac

Outils de développement Web visuel

PhpStorm version Mac

PhpStorm version Mac

Le dernier (2018.2.1) outil de développement intégré PHP professionnel

MantisBT

MantisBT

Mantis est un outil Web de suivi des défauts facile à déployer, conçu pour faciliter le suivi des défauts des produits. Cela nécessite PHP, MySQL et un serveur Web. Découvrez nos services de démonstration et d'hébergement.

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP