swift llvm webassembly

Compila Swift a WebAssembly



llvm (3)

La infraestructura de LLVM ahora admite la compilación de LLVM IR a WebAssembly (al menos experimentalmente). Swift utiliza la infraestructura del compilador LLVM y puede compilarse fácilmente a LLVM IR. Así que pensé que sería sencillo compilar algo de código Swift a LLVM IR y luego a WebAssembly.

Sin embargo, resultó no ser tan fácil. Parece que LLVM IR no es completamente independiente de la plataforma? Cualquiera que sea la razón detrás de escena, al compilar Swift a LLVM IR, se debe especificar una arquitectura de destino y WebAssembly no está disponible.

Tengo dos preguntas entonces:

1) ¿Estoy en lo cierto al afirmar que actualmente (a partir de octubre de 2017) no hay forma de compilar Swift to WebAssembly?

2) ¿Qué se necesitaría para hacer de WebAssembly un objetivo compatible para la compilación de Swift a LLVM IR?


El objetivo de WebAssembly sería como un objetivo genérico de Unix para llvm, así que creo que alguien necesita desarrollar ese puerto.

Tenga en cuenta que Swift -> WASM en el navegador sería bastante inútil porque WASM no tiene acceso a DOM ni a la API de DOM, por lo que aún necesita JavaScript para hacer algo significativo, por lo tanto, la pregunta: ¿por qué alguien se molestaría en hacer el puerto? Parece que JavaScript sigue siendo el único idioma web. Si no te gusta JavaScript mejor olvida el desarrollo web.

Lo más probable es que Swift se ejecute en Android antes de que se ejecute en la web, así que quédese con Swift / iOS y luego conecte el puerto a Android siempre que sea posible. La gente no usa la web / navegador mucho de todos modos.



1) A mi leal saber y entender, a principios de noviembre de 2017 tiene razón: no existe una forma comúnmente disponible para compilar Swift to WebAssembly. Tal vez algún pirata informático emprendedor en alguna parte lo haya hecho posible, pero si es así, aún no ha compartido su código con nosotros.

2) Para habilitar el soporte de WASM probablemente necesitará piratear algunas partes diferentes. Creo que podría hacerlo sin saber mucho sobre los componentes internos del compilador (por ejemplo, el analizador y los optimizadores), pero tendría que aprender cómo funciona la cadena de herramientas y cómo se integra con la plataforma en tiempo de ejecución.

Puedes aprender mucho sobre lo que deberías hacer estudiando cómo Swift fue portado a Android. Afortunadamente, Brian Gesiak publicó una entrada de blog muy detallada sobre cómo funcionó exactamente ese puerto (advertencia: se requiere una pequeña donación de Patreon):

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

En serio, estarías loco para embarcarte en este proyecto sin leer ese artículo.

Aunque NO soy un experto, basado en ese puerto y mi comprensión (básica) de Swift, creo que la descripción general de dónde necesitaría hackear sería:

  • El compilador Swift
    • Tendrá que enseñarle sobre el "triple" WASM utilizado por LLVM, para que sepa cómo integrarse con el resto de su cadena de herramientas.
    • Tendrá que configurar una plataforma WebAssembly para que las personas puedan escribir #if os(WebAssembly) en lugares que requieran compilación condicional
    • También necesitarás configurar macros similares de tiempo de construcción. El artículo de Android explica este tipo de cosas realmente bien.
  • El tiempo de ejecución Swift
    • Esto está escrito en C ++ y debe ejecutarse en WASM
    • Dado que WASM es una plataforma inusual, probablemente habrá trabajo aquí. Es posible que deba proporcionar correcciones de compatibilidad para varias llamadas al sistema y similares.
    • Proyectos como Emscripten han demostrado mucho éxito compilando C ++ a WASM.
  • La biblioteca estándar de Swift
    • En teoría, puede escribir y ejecutar código Swift que no use la biblioteca estándar, pero ¿quién querría hacerlo?
    • También en teoría, esto debería "simplemente funcionar" si el tiempo de ejecución funciona, pero es probable que necesite usar su característica #if os(WebAssembly) aquí para #if os(WebAssembly) irregularidades de la plataforma.
  • Bonus: Las bibliotecas de Fundación y Despacho.
    • Si desea utilizar el código Swift existente, estas dos bibliotecas serán esenciales.

Campo de golf: