4 puntos por GN⁺ 2025-04-07 | 1 comentarios | Compartir por WhatsApp
  • 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

  1. 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
  2. Mejorar las herramientas de compilación cruzada
    • Simplificar la gestión de versiones y la instalación del SDK de Swift
  3. Integración del Component Model
    • Dar soporte para que las especificaciones más recientes de WASI también puedan usarse en Swift
  4. 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++
  5. 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
    1. Un runtime de Wasm con soporte para LLDB y el protocolo de GDB
    2. 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:
    1. Enlace dinámico estilo Emscripten: no es estándar y depende de capacidades del runtime
    2. 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

 
kandk 2025-04-07

Swift está bueno, pero ¿podrá volver a la vida ese Swift que quedó abandonado..