34 votes

Compiler Swift à WebAssembly

La LLVM infrastructure prend désormais en charge la compilation à partir d' IR LLVM pour WebAssembly (au moins à titre expérimental). Swift utilise le compilateur LLVM infrastructure et peut facilement être compilé à l'IR LLVM. J'ai donc pensé qu'il serait simple de compiler quelques Swift code IR LLVM et puis à WebAssembly.

Il s'est avéré ne pas être facile, cependant. Il ressemble IR LLVM n'est pas entièrement indépendant de la plateforme? Quelle que soit la raison derrière les coulisses, lors de la compilation de Swift à l'IR LLVM, une architecture cible doit être spécifié et WebAssembly n'est pas disponible.

J'ai deux questions:

1) ai-je raison qu'il est actuellement (octobre 2017) aucun moyen de compiler Swift à WebAssembly?

2) Que faut-il pour faire WebAssembly une prise en charge de cible pour Swift à l'IR LLVM compilation?

26voto

n8gray Points 2923

1) au meilleur de ma connaissance, dès le début de Novembre, en 2017, vous avez raison: il n'est pas couramment disponible pour compiler Swift à WebAssembly. Peut-être que certains entreprenant hacker, quelque part, a fait arriver, mais si elle n'a pas partagé son code avec nous encore.

2) afin de permettre WASM l'aide dont vous aurez probablement besoin de travailler sur quelques parties différentes. Je pense que vous pourriez le faire sans le savoir beaucoup de choses sur le fonctionnement interne du compilateur (par exemple, l'analyseur et des optimiseurs), mais vous auriez besoin d'apprendre sur la façon dont la chaîne d'outils fonctionne et comment il s'intègre à la plate-forme au moment de l'exécution.

Vous pouvez apprendre une tonne sur ce que vous devez faire par l'étude de la façon de Swift a été porté à Android. Heureusement, Brian Gesiak posté un vraiment détaillé billet de blog sur exactement comment ce port travaillé (avertissement: les petites Patreon don obligatoire):

https://modocache.io/how-to-port-the-swift-runtime-to-android

Sérieusement, vous serait de noix pour se lancer dans ce projet sans la lecture de cet article.

Bien que je ne suis PAS un expert sur la base de port et de mes (de base) de la compréhension de Swift, je pense que l'idée de l'endroit où vous auriez besoin de hack serait:

  • La Swift compilateur
    • Vous aurez besoin de les enseigner au sujet de la WASM "triple" utilisé par LLVM, il sait comment s'intégrer avec le reste de sa suite d'outils
    • Vous aurez besoin de mettre en place un WebAssembly plate-forme de sorte que les gens peuvent écrire #if os(WebAssembly) dans des endroits qui nécessitent de compilation conditionnelle
    • Vous aurez également besoin de mettre en place similaire au moment de la construction des macros. Le Android article explique ce genre de chose vraiment bien.
  • La Swift runtime
    • C'est écrit en C++ et qu'il doit exécuter sur WASM
    • Depuis WASM est une plate-forme inhabituelle, il y aura probablement peu de travail ici. Vous pourriez avoir besoin afin d'assurer la compatibilité des cales pour les différents appels système et la comme.
    • Des projets comme Emscripten ont démontré beaucoup de succès à la compilation C++ pour WASM.
  • La Swift de la bibliothèque standard
    • En théorie, vous pouvez écrire et exécuter le code Swift qui n'utilise pas la bibliothèque standard, mais qui en voudrait?
    • Aussi, en théorie, il faut "juste travail" si l'exécution de travaux, mais vous aurez probablement besoin d'utiliser votre #if os(WebAssembly) fonctionnalité ici pour travailler autour de la plate-forme d'irrégularités
  • Bonus: La Fondation et l'Expédition des bibliothèques
    • Si vous souhaitez utiliser l'existant, code Swift ces deux bibliothèques seront essentiels.

Liens:

12voto

ColinE Points 36907

Il semble qu'il existe une offre commerciale prenant en charge la compilation de Swift to WebAssembly. RemObjects, la société d'outils de développement, vient d'annoncer le support de WebAssembly avec son compilateur Elements , capable de compiler Java, Swift, C # et Oxygene.

5voto

Max Desyatov Points 175

En Mai 2019 il y a un projet open-source appelé SwiftWasm qui permet de compiler du code Swift à WebAssembly ciblage WASI SDK. Cela signifie que les binaires produits par SwiftWasm peut être exécuté soit dans les navigateurs avec WASI polyfill ou autonome WebAssembly temps d'exécution de soutien WASI comme wasmtime, lucet ou wasmer.

-4voto

mike Points 129

WebAssembly cible serait comme un unix cible pour llvm, donc je pense que quelqu'un a besoin de développer ce port.

Veuillez noter que Swift -> WASM dans le navigateur serait assez inutile car WASM n'a pas de DOM DOM API d'accès si vous avez encore besoin de JavaScript pour faire quelque chose de valable, donc la question: pourquoi quelqu'un aurait-il la peine de faire le port? Il ressemble JavaScript reste le seul langage du web. Si vous n'aimez pas le JavaScript de mieux vous oubliez le développement web.

Les Chances sont que Swift run sur Android avant qu'il s'exécute sur le web, de sorte bâton avec Swift/iOS et ensuite de faire du port de Android chaque fois que cela devient possible. Personnes n'utilisent pas le web/navigateur que beaucoup de toute façon.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X