- La comunidad de Swift ha venido desarrollando de forma constante el soporte para WebAssembly (Wasm), y sobre esa base propone una visión de largo plazo
- WebAssembly es un conjunto de instrucciones para máquina virtual enfocado en la portabilidad, seguridad y rendimiento, y puede ejecutarse en diversas plataformas
- Si Swift soporta Wasm, podrá usarse en nuevos entornos, incluido el navegador, y se ampliará su potencial de uso tanto en aplicaciones cliente como de servidor
Seguridad y características de la interfaz del sistema
- Wasm resulta favorable para la seguridad porque solo puede ejecutar funciones importadas explícitamente, sin acceso directo al sistema
- WASI (WebAssembly System Interface) proporciona APIs estándar para que Wasm pueda interactuar con el sistema operativo anfitrión
- Swift funciona sobre libc de WASI en el objetivo
wasm32-unknown-wasi, y ya puede usarse mediante interoperabilidad con C
- El W3C gestiona de forma integrada el sistema de tipos de Wasm y la interconexión entre módulos mediante el Component Model
- Con
wit-tool es posible generar .wit a partir de declaraciones de Swift, y también se soporta el proceso inverso
Casos de uso principales
- Las macros de Swift pueden compilarse a Wasm y distribuirse como binarios ejecutables en cualquier lugar
- Puede virtualizarse la ejecución de plugins de SwiftPM, manifiestos, macros, etc., para reforzar la seguridad
- Wasm puede generar binarios optimizados mediante compilación JIT o AOT, por lo que la pérdida de rendimiento es mínima
- Los componentes de Swift virtualizados con Wasm pueden ejecutarse sin procesos separados, eliminando la sobrecarga de IPC
Objetivos propuestos
- Ampliar el alcance de las APIs con soporte WASI en la biblioteca estándar de Swift
- Es necesario construir un entorno de CI para automatizar las pruebas
- Mejorar las herramientas de compilación cruzada
- Simplificar la gestión de versiones y la instalación del SDK de Swift
- Integración del Component Model
- Dar soporte para que las especificaciones más recientes de WASI también puedan usarse en Swift
- Mejorar la interoperabilidad con otros componentes Wasm
- El objetivo es que la experiencia de usar componentes Wasm desde Swift sea equivalente a la de C/C++
- Mejorar el entorno de depuración de Swift en Wasm
Aspectos relacionados con la depuración
- La depuración en Wasm es limitada y no cuenta por sí misma con capacidades de introspección
- Existen dos enfoques principales
- Un runtime de Wasm con soporte para LLDB y el protocolo de GDB
- Un depurador integrado en el motor de Wasm
- Los entornos de navegador y no navegador requieren enfoques de depuración distintos
- Herramientas como Chrome DevTools pueden aprovechar información DWARF, pero la metadata de Swift y la evaluación de expresiones JIT requieren integración adicional
Multithreading y concurrencia
- Actualmente, Wasm solo cuenta con operaciones atómicas que soportan consistencia secuencial
- La creación de hilos depende del entorno anfitrión
- Existen dos propuestas de threading:
wasi-threads (método existente, soportado por algunas herramientas y runtimes)
shared-everything-threads (propuesta nueva, con posibilidades de convertirse en estándar a futuro)
- Swift soporta
wasm32-unknown-wasi (un solo hilo) y wasm32-unknown-wasip1-threads (multihilo)
- Actualmente se usa un ejecutor de Swift Concurrency basado en un solo hilo porque libdispatch no soporta wasi-threads
Espacio de direcciones de 64 bits
- Wasm usa por defecto un espacio de direcciones de 32 bits
- La propuesta de memoria de 64 bits (memory64) está en fase de implementación
- Para que Swift la soporte, se requiere la cooperación de la toolchain de WebAssembly o cambios en la estructura de metadata de Swift
Bibliotecas compartidas
- Existen dos enfoques:
- Enlace dinámico estilo Emscripten: no es estándar y depende de capacidades del runtime
- Enlace estático basado en el Component Model: puede usarse sin funciones especiales del runtime, pero no permite carga en tiempo de ejecución
- Para usar bibliotecas compartidas en Swift, es necesario compilar en modo PIC (Position-Independent Code) y seguir una convención de enlace definida
1 comentarios
Swift está bueno, pero ¿podrá volver a la vida ese Swift que quedó abandonado..