- Rust et Swift partagent tous deux un système de types puissant et des caractéristiques des langages fonctionnels, et peuvent être compilés en code natif et en WASM via un compilateur basé sur LLVM
- Rust a commencé comme un langage système de bas niveau avant d’offrir des fonctionnalités de haut niveau, tandis que Swift a commencé comme un langage de haut niveau tout en autorisant l’accès au bas niveau
- Swift repose par défaut sur les types valeur et le Copy-on-Write, et met en œuvre des concepts similaires au modèle de propriété de Rust avec une syntaxe plus simple
- Pour les types optionnels, la gestion des erreurs, les enum récursifs, etc., Swift enveloppe des concepts de Rust dans une syntaxe familière de la famille du C, offrant davantage de confort aux développeurs
- Swift est en train de devenir un langage cross-platform et peut aussi être utilisé sous Windows, Linux et dans des environnements embarqués, ce qui en fait une alternative montante à Rust
Similarités et différences entre Rust et Swift
- Les deux langages incluent des caractéristiques des langages fonctionnels (enum tagués, expressions match/switch, génériques, fonctions de première classe)
- Rust fournit le comptage de références et le contrôle de la copie via
Rc,Arc,Cow - Swift utilise par défaut les types valeur et le Copy-on-Write, et prend aussi en charge si nécessaire le déplacement de propriété (move) et l’accès via des pointeurs unsafe
- Rust fournit le comptage de références et le contrôle de la copie via
- Les deux langages utilisent un compilateur basé sur LLVM, ce qui permet de compiler en code natif et en WASM
Modèle mémoire : Rust descend du bas vers le haut, Swift monte du haut vers le bas
- Rust a commencé comme un langage système de bas niveau avant d’ajouter des fonctionnalités de haut niveau
- Swift a commencé comme un langage de haut niveau tout en permettant un accès bas niveau quand c’est nécessaire
- Le modèle mémoire par défaut de Swift repose sur des types valeur en Copy-on-Write, similaires au
Cow<>de Rust- Rust est rapide par défaut, mais il faut gérer explicitement
Cow<>lorsqu’on l’utilise - Swift est simple par défaut, et permet de choisir le déplacement plutôt que la copie
- Rust est rapide par défaut, mais il faut gérer explicitement
L’approche syntaxique de Swift : des concepts de Rust masqués par un style C
- L’instruction
switchde Swift assure en pratique les mêmes fonctions que l’expressionmatchde Rust- Elle prend en charge le pattern matching et n’a pas de
fallthrough
- Elle prend en charge le pattern matching et n’a pas de
- Les
enumde Swift peuvent inclure directement des méthodes, ce qui permet un usage plus orienté objet que dans Rust - Les types optionnels (
T?) reposent sur le même concept queOption<T>en Rust, etnilcorrespond àNone- En Swift, le déballage sûr est possible avec la syntaxe
if let val
- En Swift, le déballage sûr est possible avec la syntaxe
- La gestion des erreurs ressemble au type
Resultde Rust, etdo-catchainsi quetryen Swift sont la même structure enveloppée dans une syntaxe plus familière
Différences dans le fonctionnement du compilateur
- Le compilateur Rust met l’accent sur la détection des problèmes et les avertissements et, par exemple, impose l’usage de
Box<>lors de la définition d’un enum récursif - Swift gère les enum récursifs avec le seul mot-clé
indirect, le compilateur automatisant la gestion interne des pointeurs - Swift automatise davantage de traitements que Rust, ce qui réduit le besoin pour les développeurs de manipuler directement la structure mémoire
Praticité et extensibilité du langage Swift
- Swift a été conçu pour remplacer Objective-C, avec l’ambition d’être un langage plus vaste et plus pratique
- Il intègre de nombreuses fonctionnalités comme classes/héritage, async-await, actors, propriétés lazy, property wrappers, Result Builders, etc.
- Sa conception de « progressive disclosure » fait apparaître davantage de fonctionnalités au fur et à mesure de l’apprentissage
Équilibre entre confort et performance
- Swift est un langage facile à prendre en main et productif, tandis que Rust est un langage rapide par défaut
- Rust : « la vitesse par défaut » ; Swift : « le confort par défaut »
- Rust est adapté aux systèmes, à l’embarqué, aux compilateurs et aux moteurs de navigateur
- Swift convient aux UI, aux serveurs et à certains composants de systèmes d’exploitation, et les domaines d’usage des deux langages se recoupent de plus en plus
L’expansion cross-platform de Swift
- Swift n’est plus un langage réservé à Apple
- Windows : The Browser Company l’utilise pour le partage de code du navigateur Arc
- Linux : Apple prend en charge Swift on Server et sponsorise des conférences
- Embedded Swift : utilisé sur de petits appareils comme le Panic Playdate
- Le blog officiel de Swift présente des projets Windows, Embedded, Linux(Gnome), Playdate
- Swift améliore aussi l’expérience de développement hors de Xcode avec une extension VSCode, l’open source de son LSP, etc.
Limites de Swift et position actuelle
- Le temps de compilation est lent, comme pour Rust
- Le feature creep a fait grossir le langage, et certaines syntaxes restent peu familières
- L’écosystème de packages est moins mature que celui de Rust
- Mais Swift dispose déjà de la stabilité ABI, du comptage automatique des références (ARC), de mécanismes de choix de propriété, et de packages compatibles Linux, ce qui en fait un langage cross-platform
- Swift s’impose comme une alternative plus pratique à Rust, non pas comme une promesse pour l’avenir, mais comme une option disponible dès aujourd’hui
1 commentaires
Réactions sur Hacker News
Je suis globalement d’accord, mais c’est dans les détails que le vrai problème apparaît
Xcode est un IDE assez brut de décoffrage qui se fige souvent sur les gros projets lors du rafraîchissement des paquets ou de la gestion de multiples targets. Et même si on veut corriger ça, les binaires ne peuvent pas être patchés
Le système de build est bien plus simple à manier avec Cargo qu’avec SPM. Le système de macros dépend toujours de génération de code externe
Il existe des linters et des formatters, mais leur qualité est faible. Swift a beaucoup de falaises de performance, et son inférence de types bidirectionnelle devient lente sur les expressions complexes. C’est particulièrement visible dans des cas d’usage majeurs comme SwiftUI
Les imports sont liés au niveau du module, donc même si on ne modifie qu’un seul fichier, il faut recompiler tout le module. La distinction entre classes et structures est aussi maladroite à cause de la compatibilité ObjC
Au final, Swift pourrait être un langage plus simple que Rust, mais en pratique je n’en ai pas l’impression à cause de l’immaturité de son outillage
Le modèle mémoire semi-automatique de Swift me semble bien plus difficile à maîtriser que celui de Rust ou de Go
swift, ça fonctionne très bien. Ça marche aussi bien sous Linux que sous WindowsIl était dit qu’en Rust il faut un
Boxpour représenter une structure d’arbre avec un enum, mais en réalitéVecfournit déjà une référence vers le tas, donc ce n’est pas nécessaireEn Rust, les enum, struct, union, et même les types primitifs peuvent tous avoir des méthodes. On peut par exemple appeler
'F'.to_digit(16)On peut même attacher des méthodes à des raw pointers. Je trouve que ça illustre bien la modernité de la conception de Rust
VecetBox.Vecest un handle de taille fixe à la compilation, tandis queBoxest nécessaire pour manipuler des types non dimensionnésBoxVec<T>est lui-même un handle de taille fixe pointant vers des données sur le tas, donc il n’y a pas besoin deBoxSwift est un langage sympa, mais il est peu convaincant côté serveur
L’écosystème est petit, et il n’apporte pas grand-chose par rapport à Go ou Rust. Le support VSCode est limité, et je n’ai pas envie d’utiliser Xcode
Le développement serveur est déjà occupé par Python, TypeScript, Go et Rust. L’écosystème fermé d’Apple est aussi un frein
Je trouve que la qualité de l’IDE est meilleure que dans d’autres langages, mais Rust reste plus adapté à la programmation système
On dit maintenant que Swift est un langage cross-platform, mais sous Linux l’écosystème reste centré sur Apple
La documentation, les tutoriels et les bibliothèques sont tous écrits avec macOS comme référence. Je me demande vraiment combien de gens utilisent Swift sans appareil Apple
J’ai résumé cette expérience de création d’un client WebSocket dans un billet de blog
Version 2023 / Version 2025
Le support Android est intéressant aussi, mais Kotlin me semble déjà suffisant
De mon côté, je maintiens même des bibliothèques compatibles jusqu’à Windows. Ce n’est pas parfait, mais ça progresse petit à petit
Le
switchde Swift est en pratique une expression de match. Seule la syntaxe diffère, mais il s’agit bien de pattern matchingswitchafin de réduire la confusion chez les développeursL’idée est d’introduire une nouvelle sémantique à travers une syntaxe familière, pour favoriser une transition progressive
Cette approche mène à une discussion intéressante sur le degré de conception prescriptive qu’un langage devrait assumer
Le cœur de Rust, c’est la zero-cost abstraction. Swift ne suit pas ce principe
Beaucoup de fonctionnalités de Rust ont été conçues pour respecter cette règle, et le modèle de propriété en est un exemple central
Il y a une courbe d’apprentissage, mais cela améliore l’efficacité de développement
On dit que le navigateur Arc a utilisé Swift sur Windows, mais après l’arrêt du développement, il semble que ce travail ait aussi été abandonné
Si je préfère Rust, c’est parce qu’il n’y a pas de dépendance à un grand groupe. Je pense qu’Apple pourrait abandonner Swift
C’est aussi indiqué dans cet article Wikipédia
On peut profiter du confort de Swift dans Rust grâce aux fonctionnalités de comptage de références sans avoir à migrer
Avec
Rc, on peut avoir des références partagées immuables, et avec l’intérieur mutable, on peut implémenter des mutations reposant sur des vérifications à l’exécutionDocumentation sur Rc, documentation sur l’intérieur mutable
J’ai développé des outils d’analyse et des compilateurs pour Linux en Swift et en Rust
Swift rend la gestion mémoire confortable grâce à ARC, tandis que Rust demande plus de réflexion mais offre une bien meilleure qualité d’outillage
Clippy et le support LSP sont excellents, et Swift fournit beaucoup de fonctionnalités par défaut
Cela dit, la communauté Rust est plus grande, donc il est plus facile de recruter, et je pense aussi que Swift a du potentiel comme langage de remplacement du C++