4 points par GN⁺ 2024-09-07 | 1 commentaires | Partager sur WhatsApp

Rust

  • Rust est un langage très apprécié, rapide et doté d’une excellente communauté
  • Rust résout les problèmes de gestion mémoire en introduisant le concept de propriété
  • Il fournit des utilitaires comme Rc, Arc et Cow pour prendre en charge le comptage de références et le « clone-on-write »
  • Lorsqu’un travail de plus bas niveau est nécessaire, on peut utiliser le système unsafe pour accéder à des pointeurs C bruts
  • Rust possède plusieurs caractéristiques des langages fonctionnels, comme les énumérations taguées, les expressions de correspondance, les fonctions de première classe et un système de types puissant
  • Grâce à un compilateur basé sur LLVM, il peut être compilé en code natif et en WASM

Swift

  • J’utilise aussi Swift depuis plusieurs années, et en apprenant Rust, j’ai découvert des similitudes avec Swift
  • Swift possède lui aussi des caractéristiques des langages fonctionnels, comme les énumérations taguées, les expressions de correspondance et les fonctions de première classe
  • Swift utilise par défaut des types valeur et une sémantique de « copy-on-write »
  • Lorsqu’on a besoin de meilleures performances, on peut choisir le système de propriété pour « déplacer » les valeurs
  • Lorsqu’un travail de plus bas niveau est nécessaire, on peut utiliser le système unsafe pour accéder à des pointeurs C bruts
  • Swift utilise lui aussi un compilateur basé sur LLVM et peut être compilé en code natif et en WASM

Déjà-vu ?

  • Swift et Rust disposent d’ensembles de fonctionnalités très similaires
  • La grande différence réside dans la perspective
  • Cette différence devient claire quand on considère leur modèle mémoire de base

Rust descend du bas vers le haut, Swift du haut vers le bas

  • Rust part d’un langage système de bas niveau et fournit des outils pour remonter vers un niveau plus élevé
  • Swift part d’un langage de haut niveau et fournit des outils pour descendre vers le bas niveau
  • Le modèle de gestion mémoire en est l’exemple le plus évident
  • Swift utilise par défaut des types valeur et une sémantique de « copy-on-write »
  • Rust facilite l’usage des valeurs « moved » et « borrowed », mais utiliser des valeurs Cow demande un travail supplémentaire
  • Swift facilite l’usage des valeurs en « copy-on-write », mais demande en contrepartie un travail supplémentaire lorsqu’on utilise l’emprunt et le déplacement
  • Rust est plus rapide par défaut, tandis que Swift est plus simple et plus facile par défaut

Swift cache les idées de Rust derrière une syntaxe proche du C

  • La syntaxe de Swift dissimule des concepts issus des langages fonctionnels derrière une syntaxe proche du C, ce qui les rend plus faciles à adopter pour les développeurs
  • Comparaison entre l’instruction match de Rust et l’instruction switch de Swift
  • L’instruction switch de Swift est en réalité identique à une expression match, mais avec un autre nom et une autre syntaxe
  • Swift permet aussi d’ajouter directement des méthodes à un enum

Types optionnels

  • Rust n’a pas de null, mais il a None
  • Swift a nil, mais en réalité c’est la même chose que None
  • Swift utilise T? à la place de Option, et le compilateur impose de vérifier que la valeur n’est pas nil
  • En Swift, les types optionnels sont faciles à utiliser

Gestion des erreurs

  • Rust n’a pas de try-catch, mais utilise le type Result
  • Swift utilise do-catch au lieu de try-catch, et il faut placer try avant l’appel de fonction
  • La gestion des erreurs de Swift ressemble à celle de Rust, mais elle est cachée derrière une syntaxe plus familière

Le compilateur de Rust détecte les problèmes, celui de Swift en résout certains

  • Le compilateur de Rust détecte de nombreux problèmes courants à la compilation et propose des solutions
  • Exemple d’énumération auto-référentielle
  • Swift utilise le mot-clé indirect pour signaler les types récursifs, et le compilateur se charge du reste

Swift est moins « pur »

  • Swift a été conçu pour remplacer Objective-C et devait pouvoir interagir avec le code existant
  • Swift a fait de nombreux choix pragmatiques et c’est un langage plus vaste que Rust
  • Swift a été conçu avec l’idée de « divulgation progressive », de sorte que plus on apprend le langage, plus de fonctionnalités se révèlent
  • Quelques fonctionnalités du langage Swift :
    • classes / héritage
    • async-await
    • async-sequences
    • actors
    • getter et setter
    • propriétés lazy
    • property wrappers
    • Result Builders (par ex. HTML / SwiftUI)

Le prix de la praticité

  • Swift est un langage plus facile pour démarrer et gagner en productivité
  • Sa syntaxe est plus familière et de nombreuses tâches sont gérées automatiquement
  • Swift est un langage de plus haut niveau, ce qui implique les mêmes compromis
  • Par défaut, un programme Rust est bien plus rapide qu’un programme Swift
  • Rust est rapide par défaut et permet de devenir lent, tandis que Swift est facile par défaut et permet de devenir rapide
  • Les deux langages ont chacun leurs usages
    • Rust convient mieux à la programmation système et embarquée
    • Swift convient mieux à l’écriture d’interfaces utilisateur et de serveurs
  • Avec le temps, on peut s’attendre à ce que la zone de recouvrement entre les deux langages s’élargisse

Résumé GN⁺

  • Cet article compare et explique les similitudes et les différences entre Swift et Rust
  • Swift reprend de nombreuses idées de Rust et les propose avec une syntaxe plus familière
  • Les deux langages ont chacun leurs points forts et leurs usages, et l’on peut s’attendre à davantage de recoupements avec le temps
  • Il aide à comprendre les différences entre Swift et Rust sous divers angles, comme le modèle de gestion mémoire, la gestion des erreurs et les types optionnels
  • Parmi les langages aux fonctionnalités proches, on peut citer Kotlin et TypeScript

1 commentaires

 
GN⁺ 2024-09-07
Avis Hacker News
  • Les personnes qui découvrent Rust l’aiment souvent parce qu’elles découvrent aussi pour la première fois les langages de la famille ML

    • Rust offre une communauté familière aux hackers Unix
  • Rust est le premier langage à avoir popularisé la gestion automatique de la mémoire sans GC

    • Il existe aussi des alternatives comme Swift, OCaml et Scala
  • L’ère de Smalltalk est terminée, c’est désormais l’ère de ML

    • Les langages des années 2000 dérivaient de Smalltalk
    • Les nouveaux langages appartiennent à la famille ML
    • Si l’on apprend Scala, il devient aussi facile d’apprendre Rust ou Swift
  • En travaillant sur l’intégration de Rust dans une app iOS en Swift, j’ai eu envie d’utiliser davantage Swift

    • Swift peut être utilisé en cross-platform, mais vise surtout les plateformes Apple
    • Rust dispose de plusieurs systèmes de paquets
    • Les paquets Swift dépendent souvent des API de l’OS, donc ne fonctionnent pas sous Linux ou WASM
    • Il y a eu le cas d’IBM qui a abandonné Swift côté serveur
  • Rust a introduit le concept de propriété pour résoudre les problèmes de gestion mémoire, mais ne l’a pas inventé

    • Des langages comme Cyclone l’ont influencé
  • Rust et Swift ont chacun leurs points forts

    • Swift a une syntaxe plus concise, mais certaines parties sont réservées au compilateur
    • En dehors de l’écosystème Apple, Swift n’est que le deuxième ou troisième langage le plus important
    • Si ce problème n’est pas résolu, Swift restera probablement surtout un langage réservé à Apple
  • Les outils de Swift sont moins pratiques que ceux de Rust

    • Xcode n’est pas pris en charge sur un MacBook Air 2018 utilisant macOS 12
    • SourceKit-LSP est traité comme un outil de second rang
    • Rust 1.81 et rust-analyzer fonctionnent bien
  • J’ai essayé d’apprendre Rust, mais j’ai eu du mal parce que les exemples sont trop complexes

    • Le code d’exemple sur le site de Rust est compliqué
  • Swift permet d’ajouter directement des méthodes aux énumérations

    • On peut faire la même chose en Rust
  • Swift utilise par défaut des types valeur, avec une sémantique de copy-on-write

    • Cela ne s’applique qu’aux tableaux, dictionnaires et chaînes de caractères
    • Les types valeur de Swift sont copiés immédiatement
  • Chaque fois que je lis un article qui fait l’éloge de Swift, je me demande quelle est l’expérience des développeurs qui n’utilisent pas l’écosystème Apple/macOS

    • Je n’ai jamais rencontré de développeur Swift qui n’utilise pas macOS
    • Non seulement la bibliothèque standard, mais aussi les outils, le LSP, les bibliothèques et les tutoriels sont importants
    • Je veux bien croire que Swift est un bon langage, mais il semble surtout bon sur macOS
  • Je me demande si je suis le seul à ne pas aimer la syntaxe à point de Zig et Swift

    • .variant vs Type::Variant
    • Dans un code suffisamment long ou complexe, c’est gênant si le nom du type n’est pas à proximité
    • C’est encore plus vrai dans un éditeur sans fonctionnalités de type IDE