Compiler Swift à WebAssembly
l'infrastructure LLVM supporte maintenant la compilation à partir de LLVM IR to WebAssembly (au moins à titre expérimental). Swift utilise l'infrastructure de compilateur LLVM et peut facilement être compilé en LLVM IR. J'ai donc pensé qu'il serait simple de compiler un peu de Code Swift à LLVM IR et ensuite à WebAssembly.
Il s'est avéré ne pas être facile, cependant. Il semble que LLVM IR n'est pas entièrement indépendant de la plateforme? Quelle que soit la raison derrière les coulisses, LLVM IR, une architecture cible doit être spécifiée et WebAssembly n'est pas disponible.
j'ai deux questions:
1) Ai-je raison de dire qu'il n'y a actuellement (en date d'octobre 2017) aucun moyen de compiler Swift à WebAssembly?
2) Que faudrait-il pour faire de WebAssembly une cible supportée par Swift pour la compilation IR LLVM?
3 réponses
1) à ma connaissance, au début de novembre 2017, vous avez raison: il n'y a pas de moyen courant de compiler Swift à WebAssembly. Peut-être qu'un pirate quelque part l'a fait se produire, mais si c'est le cas, elle n'a pas encore partagé son code avec nous.
2) pour activer le support WAM, vous aurez probablement besoin de hacker quelques pièces différentes. Je pense que vous pourriez le faire sans savoir grand-chose sur les internes du compilateur (par ex. l'analyseur et les optimiseurs), mais vous devez savoir comment la chaîne d'outils fonctionne et comment elle s'intègre à la plate-forme à l'exécution.
Vous pouvez en apprendre ton sur ce que vous auriez besoin de faire en étudiant comment Swift a été porté sur Android. Heureusement, Brian Gesiak a posté un vraiment blog détaillé sur le fonctionnement exact de ce portage (attention: petit don de Patréon) nécessaire):
https://modocache.io/how-to-port-the-swift-runtime-to-android
sérieusement, vous seriez fou de vous lancer dans ce projet sans lire cet article.
Si je suis un expert, basé sur ce port et ma compréhension (de base) de Swift, je pense que l'aperçu approximatif de l'endroit où vous devez Hacker serait:
- le compilateur Swift
- vous aurez besoin de l'enseigner à propos de la WASM "triple" utilisé par LLVM, donc il sait s'intégrer avec le reste de sa chaîne d'outils
- vous aurez besoin de mettre en place une plate-forme WebAssembly pour que les gens puissent écrire
#if os(WebAssembly)
dans des endroits qui nécessitent de compilation conditionnelle - vous aurez également besoin de configurer des macros de compilation similaires. L'article sur Android explique très bien ce genre de chose.
- rapide d'exécution
- ceci est écrit en C++ et il doit fonctionner sur WASM
- étant donné que WAM est une plate-forme inhabituelle, il y aura probablement du travail ici. Vous pourriez avoir besoin de fournir des cales de compatibilité pour divers appels système et similaires.
- des projets comme Emscripten ont démontré beaucoup de succès dans la compilation de C++ vers WAM.
- la bibliothèque Swift standard
- en théorie, vous pouvez écrire et exécuter du code Swift qui n'utilise pas la bibliothèque standard, mais qui le voudrait?
- également en théorie cela, il faut "juste travail" si l'exécution de travaux, mais vous aurez probablement besoin d'utiliser votre
#if os(WebAssembly)
cette fonctionnalité permet de contourner les irrégularités de la plate-forme
- Bonus: les bibliothèques Foundation et Dispatch
- si vous souhaitez utiliser le code Swift existant, ces deux bibliothèques seront essentielles.
Liens:
- Brian Gesiak est génial post de blog: https://modocache.io/how-to-port-the-swift-runtime-to-android
- Lien vers l'Android port du pull request: https://github.com/apple/swift/pull/1442
- article intéressant sur les défis et les récompenses de Swift multiplateformes: https://medium.com/@ephemer/how-we-put-an-app-in-the-android-play-store-using-swift-67bd99573e3c
il semble qu'il y ait une offre commerciale qui supporte la compilation de Swift à WebAssembly. RemObjects, la société de développement d'outils, a vient d'annoncer le support de WebAssembly avec leur compilateur D'éléments, qui peut compiler Java, Swift, C# et Oxygene.
WebAssembly cible serait comme une cible unix générique pour llvm, donc je pense que quelqu'un a besoin de développer ce port.
veuillez noter que Swift - > wam dans le navigateur serait plutôt inutile parce que WAM n'a pas D'accès à L'API DOM ou DOM, donc vous avez toujours besoin de JavaScript pour faire quelque chose de significatif, donc la question: pourquoi quelqu'un s'embêterait à faire le port? Il semble que JavaScript reste le seul langage web. Si vous n'aimez pas JavaScript, oubliez le développement web.
il y a des Chances que Swift tourne sur Android avant qu'il ne tourne sur le web, donc restez avec Swift/iOS et ensuite faites le port vers Android dès que cela devient possible. Les gens n'utilisent pas beaucoup le Web/Navigateur de toute façon.