web-dev-qa-db-fra.com

Compiler Swift vers WebAssembly

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)?

32
Rob Mecham

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:

  • Le Swift
    • Vous devrez lui enseigner le "triple" WASM utilisé par LLVM, afin qu'il sache comment s'intégrer avec le reste de sa chaîne d'outils
    • Vous devrez configurer une plate-forme WebAssembly afin que les utilisateurs puissent écrire #if os(WebAssembly) aux endroits qui nécessitent une compilation conditionnelle
    • Vous devrez également configurer des macros similaires lors de la construction. L'article Android Android explique très bien ce genre de choses.
  • L'exécution Swift
    • Ceci est écrit en C++ et doit fonctionner sur WASM
    • Étant donné que WASM est une plate-forme inhabituelle, il y aura probablement du travail ici. Vous devrez peut-être fournir des shims de compatibilité pour divers appels système et similaires.
    • Des projets comme Emscripten ont démontré beaucoup de succès lors de la compilation de C++ vers WASM.
  • La bibliothèque standard Swift
    • En théorie, vous pouvez écrire et exécuter Swift code qui n'utilise pas la bibliothèque standard, mais qui voudrait?
    • En théorie, cela devrait "fonctionner" si le runtime fonctionne, mais vous devrez probablement utiliser votre fonction #if os(WebAssembly) ici pour contourner les irrégularités de la plate-forme.
  • Bonus: les bibliothèques Foundation et Dispatch
    • Si vous souhaitez utiliser le code Swift code existant, ces deux bibliothèques seront essentielles.

Liens:

24
n8gray

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.

12
ColinE

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 .

2
Max Desiatov