WebAssembly (a veces abreviado Wasm ) define un formato de código binario portátil y un formato de texto correspondiente para programas ejecutables [2], así como interfaces de software para facilitar las interacciones entre dichos programas y su entorno anfitrión. [3] [4] [5] [6]
El objetivo principal de WebAssembly es habilitar aplicaciones de alto rendimiento en páginas web , "pero no hace suposiciones específicas de la Web ni proporciona características específicas de la Web, por lo que también puede emplearse en otros entornos". [7] Es un estándar abierto [8] [9] y tiene como objetivo admitir cualquier idioma en cualquier sistema operativo, [10] y en la práctica todos los idiomas más populares ya tienen al menos algún nivel de soporte.
Anunciado en 2015 y lanzado por primera vez en marzo de 2017 , WebAssembly se convirtió en una recomendación del Consorcio World Wide Web el 5 de diciembre de 2019 [11] [12] [13] y recibió el Premio de Software de Lenguajes de Programación de ACM SIGPLAN en 2021. [14] El mundo Wide Web Consortium (W3C) mantiene el estándar con contribuciones de Mozilla , Microsoft , Google , Apple , Fastly , Intel y Red Hat . [15] [16]
WebAssembly recibe su nombre para evocar el concepto de lenguaje ensamblador , término que data de la década de 1950. El nombre sugiere llevar la programación similar a un ensamblador a la Web , donde será ejecutada en el lado del cliente : por la computadora del usuario del sitio web a través del navegador web del usuario . Para lograr esto, WebAssembly debe ser mucho más independiente del hardware que un verdadero lenguaje ensamblador.
WebAssembly se anunció por primera vez en 2015, [17] y la primera demostración fue la ejecución de Angry Bots de Unity en Firefox , [18] Google Chrome , [19] y Microsoft Edge . [20] Las tecnologías precursoras fueron asm.js de Mozilla y Google Native Client , [21] [22] y la implementación inicial se basó en el conjunto de funciones de asm.js. [23] La tecnología asm.js ya proporciona velocidades de ejecución de código casi nativas [24] [25] y puede considerarse una alternativa viable para navegadores que no admiten WebAssembly o lo tienen deshabilitado por razones de seguridad.
En marzo de 2017 se declaró finalizado el diseño del producto mínimo viable (MVP) y finalizó la fase de vista previa. [26] A finales de septiembre de 2017, se lanzó Safari 11 con soporte. En febrero de 2018, el grupo de trabajo de WebAssembly publicó tres borradores de trabajo públicos para la especificación principal, la interfaz JavaScript y la API web. [27] [28] [29] [30]
En junio de 2019, se lanzó Chrome 75 con los subprocesos de WebAssembly habilitados de forma predeterminada. [31]
Desde abril de 2022, [actualizar]WebAssembly 2.0 se encuentra en estado de borrador, [32] [33] , lo que agrega muchas instrucciones relacionadas con SIMD y un nuevo tipo de datos v128, la capacidad de que las funciones devuelvan múltiples valores e inicialización/copia de memoria masiva.
Si bien WebAssembly se diseñó inicialmente para permitir una velocidad de ejecución de código casi nativa en el navegador web, se ha considerado valioso fuera de eso, en contextos más generalizados. [34] [35] Dado que los entornos de ejecución (RE) de WebAssembly son máquinas de pila virtuales de bajo nivel (similares a JVM o Flash VM ) que pueden integrarse en aplicaciones host, algunos de ellos han encontrado una manera de crear entornos de ejecución independientes como Wasmtime y Wasmer . [9] [10]
En noviembre de 2017, Mozilla declaró soporte "en todos los navegadores principales", [36] después de que WebAssembly se habilitara de forma predeterminada en Edge 16. [37] El soporte incluye navegadores web móviles para iOS y Android. En marzo de 2024, [actualizar]el 99% de los navegadores web rastreados son compatibles con WebAssembly (versión 1.0), [38] que es más que su predecesor asm.js , que no es compatible, por ejemplo, con el navegador web Safari. Para algunas extensiones, a partir del borrador del estándar 2.0, el soporte puede ser menor, pero aún así es posible que más del 90% de los navegadores web ya lo admitan, por ejemplo, para la extensión de tipos de referencia. [39]
Las implementaciones de WebAssembly generalmente usan compilación anticipada (AOT) o justo a tiempo (JIT), pero también pueden usar un intérprete . Si bien las primeras implementaciones llegaron a los navegadores web , también existen implementaciones que no son de navegador para uso de propósito general, incluidas Wasmer, [10] Wasmtime [40] o WAMR, [16] wasm3, WAVM y muchas otras. [41]
Debido a que los ejecutables de WebAssembly están precompilados, es posible utilizar una variedad de lenguajes de programación para crearlos. [42] Esto se logra mediante la compilación directa en Wasm o mediante la implementación de las máquinas virtuales correspondientes en Wasm. Se ha informado que alrededor de 40 lenguajes de programación admiten Wasm como objetivo de compilación. [43]
Emscripten compila C y C++ en Wasm [26] utilizando Binaryen y LLVM como backend. [44] El SDK de Emscripten puede compilar cualquier código fuente de lenguajes compatibles con LLVM (como C , C++ o Rust , entre otros) en un archivo binario que se ejecuta en el mismo entorno limitado que el código JavaScript. [nota 1] Emscripten proporciona enlaces para varias interfaces de entorno de uso común como WebGL .
A partir de la versión 8, un Clang independiente puede compilar C y C++ en Wasm. [49] Su objetivo inicial era admitir la compilación desde C y C++ , [50] aunque admite otros lenguajes fuente como Rust , lenguajes .NET [51] [52] [43] y AssemblyScript [53] ( tipo TypeScript ) también está surgiendo.
Después del lanzamiento de MVP, WebAssembly agregó soporte para subprocesos múltiples y recolección de basura [54] [55] , lo que permitió la compilación de lenguajes de programación con recolección de basura como C# (compatible con Blazor ), F# (compatible con Bolero [56] con ayuda de Blazor), Python e incluso JavaScript , donde la velocidad de compilación justo a tiempo del navegador se considera demasiado lenta.
Varios otros lenguajes tienen cierto soporte, incluidos Python , [57] Julia , [58] [59] [60] y Ruby . [61]
Varios sistemas pueden compilar Java y otros lenguajes de código de bytes en JavaScript y WebAssembly. Estos incluyen CheerpJ, [62] JWebAssembly [63] y TeaVM. [64] Todos estos toman archivos .class de código de bytes de Java como entrada, lo que permite utilizar también otros lenguajes JVM como Groovy y Scala . Kotlin admite WebAssembly directamente. [65] [66]
WebAssembly no permite la interacción directa con el DOM ; debe fluir a través de JavaScript . [nota 2]
En una encuesta de desarrolladores realizada en octubre de 2023, menos de la mitad de los 303 participantes estaban satisfechos con el estado de WebAssembly. Una gran mayoría citó la necesidad de mejorar en cuatro áreas: WASI, soporte de depuración, integración con JavaScript y API del navegador, y herramientas de compilación. [69]
Para las asignaciones de memoria intensiva en WebAssembly, existen "graves limitaciones que hacen que muchas aplicaciones no se puedan implementar de manera confiable en navegadores móviles [...]. Actualmente, asignar más de ~300 MB de memoria no es confiable en Chrome en Android sin recurrir a recursos específicos de Chrome". soluciones alternativas, ni en Safari en iOS." [70]
Todos los navegadores principales permiten WebAssembly si no se especifica la Política de seguridad de contenido o si se utiliza "evaluación insegura", pero por lo demás se comportan de manera diferente. [71] Chrome requiere una "evaluación insegura", [72] [73] aunque un hilo de trabajo puede ser una solución alternativa. [73]
En 2022, la nueva empresa llamada Zaplib resumió en un blog por qué estaban cerrando. [74] Su objetivo había sido aumentar significativamente el rendimiento de las aplicaciones web existentes transfiriéndolas gradualmente a Rust /Wasm. Sin embargo, migrar el simulador de un cliente desde JavaScript solo produjo una mejora del 5%. [74] Con respecto a Figma , afirmaron: "tras una inspección más cercana, parece que su uso de Wasm se debe más a accidentes históricos (querer construir en C++ para proteger su aplicación nativa) que a necesidades críticas de rendimiento. Los archivos Figma se procesan en C++/Wasm, y esto probablemente sea una gran aceleración, pero la mayor parte de la magia del rendimiento de Figma se debe a su renderizador WebGL ". [74]
En junio de 2018, un investigador de seguridad presentó la posibilidad de utilizar WebAssembly para eludir las mitigaciones del navegador para las vulnerabilidades de seguridad Spectre y Meltdown una vez que se agregue soporte para subprocesos con memoria compartida. Debido a esta preocupación, los desarrolladores de WebAssembly suspendieron la función. [75] [76] [77] Sin embargo, para explorar estas futuras extensiones de lenguaje, Google Chrome agregó soporte experimental para la propuesta de hilo WebAssembly en octubre de 2018. [78]
WebAssembly ha sido criticado por permitir una mayor facilidad para ocultar la evidencia a los creadores de malware , estafadores y atacantes de phishing ; WebAssembly está presente en la máquina del usuario sólo en su forma compilada, lo que "[dificulta la detección de malware]". [79] La velocidad y la capacidad de ocultación de WebAssembly han llevado a su uso en la minería criptográfica oculta en el dispositivo del visitante del sitio web. [79] [80] [75] Coinhive , un servicio ahora desaparecido que facilita la minería de criptomonedas en los navegadores de los visitantes del sitio web, afirma que su "minero usa WebAssembly y se ejecuta con aproximadamente el 65% del rendimiento de un minero nativo". [75] Un estudio de junio de 2019 de la Technische Universität Braunschweig analizó el uso de WebAssembly en el millón de sitios web principales de Alexa y encontró que el uso predominante era para la minería criptográfica maliciosa, y que el malware representaba más de la mitad de los sitios web que usaban WebAssembly estudiados. . [81] [82] Un estudio de abril de 2021 de la Universität Stuttgart encontró que desde entonces la minería de criptomonedas ha sido marginada, cayendo a menos del 1% de todos los módulos WebAssembly recopilados de una amplia gama de fuentes, incluido también el millón de sitios web principales de Alexa. [83]
La capacidad de ofuscar eficazmente grandes cantidades de código también se puede utilizar para evitar el bloqueo de anuncios y las herramientas de privacidad que impiden el seguimiento web como Privacy Badger . [ cita necesaria ]
Como WebAssembly sólo admite flujo de control estructurado , se presta a técnicas de verificación de seguridad, incluida la ejecución simbólica . [84] Los esfuerzos actuales en esta dirección incluyen el motor de ejecución simbólica Manticore. [85]
WebAssembly System Interface (WASI) es una interfaz simple ( ABI y API ) diseñada por Mozilla destinada a ser portátil a cualquier plataforma. [86] Proporciona funciones similares a POSIX , como E/S de archivos restringida por seguridad basada en capacidades . [87] [88] También hay algunas otras ABI/API propuestas. [89] [90]
WASI está influenciado por CloudABI y Capsicum .
Solomon Hykes, cofundador de Docker , escribió en 2019: "Si WASM+WASI existiera en 2008, no habríamos necesitado crear Docker. Así de importante es. WebAssembly en el servidor es el futuro de la informática". [91] Wasmer, disponible en la versión 1.0, proporciona "contenedorización de software, creamos binarios universales que funcionan en cualquier lugar sin modificaciones, incluidos sistemas operativos como Linux, macOS, Windows y navegadores web. Wasm protege automáticamente las aplicaciones de forma predeterminada para una ejecución segura". [91]
El estándar general proporciona especificaciones básicas para la API de JavaScript y detalles sobre la incrustación. [5]
El código Wasm (código binario, es decir, código de bytes) está diseñado para ejecutarse en una máquina de pila virtual (VM) portátil . [92] La VM está diseñada para ser más rápida de analizar y ejecutar que JavaScript y para tener una representación de código compacta. [50] Cualquier funcionalidad externa (como syscalls ) que pueda esperarse del código binario Wasm no está estipulada por el estándar. Más bien proporciona una forma de ofrecer interfaz a través de módulos mediante el entorno host en el que se ejecuta la implementación de la VM. [93] [9]
Un programa Wasm está diseñado para ser un módulo separado que contiene colecciones de varios valores definidos por Wasm y definiciones de tipos de programas. Estos se expresan en formato binario o textual (ver más abajo) y ambos tienen una estructura común. [94] Dicho módulo puede proporcionar una función de inicio que se ejecuta al crear una instancia de un binario wasm.
El estándar central para el formato binario de un programa Wasm define una arquitectura de conjunto de instrucciones (ISA) que consta de codificaciones binarias específicas de tipos de operaciones que ejecuta la VM (sin especificar cómo deben ejecutarse exactamente). [95] La lista de instrucciones incluye instrucciones estándar de carga/almacenamiento de memoria, tipos de instrucciones numéricas, paramétricas, de control de flujo e instrucciones variables específicas de Wasm. [96]
La cantidad de códigos de operación utilizados en el estándar original (MVP) fue un poco menos de 200 de los 256 códigos de operación posibles. Las versiones posteriores de WebAssembly aumentaron el número de códigos de operación un poco más de 200. La propuesta SIMD de WebAssembly (para procesamiento paralelo) introduce un prefijo de código de operación alternativo (0xfd) para SIMD de 128 bits . La concatenación del prefijo SIMD, más un código de operación que es válido después del prefijo SIMD, forma un código de operación SIMD. Los códigos de operación SIMD aportan 236 instrucciones adicionales para la capacidad SIMD de "producto mínimo viable" (MVP) (para un total de alrededor de 436 instrucciones). [97] [98] Esas instrucciones, los "códigos de operación finalizados" [99] están habilitados de forma predeterminada en V8 de Google (en Google Chrome), el motor SpiderMonkey en Mozilla Firefox y el motor JavaScriptCore en Safari de Apple [100] y hay También hay una propuesta adicional de instrucciones para "post SIMD MVP" posterior, y también hay una propuesta separada de "simd relajado" sobre la mesa. [101]
Estos códigos de operación SIMD también son portátiles y se traducen a conjuntos de instrucciones nativos como x64 y ARM. Por el contrario, ni la JVM de Java ni el CIL soportan SIMD, en su nivel de código de operación , es decir, en el estándar; Ambos tienen algunas API paralelas que proporcionan aceleración SIMD. Existe una extensión para Java que agrega elementos intrínsecos para SIMD x64, [102] que no es portátil, es decir, no se puede utilizar en ARM o teléfonos inteligentes. Los teléfonos inteligentes pueden admitir SIMD llamando al código ensamblador con SIMD, y C# tiene un soporte similar.
En marzo de 2017, el grupo comunitario WebAssembly llegó a un consenso sobre el formato binario inicial (MVP), la API de JavaScript y el intérprete de referencia. [103] Define un formato binario WebAssembly ( .wasm
), que no está diseñado para ser utilizado por humanos, así como un formato de texto WebAssembly legible por humanos ( .wat
) que se asemeja a un cruce entre expresiones S y lenguajes ensambladores tradicionales.
La siguiente tabla muestra un ejemplo de una función factorial escrita en C y su correspondiente código WebAssembly después de la compilación, mostrado tanto en formato de texto .wat (una representación textual legible por humanos de WebAssembly) como en formato binario .wasm (el código de bytes sin formato , expresado a continuación en hexadecimal ), que se ejecuta mediante un navegador web o un entorno de ejecución que admita WebAssembly.
Todas las constantes enteras se codifican utilizando una codificación LEB128 de longitud variable y que ahorra espacio . [104]
El formato de texto WebAssembly se escribe más canónicamente en un formato plegado utilizando expresiones S. Para instrucciones y expresiones, este formato es puramente sintáctico y no tiene diferencias de comportamiento con el formato lineal. [105] Hasta wasm2wat
, el código anterior se descompila en:
( módulo ( escriba $t0 ( func ( parámetro i64 ) ( resultado i64 ))) ( func $f0 ( escriba $t0 ) ( parámetro $p0 i64 ) ( resultado i64 ) ( si $I0 ( resultado i64 ) ;; $I0 es un nombre de etiqueta no utilizado ( i64.eqz ( local.get $p0 )) ;; el nombre $p0 es el mismo que 0 aquí ( entonces ( i64.const 1 )) ( else ( i64.mul ( local.get $p0 ) ( llame a $f0 ;; el nombre $f0 es el mismo que 0 aquí ( i64.sub ( local.get $p0 ) ( i64.const 1 ))))))))
Tenga en cuenta que el compilador genera implícitamente un módulo. En realidad, se hace referencia a la función mediante una entrada de la tabla de tipos en el binario, por lo tanto, una sección de tipos y la type
emitida por el descompilador. [106] Se puede acceder en línea al compilador y descompilador. [107]
.wasm
archivos que luego se pueden ejecutar en un navegador web. [45] [46] [47] Aunque Emscripten puede consumir varios idiomas cuando usa Clang , pueden surgir algunos problemas. [48]El código WebAssembly puede considerarse una máquina de pila estructurada ; una máquina donde la mayoría de los cálculos utilizan una pila de valores, pero el flujo de control se expresa en construcciones estructuradas como bloques, ifs y bucles. En la práctica, las implementaciones no necesitan mantener una pila de valores real, ni estructuras de datos reales para el control; sólo necesitan comportarse como si lo hicieran.
WebAssembly es un estándar abierto...
WebAssembly es un... formato de código
WebAssembly es un lenguaje de programación que tiene múltiples representaciones concretas (su formato binario y el formato de texto).
Ambos se asignan a una estructura común.
... esta especificación se complementa con documentos adicionales que definen interfaces para entornos de integración específicos como la Web.
Cada uno de ellos definirá una interfaz de programación de aplicaciones (API) WebAssembly adecuada para un entorno determinado.
Su objetivo principal es permitir aplicaciones de alto rendimiento en la Web, pero no hace suposiciones específicas de la Web ni proporciona características específicas de la Web, por lo que también puede emplearse en otros entornos.
Si bien la Web es la principal motivación para WebAssembly, nada en su diseño depende de la Web o de un entorno JavaScript.
Es un estándar abierto diseñado específicamente para integrarse en múltiples contextos y esperamos que en el futuro haya implementaciones independientes disponibles.
Compile todo en WebAssembly.
Ejecútelo en cualquier sistema operativo o incorpórelo en otros idiomas.
Incluso descartando la puntuación en la que asm.js obtuvo mejores resultados, se ejecuta a alrededor del 70% de la velocidad del código C++ nativo.
{{cite book}}
: Mantenimiento CS1: varios nombres: lista de autores ( enlace )El objetivo de esta caja es proporcionar enlaces de Rust a las API web y permitir un alto grado de interoperabilidad entre Rust y JavaScript.
Enlaces de API sin formato para API web.
Esta es una caja generada por procedimientos desde el navegador WebIDL que proporciona un enlace a todas las API que el navegador proporciona en la web.
Este artículo incorpora texto de un trabajo de contenido gratuito . Licenciado bajo Licencia Apache 2.0 (declaración/permiso de licencia). Texto tomado de Formato de texto, jfbastien; cromo rossberg; kripken; titzer; s3ththompson; código pez luna; lukewagner; banderaxor; enricobacis; c3d; binji; andrewosh, GitHub. WebAsamblea/diseño.