Ensamblaje web
La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la
versión revisada el 17 de marzo de 2022; las comprobaciones requieren
5 ediciones .
WebAssembly (abreviado como wasm ) es un lenguaje de programación de bajo nivel para la máquina virtual de pila, diseñado como un objetivo de compilación portátil para lenguajes de alto nivel como C , C++ , C# , Rust , Go . Una máquina virtual de pila que ejecuta instrucciones en formato binario wasm se puede ejecutar tanto en un entorno de navegador como en un entorno de servidor. El código Wasm es un árbol de sintaxis abstracta portátil , que proporciona un análisis más rápido y una ejecución más eficiente en comparación con JavaScript .
El proyecto comenzó el 17 de junio de 2015 [4] , el 15 de marzo de 2016 se demostró el trabajo del juego Angry Bots del conjunto de muestras para Unity en el navegador Chromium [5] . Inicialmente, el proyecto se basó en asm.js [6] y PNaCl [7] . En marzo de 2017, la comunidad de desarrolladores llegó a un acuerdo sobre un formato binario, una API para JavaScript y un intérprete de referencia. A fines de mayo de 2017, el equipo del proyecto Chromium anunció planes para desaprobar PNaCl a favor de WebAssembly [8] .
A partir de 2021, el equipo de WebAssembly incluye desarrolladores de Mozilla , Google , Microsoft y Apple , que representan los cuatro navegadores más comunes en el mercado: Firefox , Chrome , Microsoft Edge y Safari , respectivamente [7] .
Presentación
La siguiente tabla muestra tres representaciones diferentes del mismo código fuente tal como se tradujo a wasm:
codigo fuente c
|
"código de bytes de ensamblaje lineal"
|
código binario WASM
|
int factorial ( int n ) {
si ( norte == 0 )
devolver 1 ;
más
devuelve n * factorial ( n -1 );
}
|
obtener_local 0
i64.eqz
si i64
i64.const 1
más
obtener_local 0
obtener_local 0
i64.const 1
i64.sub
llamada 0
i64.mul
final
|
2000
cincuenta
047e
42 01
05
2000
2000
42 01
7d
1000
7e
0b
|
El compilador usa internamente una representación de expresión s , que contiene más información que el "código de bytes de ensamblaje lineal". Por ejemplo:
( módulo
( escriba $FUNCSIG$dd ( func ( parámetro f64 ) ( resultado f64 ) ) ) ( import " global.Math " " exp" ( func $exp ( parámetro f64 ) ( resultado f64 ) )) ( memoria 256 256 ) ( exportar "memoria" ( memoria 0 )) ( func $doubleExp ( parámetro $0 f64 ) ( resultado f64 ) ( f64.mul ( llamar $exp ( get_local $0 ) ) ( f64.const 2 ) ) ) ( exportar "doubleExp" ( func $exp doble )) )
Soporte
La compilación en WebAssembly es compatible con muchos idiomas, la implementación se encuentra en diferentes etapas [9] :
- C y C ++ : a través del conjunto de herramientas Emscripten y Binaryen, se proporciona compilación a asm.js y wasm, utiliza LLVM .
- C# , a través de Blazor y Uno Platform, basado en mono .
- Rust : el soporte experimental para compilar en wasm se admite desde la versión 1.14 [10] .
- Elixir y Erlang : a través del compilador Lumen, diseñado específicamente para WebAssembly [11] .
- Go : el soporte experimental para compilar en wasm se admite desde la versión 1.11 [12] .
- TypeScript : a través de AssemblyScript .
- D - LDC desde la versión 1.11 admite compilar y vincular código D directamente en WebAssembly [13] .
- Lazarus : admite ensamblaje en WebAssembly [14]
Compatibilidad con navegador
La implementación de WebAssembly ha estado en todos los principales navegadores (excepto Internet Explorer) desde finales de 2017 [15] :
A partir de julio de 2021, el 94 % de los navegadores instalados son compatibles con WebAssembly [20] . Para navegadores heredados, hay un polyfill asm.js [7] .
Notas
- ↑ 2.0.0 . (indefinido)
- ↑ http://webassembly.org/roadmap/
- ↑ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/instantiateStreaming
- ↑ Trabajando en el futuro de las aplicaciones de compilación a web . Blog de Mike Holman (17 de junio de 2015). Consultado el 7 de junio de 2017. Archivado desde el original el 2 de junio de 2017.
- ↑ Wagner, Luke Un hito de WebAssembly: soporte experimental en varios navegadores . Mozilla Hacks (14 de marzo de 2016). Consultado el 6 de junio de 2017. Archivado desde el original el 11 de agosto de 2017. (indefinido)
- ↑ WebAssembly: un formato binario para la web . ②ality - JavaScript y más (18 de junio de 2015). Consultado el 2 de febrero de 2016. Archivado desde el original el 5 de febrero de 2016.
- ↑ 1 2 3 Bright, Peter La Web está obteniendo su código de bytes: WebAssembly . Ars Technica . Condé Nast (18 de junio de 2015). Consultado el 20 de noviembre de 2015. Archivado desde el original el 21 de noviembre de 2015. (indefinido)
- ↑ ¡Adiós PNaCl, hola WebAssembly! (inglés) (30 de mayo de 2017). Consultado el 10 de junio de 2017. Archivado desde el original el 30 de mayo de 2017.
- ↑ Awesome WebAssembly Languages . Consultado el 18 de octubre de 2019. Archivado desde el original el 12 de noviembre de 2019. (indefinido)
- ↑ Anuncio de Rust 1.14 ( 22 de diciembre de 2016). Consultado el 7 de junio de 2017. Archivado desde el original el 5 de mayo de 2017.
- ↑ Una implementación BEAM alternativa, diseñada para WebAssembly: lumen/lumen . — 2019-12-06. Archivado desde el original el 27 de diciembre de 2019.
- ↑ Notas de la versión Go 1.11: el lenguaje de programación Go . tip.golang.org. Consultado el 16 de julio de 2018. Archivado desde el original el 14 de agosto de 2018. (indefinido)
- ↑ Generación de WebAssembly con LDC . Consultado el 13 de noviembre de 2018. Archivado desde el original el 14 de noviembre de 2018. (indefinido)
- ↑ WebAssembly - Wiki gratuito de Pascal . wiki.freepascal.org. Consultado el 15 de mayo de 2020. Archivado desde el original el 11 de octubre de 2021. (indefinido)
- ↑ La compatibilidad con WebAssembly ahora se incluye en todos los navegadores principales . El blog de Mozilla (13 de noviembre de 2017). Consultado el 31 de octubre de 2019. Archivado desde el original el 31 de octubre de 2019.
- ↑ WebAssembly - Estado de la plataforma Chrome . Consultado el 7 de junio de 2017. Archivado desde el original el 17 de febrero de 2017. (indefinido)
- ↑ Firefox 52: Presentación de Web Assembly, CSS Grid y Grid Inspector ( 7 de marzo de 2017). Consultado el 7 de junio de 2017. Archivado desde el original el 27 de mayo de 2017.
- ↑ Nuevas funciones de WebKit en Safari 11 ( 22 de septiembre de 2017). Consultado el 30 de septiembre de 2017. Archivado desde el original el 30 de septiembre de 2017.
- ↑ Presentamos nuevas optimizaciones de JavaScript, WebAssembly, SharedArrayBuffer y Atomics en EdgeHTML 16 ( 31 de octubre de 2017). Consultado el 14 de noviembre de 2017. Archivado desde el original el 15 de noviembre de 2017.
- ↑ Asamblea web . ¿ Puedo usar Consultado el 22 de marzo de 2020. Archivado desde el original el 13 de noviembre de 2021. (indefinido)
Enlaces