JavaScript a Wasi Habilitado Wasm: Composición Portátil de JavaScript

Rate this content
Bookmark

JavaScript ya no es un lenguaje limitado a los navegadores. Nuevos estándares están permitiendo entornos de ejecución totalmente portátiles y livianos, para hacer de JavaScript el lenguaje definitivo para aplicaciones isomórficas.

Exploraremos casos de uso, algunos experimentales, otros consolidados, para llevar nuestro juego de Wasm con JavaScript al siguiente nivel.

FAQ

WebAssembly, también conocido como Wasm, es un formato de instrucciones binarias que permite ejecutar código de alto rendimiento en navegadores. No es un lenguaje de programación, sino un objetivo de compilación para lenguajes como C, C++ o Rust.

WebAssembly se puede integrar con JavaScript a través de la API de JavaScript, permitiendo que los módulos de Wasm se importen y se utilicen dentro de aplicaciones JavaScript. Esto se hace mediante la compilación del código en Wasm y su posterior importación y ejecución dentro del motor de JavaScript.

WebAssembly permite ejecutar operaciones intensivas en CPU a un nivel más bajo que el código JavaScript típico, lo que resulta en una ejecución más eficiente. Esto es especialmente útil para tareas de procesamiento pesado como la búsqueda de texto completo en el lado del cliente.

WASI, o la Interfaz del Sistema WebAssembly, es un estándar que permite ejecutar WebAssembly fuera de los navegadores en un entorno seguro y controlado. Proporciona interfaces compatibles con POSIX, facilitando la portabilidad del código a diferentes plataformas y sistemas.

WebAssembly se ejecuta en un entorno completamente encapsulado, asegurando que el código no pueda acceder ni modificar la memoria fuera de sus límites designados. Esto limita la interacción con otros procesos y componentes, reduciendo los riesgos de actividades maliciosas y ataques a la cadena de suministro.

Sí, es posible ejecutar WebAssembly en entornos no basados en navegador siempre que se proporcionen interfaces adicionales como WASI. Esto permite que WebAssembly se ejecute en un tiempo de ejecución especial, incluso en metal desnudo, ampliando su aplicabilidad más allá de los navegadores.

El desarrollo con WASI puede implicar más capas para depurar y entender el origen de los problemas, dado que las nuevas tecnologías son inestables y propensas a cambios en las definiciones de API. Además, no todas las interfaces están disponibles para todos los lenguajes de programación.

Natalia Venditto
Natalia Venditto
21 min
15 Feb, 2024

Comments

Sign in or register to post your comment.

Video Summary and Transcription

El código JavaScript se convierte en binarios de bajo nivel mediante motores de JavaScript como MV8, Chakra y SpiderMonkey. WebAssembly permite escribir código en otros lenguajes y compilarlo para ejecutarlo en un motor de JavaScript. Las funciones externas se pueden importar en WebAssembly utilizando la declaración de importación. WebAssembly puede ejecutarse en escenarios no relacionados con el navegador con interfaces adicionales como WASI y proporciona aislamiento de memoria. La herramienta Jco es una herramienta experimental para componentizar el código JavaScript en módulos WASM.

1. Introduction to JavaScript and WebAssembly

Short description:

Soy una líder principal de experiencia de desarrollo de JavaScript en Azure, que abarca integraciones, servicios de alojamiento y cómputo. El código JavaScript pasa por un flujo de ejecución en el navegador, desde el análisis hasta la generación de código. Los motores de JavaScript como MV8, Chakra y SpiderMonkey convierten el código en binarios de bajo nivel. WebAssembly es un formato de instrucciones binarias que nos permite escribir código en otros lenguajes y compilarlo para que se ejecute en un motor de JavaScript. Funciona en base a importaciones y exportaciones.

Hola a todos. Mi nombre es Natalia Bendito y soy una líder principal de experiencia de desarrollo de JavaScript de extremo a extremo en los muchos servicios y herramientas que pueden ser utilizados por los desarrolladores de JavaScript para construir aplicaciones en Azure. Eso incluye integraciones como GitHub Actions o extensiones de VS Code, servicios de alojamiento como Azure Static Web Apps, o cómputo como Azure Container Apps o Azure Functions. Cuando construimos aplicaciones de JavaScript, sabemos que nuestro código o scripts pasan básicamente por este flujo de ejecución en el navegador. Cada instrucción pasa por este viaje justo a tiempo. El analizador o motor de JavaScript genera una estructura jerárquica llamada árbol de sintaxis abstracta o AST. Por ejemplo, una declaración de variable es un constructo de nodo de declaración de variable en AST, que el intérprete lee y genera código binario de alto nivel a partir de él. Finalmente, el compilador genera código binario de bajo nivel que se comunica con la CPU de una manera que puede ser entendida según la arquitectura del procesador o CPU. Todo esto ocurre nuevamente justo a tiempo. Este flujo es principalmente el trabajo del motor de JavaScript. MV8 es uno de los más populares, pero también existen Chakra, SpiderMonkey y otros. El código de máquina generado puede estar optimizado para un conjunto específico de instrucciones que son, nuevamente, óptimas para una arquitectura específica, como mencionamos antes. Esto significa que estamos convirtiendo nuestro código de JavaScript de alto nivel en binarios de bajo nivel. Los motores de JavaScript pueden encargarse de la inicialización del entorno o encargarse de la inicialización del entorno. Añaden funciones integradas y también ejecutan nuestro código de aplicación. El motor también proporciona el tiempo de ejecución en el que se ejecutará la aplicación. Los scripts de JavaScript se ejecutan en un motor de JavaScript, obviamente, pero ¿qué más se ejecuta en un motor de JavaScript, si lo piensas a ese nivel bajo? Eso es, por supuesto, WebAssembly.

¿Qué es WebAssembly más concretamente, o Wasm, como algunos lo llaman? No es realmente un lenguaje. Es un formato de instrucciones binarias. El objetivo de compilación significa que escribimos nuestro código en el lenguaje que preferimos siempre y cuando tenga una cadena de herramientas o compilador de Wasm que nos permita hacerlo y lo compilamos a binario como Wasm para ejecutarlo en ese nivel bajo que describimos antes. ¿Cómo funciona realmente WebAssembly? Imaginemos que tenemos un programa escrito en C, C++, Rust o cualquier otro lenguaje que sea compatible, y queremos compilarlo a Wasm. Usamos su correspondiente cadena de herramientas o conjunto de herramientas de desarrollo, y eso es a lo que me refería antes con que sea compatible. Tiene este conjunto de herramientas de desarrollo y compiladores, que emitirán ese código como un módulo, que importa y exporta. Luego podemos importarlo en nuestro JavaScript para que se ejecute con un motor de JavaScript utilizando las uniones de WebAssembly JavaScript o la API de JavaScript. Wasm no define realmente ninguna API. Funciona como mencionamos sobre la base de importaciones y exportaciones. Este es un ejemplo de un módulo escrito en texto de WebAssembly. Recorramos este ciclo.

2. Using External Functions in WebAssembly

Short description:

La declaración de importación se utiliza para importar una función externa, como println del módulo de entorno. La sección de funciones exporta la función hello world. La sección de memoria declara el tamaño de la memoria y la sección de datos inicializa la memoria con una cadena. Al importar el módulo en JavaScript, obtenemos el módulo, procesamos la respuesta, compilamos los datos binarios y creamos una instancia del módulo. Podemos redirigir la salida de la función print line a console.log. WebAssembly nos permite ejecutar operaciones intensivas en CPU a un nivel más bajo y componer interfaces de usuario. Page find es un ejemplo de uso de WebAssembly para la ingestión de documentos, indexación y búsqueda de texto completo en el lado del cliente. Podemos lograr esto en un sitio web estático utilizando WebAssembly.

Creo que es importante comenzar con la declaración de importación que se utiliza para importar una función externa porque no tenemos nada en las API nativas de Wasm. Estamos importando esta función externa llamada println desde un módulo llamado environment. Esta función toma un solo parámetro de tipo I32 o entero de 32 bits. La función importada se le da el nombre de dollar println. Ahora, en la siguiente sección, tenemos la sección de funciones. La función se exporta con el nombre hello world. Luego tenemos otra sección, la sección de memoria, que básicamente declara el tamaño de la memoria. En este caso, una página. Finalmente, tenemos la sección de datos que inicializa la memoria, en este caso en el desplazamiento cero con una cadena UTF-8, hello world de JavaScript. Ahora, lo que creo que es realmente interesante es lo que sucede en JavaScript que importa este módulo o busca este módulo. Obtenemos el módulo que exportamos a un archivo llamado hello world.wasm. Luego, la respuesta se procesa utilizando response.arrive buffer para obtener los datos binarios del módulo. Luego usamos la función WebAssembly.compile para compilar los datos binarios que obtuvimos del paso anterior en un módulo de WebAssembly. Usamos el constructor WebAssembly.instance para crear una instancia del módulo de WebAssembly compilado. Como puedes ver, hay un objeto de entorno proporcionado en el segundo parámetro del constructor, que incluye una función importante llamada print line. ¿Recuerdas el archivo anterior? Esta función importante se asigna a console log. El propósito de esta asignación es redirigir cualquier salida de la función print line del módulo de WebAssembly, como se define en el código de texto de WebAssembly que proporcionamos antes, a la función console.log de JavaScript. Y finalmente, la función exportada hello world se invoca desde el módulo de WebAssembly utilizando instance.exports.hello world o hello world.

Dado que tenemos la capacidad de buscar y ejecutar Wasm, como acabamos de ver, como parte de nuestros programas de JavaScript, podemos componer interfaces de usuario donde ejecutamos operaciones intensivas en CPU a un nivel mucho más bajo o inferior que nuestros programas de JavaScript típicos se ejecutan de una manera más eficiente. Exploraremos un caso de uso específico de este tipo de composición. Propongamos que tenemos un sitio web estático, como uno creado con cualquier metaframework hoy en día, como Astro, y así sucesivamente, utilizando la obtención de datos estáticos. Y queremos ejecutar una funcionalidad de búsqueda para ese contenido estático. Bueno, podemos hacerlo con JavaScript en el lado del cliente, pero también podemos usar WebAssembly. Así que lo usaremos. Y page find es un gran ejemplo de una característica de Wasm que hace, en este caso, la ingestión de documentos, la indexación y ejecuta la búsqueda de texto completo, filtrado, ordenación, etc., todo en el lado del cliente a un nivel muy bajo en WebAssembly. Permíteme mostrarte ahora exactamente cómo funciona page find. Estamos en el sitio de documentación, pero iremos a Starlight, un marco para construir sitios de documentación con Astro. Si prestamos atención a la parte superior izquierda, veremos que tenemos una barra de búsqueda. Aunque este es un sitio generado estáticamente, ¿cómo funciona esto? Ejecutemos una búsqueda de algo como div. Notaremos que obtenemos resultados inmediatos.

Check out more articles and videos

We constantly think of articles and videos that might spark Git people interest / skill us up or help building a stellar career

Depuración Web Moderna
JSNation 2023JSNation 2023
29 min
Depuración Web Moderna
Top Content
Pocos desarrolladores disfrutan depurando, y la depuración puede ser compleja para las aplicaciones web modernas debido a los múltiples marcos, lenguajes y bibliotecas utilizados. Pero, las herramientas de desarrollo han avanzado mucho en facilitar el proceso. En esta charla, Jecelyn profundizará en el estado moderno de la depuración, las mejoras en DevTools y cómo puedes usarlas para depurar tus aplicaciones de manera confiable.
Utilizando Rust desde Vue con WebAssembly
Vue.js London Live 2021Vue.js London Live 2021
8 min
Utilizando Rust desde Vue con WebAssembly
Top Content
Rust es un nuevo lenguaje para escribir código de alto rendimiento, que puede ser compilado a WebAssembly, y ejecutado dentro del navegador. En esta charla se te guiará sobre cómo puedes integrar Rust, dentro de una aplicación Vue, de una manera que es sencilla y fácil. Con ejemplos de cómo interactuar con Rust desde JavaScript, y algunas de las trampas a tener en cuenta.
El Futuro de las Herramientas de Rendimiento
JSNation 2022JSNation 2022
21 min
El Futuro de las Herramientas de Rendimiento
Top Content
Nuestra comprensión del rendimiento y la experiencia del usuario ha evolucionado mucho a lo largo de los años. Las herramientas de desarrollo web necesitan evolucionar de manera similar para asegurarse de que sean centradas en el usuario, accionables y contextuales donde se refiere a las experiencias modernas. En esta charla, Addy te guiará a través de cómo Chrome y otros han estado pensando en este problema y qué actualizaciones han estado haciendo a las herramientas de rendimiento para reducir la fricción para construir grandes experiencias en la web.
Haciendo JavaScript en WebAssembly Rápido
JSNation Live 2021JSNation Live 2021
29 min
Haciendo JavaScript en WebAssembly Rápido
Top Content
JavaScript en el navegador se ejecuta muchas veces más rápido de lo que lo hacía hace dos décadas. Y eso sucedió porque los proveedores de navegadores pasaron ese tiempo trabajando en intensivas optimizaciones de rendimiento en sus motores JavaScript.Debido a este trabajo de optimización, JavaScript ahora se está ejecutando en muchos lugares además del navegador. Pero todavía hay algunos entornos donde los motores JS no pueden aplicar esas optimizaciones de la manera correcta para hacer las cosas rápidas.Estamos trabajando para resolver esto, comenzando una nueva ola de trabajo de optimización de JavaScript. Estamos mejorando el rendimiento de JavaScript para entornos completamente diferentes, donde se aplican reglas diferentes. Y esto es posible gracias a WebAssembly. En esta charla, explicaré cómo funciona todo esto y qué vendrá a continuación.
Creando lo Imposible: Virtualización X86 en el Navegador con WebAssembly
JSNation 2022JSNation 2022
21 min
Creando lo Imposible: Virtualización X86 en el Navegador con WebAssembly
WebAssembly es una característica del navegador diseñada para brindar un rendimiento predecible y alto a las aplicaciones web, pero sus capacidades a menudo son mal entendidas.
Esta charla explorará cómo WebAssembly es diferente de JavaScript, desde el punto de vista tanto del desarrollador como del motor del navegador, con un enfoque particular en la implementación V8/Chrome.
WebVM es nuestra solución para ejecutar eficientemente binarios x86 sin modificaciones en el navegador y muestra lo que se puede hacer con WebAssembly hoy en día. Se discutirá una descripción general de los componentes del proyecto, incluido el motor JIT, la capa de emulación de Linux y el backend de almacenamiento, seguido de demostraciones en vivo.
pnpm: un gestor de paquetes rápido y eficiente para JavaScript
DevOps.js Conf 2022DevOps.js Conf 2022
31 min
pnpm: un gestor de paquetes rápido y eficiente para JavaScript
Aprenderás sobre uno de los gestores de paquetes más populares para JavaScript y sus ventajas sobre npm y Yarn.Una breve historia de los gestores de paquetes de JavaScriptLa estructura aislada de node_modules creada por pnpmQué hace que pnpm sea tan rápidoQué hace que pnpm sea eficiente en el uso del espacio en discoSoporte para monoreposGestión de versiones de Node.js con pnpm

Workshops on related topic

React, TypeScript y TDD
React Advanced Conference 2021React Advanced Conference 2021
174 min
React, TypeScript y TDD
Top Content
Featured WorkshopFree
Paul Everitt
Paul Everitt
ReactJS es extremadamente popular y, por lo tanto, ampliamente soportado. TypeScript está ganando popularidad y, por lo tanto, cada vez más soportado.

¿Los dos juntos? No tanto. Dado que ambos cambian rápidamente, es difícil encontrar materiales de aprendizaje precisos.

¿React+TypeScript, con los IDEs de JetBrains? Esa combinación de tres partes es el tema de esta serie. Mostraremos un poco sobre mucho. Es decir, los pasos clave para ser productivo, en el IDE, para proyectos de React utilizando TypeScript. En el camino, mostraremos el desarrollo guiado por pruebas y enfatizaremos consejos y trucos en el IDE.