L'infrastructure LLVM prend désormais en charge la compilation à partir de LLVM IR vers WebAssembly (au moins expérimentalement). Swift utilise l'infrastructure du compilateur LLVM et peut facilement être compilé en LLVM IR. J'ai donc pensé qu'il serait simple de compiler du code Swift en LLVM IR, puis à WebAssembly.
Mais il s'est avéré que ce n'était pas si facile. Il semble que LLVM IR ne soit pas entièrement indépendant de la plate-forme? Quelle que soit la raison derrière les scènes, lors de la compilation de Swift vers LLVM IR, une architecture cible doit être spécifiée et WebAssembly n'est pas disponible.
J'ai alors deux questions:
1) Ai-je raison de dire qu'il n'y a actuellement (en octobre 2017) aucun moyen de compiler Swift vers WebAssembly?
2) Que faudrait-il pour faire de WebAssembly une cible prise en charge pour la compilation Swift vers LLVM IR)?
1) À ma connaissance au début de novembre 2017, vous avez raison: il n'y a aucun moyen couramment disponible pour compiler Swift à WebAssembly. Peut-être qu'un pirate entreprenant quelque part a réussi, mais si c'est le cas, elle n'a pas encore partagé son code avec nous.
2) Afin d'activer la prise en charge WASM, vous devrez probablement pirater plusieurs parties différentes. Je pense que vous pourriez le faire sans en savoir grand-chose sur les composants internes du compilateur (par exemple, l'analyseur et les optimiseurs), mais vous auriez besoin d'apprendre comment fonctionne la chaîne d'outils et comment elle s'intègre à la plate-forme lors de l'exécution.
Vous pouvez en apprendre tonne sur ce que vous devez faire en étudiant comment Swift a été porté sur Android. Heureusement, Brian Gesiak a publié un vraiment article de blog détaillé sur le fonctionnement exact de ce port (avertissement: petit don de Patreon requis):
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.
Bien que je ne sois [~ # ~] pas [~ # ~] un expert, sur la base de ce port et de ma compréhension (de base) de Swift, je pense que l'aperçu général de l'endroit où vous besoin de pirater serait:
#if os(WebAssembly)
aux endroits qui nécessitent une compilation conditionnelle#if os(WebAssembly)
ici pour contourner les irrégularités de la plate-forme.Il semble qu'il existe une offre commerciale qui prend en charge la compilation de Swift vers WebAssembly. RemObjects, la société d'outils de développement, a vient d'annoncer la prise en charge de WebAssembly avec leur compilateur Elements , qui peut compiler Java, Swift, C # et Oxygene.
Depuis mai 2019, un projet open source disponible appelé SwiftWasm vous permet de compiler Swift code vers le ciblage WebAssembly WASI SDK . Ce signifie que les binaires produits par SwiftWasm peuvent être exécutés soit dans des navigateurs avec polyfill WASI ou des runtimes WebAssembly autonomes prenant en charge WASI tels que wasmtime , lucet ou - wasmer .