Abandon de l’adoption de Swift – fin de l’issue sur le support de Swift 6.0 dans le navigateur Ladybird
(github.com/LadybirdBrowser)- Le projet de navigateur Ladybird a dressé la liste des problèmes rencontrés lors du passage du support de Swift 6.0 du stade expérimental à un statut officiel, mais a ensuite décidé de ne plus poursuivre l’adoption de Swift
- Les principaux obstacles concernaient l’interopérabilité (Interop) entre Swift et C++ : incompatibilités d’ABI, dépendances circulaires entre en-têtes, impossibilité de renvoyer certains types, etc. Plusieurs points ont été corrigés après Swift 6.0.0
- Dans le système de build CMake, des problèmes ont également été signalés dans l’environnement Swift + Ninja, notamment des incohérences de cible de déploiement, des erreurs de traitement de
install_nameet des options de compilation incompatibles - Dans le code de Ladybird lui-même, de nombreuses instabilités de build ont été constatées, notamment autour de la configuration des
modulemapdes modules AK et LibGfx, des plantages du frontend Swift et des conflits d’espace de noms sur les types - En raison de l’accumulation de ces contraintes techniques, l’intégration de Swift a été abandonnée, ce qui a conduit à la décision de conserver un développement centré sur C++
Problèmes liés à Swift
- De nombreux bugs au niveau du langage et de l’ABI devaient être résolus pour faire sortir le support de Swift 6.0 de la phase expérimentale
- Échec d’assertion lors d’un build open source de Swift en raison d’un décalage de version LLVM
- Problème d’incompatibilité d’ABI entre le compilateur et le bridging header lors du retour de
Optional<CxxValueType> - Sur Ubuntu 22.04, inclusion de l’en-tête
<execution>provoquant une dépendance circulaire de module dans libstdc++ - Problèmes de compatibilité C++23, notamment impossibilité de renvoyer
swift::Optional<swift::String>et échec du chargement de l’en-tête<chrono>
- Certains problèmes ont été corrigés dans des versions publiées après Swift 6.0.0, mais d’autres ne l’ont été que sur la branche
main, sans être intégrés à une version stable - Plusieurs points proposaient des « workarounds (méthodes de contournement pour le build) », sans que cela constitue une solution complète
Problèmes liés à CMake
- Avec la combinaison Swift et Ninja build,
CMAKE_OSX_DEPLOYMENT_TARGETn’était pas appliqué, ce qui générait de nombreux avertissements- Il fallait définir manuellement
CMAKE_Swift_COMPILER_TARGET
- Il fallait définir manuellement
- Quand la politique CMP0157 est activée, la configuration du répertoire
install_nameest ignorée, ce qui impose une correction manuelle- Le correctif correspondant doit être backporté dans CMake 3.29 et 3.30
- Des options de lien que le compilateur Swift ne comprend pas peuvent être transmises par des dépendances externes
Problèmes internes au projet Ladybird
- Lors de la configuration des clang module map des modules AK et LibGfx, des conflits avec les en-têtes système se produisent
- L’inclusion de
<math.h>entraîne un échec du build à cause d’une erreur de reconnaissance de module
- L’inclusion de
- Le frontend Swift plante sur des builds debug pendant les tests des conteneurs AK
- Le problème ne peut être contourné qu’en buildant en mode release
- Un conflit d’espace de noms autour du type
Stringprovoque un arrêt anormal du frontend Swift- Il faut l’indiquer explicitement comme
AK.StringouSwift.String
- Il faut l’indiquer explicitement comme
- Lors de l’utilisation du module Swift Testing, on observe des plantages du frontend du compilateur, ainsi qu’un problème de non-reconnaissance de
CxxSequenceTypepourAK::StringView
Éléments d’amélioration supplémentaires
- Quand une fonction C++ renvoie
Optional<CxxType>vers Swift, l’application plante- Une solution temporaire consiste à renvoyer un tableau de taille 0 ou 1
- SourceKit-LSP et vscode-swift exigent un
compile_commands.jsonà la racine- Le problème peut être résolu par la création d’un lien symbolique
- Sous Linux, il est contraignant de devoir ajouter manuellement le chemin
<swift/bridging>
Questions non résolues
- On ne sait pas clairement comment, en Swift, transmettre sans copie un type view C++ ou un byte slice
- Swift ne reconnaît pas les types maison comme
AK::OptionalouAK::HashMapcomme équivalents aux typesstd:: - La manière d’intégrer le garbage collector de Swift avec la gestion mémoire de Ladybird reste également indéterminée
Cette issue était un document consignant de manière structurée les obstacles techniques à l’intégration de Swift 6.0, mais après l’abandon de l’adoption de Swift par l’équipe Ladybird, l’issue « Swift 6.0 Blockers » a été clôturée.
1 commentaires
Commentaires sur Hacker News
Le commit qui supprime Swift contient quelques explications supplémentaires
Il inclut le message : « Après une longue période sans progrès, nous abandonnons l’adoption de Swift et le retirons de la base de code »
Le commit concerné peut être consulté ici
J’ai essayé Swift pour la première fois en 2021, après plus de 10 ans sur C#/.NET, et ça m’a surpris
Je trouvais déjà C# complexe, mais Swift était un langage encore plus complexe
En particulier, il n’y avait presque aucune ressource de référence pour créer des API backend ou des couches d’accès aux données
Les connaissances sur Swift sont surtout accumulées pour les plateformes Apple, donc en dehors de ça on a presque l’impression de devoir être un pionnier
Comme l’a dit Larry Wall, la complexité des outils doit correspondre à celle du problème (avec une référence à Raku)
Mais des règles comme « les
structsont passées par valeur, lesclasspar référence » entraient en conflit avec le principe d’une « source unique de vérité », ce qui rendait le développement fastidieux et lentÀ cause des bonnes pratiques contradictoires de Swift, je n’avançais pas, et j’ai fini par comprendre qu’une grande partie des conseils n’étaient pas fiables
Il y a trop de sucre syntaxique, et des dizaines de façons de faire la même chose, donc il fallait consulter la référence du langage en permanence
Quel que soit le langage, j’espère que Ladybird se concentrera plus tard sur une implémentation de JavaScript conviviale pour l’utilisateur
Le fait que JS soit utilisé pour suivre l’activité des utilisateurs, bloquer le collage ou collecter trop d’informations sur l’appareil est un vrai problème
Comme Tor, signaler des valeurs d’usurpation standardisées entre utilisateurs pourrait aider à protéger la vie privée
En faire une option activable me semble acceptable, mais en faire la valeur par défaut compliquerait sans doute l’adoption
La suppression de Swift est intéressante. Les raisons ne sont pas expliquées clairement, donc je suis curieux
Si ça fonctionne au moins sous Linux, j’essaierai peut-être plus tard
Swift ne pouvait peut-être pas importer plusieurs bibliothèques de versions C++ différentes en même temps, ou il y avait des conflits de versions d’opérateurs
Swift est un bon langage, mais l’ajouter après coup à un gros projet devait sans doute être trop compliqué
Je me demande pourquoi Ladybird a essayé Swift. J’aurais pensé que Rust avait une meilleure interopérabilité avec C++
Le GC de Swift me semble aussi défavorable aux performances d’un navigateur
lien1, lien2
Il existe des contournements, mais ils réduisent la productivité
Mais cela n’a apparemment pas suffi pour Ladybird
Il avait aussi créé autrefois un langage appelé Jakt dans SerenityOS, mais il semble qu’il soit finalement revenu au C++
Une ancienne discussion connexe se trouve dans ce billet
Il n’est pas surprenant que Swift soit un langage trop dépendant d’Apple
Il suffit d’utiliser correctement les parties sûres de C++, et de toute façon la plupart des navigateurs sont écrits en C++
Chromium et Firefox remplacent progressivement certaines parties par des langages plus sûrs, et réécrire un nouveau navigateur en C++ reviendrait à répéter les erreurs du passé
L’usage de C++ est un héritage de l’époque de KHTML en 1998
Est-ce que ça inclut des fonctionnalités STL récentes comme
string_view? On reste de toute façon loin d’une vraie sécurité mémoire complèteEn dehors de quelques benchmarks, dans les vrais programmes il est presque toujours plus lent
Dommage que Swift soit retiré. Je me demande si leur langage maison Jakt redevient un candidat
Je pense qu’il est peu probable qu’ils introduisent un nouveau langage
Pour un projet financé par des soutiens externes, fonctionner ainsi risque d’être difficile à tenir sur le long terme
À la fin, je pense que Swift n’est rien d’autre qu’un langage-jouet d’Apple
Apple ne le laissera pas devenir davantage que ça
L’interface Mac de Ladybird est une fine couche posée sur AppKit
Elle est écrite en Objective-C++, pas en Swift
Voir le code source
C’était bien avant l’adoption de Swift, à l’époque de SerenityOS, donc j’ai utilisé Objective-C++ simplement parce que c’était un langage familier
J’avais critiqué le passage à Swift à l’époque
Je trouvais que Swift avait une conception maladroite, une vitesse de compilation lente, et peu de chances de devenir un vrai langage système
Comme il n’y avait pas de spécialistes, je pense que cette décision a été la bonne
Des fonctionnalités comme la concurrency ou Swift Testing ont aussi été poussées en fonction des besoins d’Apple
Le travail cross-platform est en grande partie mené séparément par de petites équipes
Même en dehors de Chris Lattner, les leads de Swift étaient des personnalités reconnues dans la communauté C++
J’aimerais que le camp Rust prenne aussi en charge l’ABI de Swift en FFI, avec celle du C