Video Summary and Transcription
WebAssembly permite optimizar el rendimiento de JavaScript para diferentes entornos mediante la implementación del motor JavaScript como un módulo WebAssembly portátil. Al hacer que JavaScript en WebAssembly sea rápido, se pueden crear instancias para cada solicitud, reduciendo la latencia y los riesgos de seguridad. Las fases de inicialización y tiempo de ejecución se pueden mejorar con herramientas como Wiser y la toma de instantáneas, lo que resulta en tiempos de inicio más rápidos. La optimización del rendimiento de JavaScript en WebAssembly se puede lograr mediante técnicas como la compilación anticipada y el almacenamiento en caché en línea. El uso de WebAssembly está creciendo fuera de la web, ofreciendo beneficios como aislamiento y portabilidad. Los tamaños de construcción y la toma de instantáneas en WebAssembly dependen de la aplicación, y se puede encontrar más información en el sitio web de Mozilla Hacks y en el sitio de Bike Reliance.
1. Introducción a WebAssembly
Hola, soy Lynn Clark, y hago caricaturas de code. Hoy, quiero explicar qué es lo que permite a WebAssembly optimizar el rendimiento de JavaScript para diferentes entornos. Comencemos entendiendo cómo estamos ejecutando JavaScript dentro de un motor de WebAssembly.
Hola, soy Lynn Clark, y hago caricaturas de code. También trabajo en Fastly, que está haciendo un montón de cosas geniales con WebAssembly para hacer posible una mejor computación en el borde. Y soy cofundadora de la Alianza Bytecode. Estamos trabajando en herramientas para un ecosistema de WebAssembly que se extiende más allá del navegador. Y es una de esas herramientas de las que quería hablarles hoy. JavaScript fue creado inicialmente para ejecutarse en el navegador, para que las personas pudieran agregar un poco de interactividad a sus páginas web. Nadie habría adivinado que 20 años después, las personas estarían usando JavaScript para construir todo tipo de aplicaciones grandes y complejas para ejecutar en un navegador. Lo que hizo esto posible es que JavaScript en el navegador se ejecuta mucho 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 algunas optimizaciones de performance bastante intensivas. Esto comenzó con la introducción de los compiladores justo a tiempo alrededor de 2008. Y los navegadores han construido sobre eso, continuando estos esfuerzos de optimization. Ahora estamos comenzando a trabajar en la optimización del rendimiento de JavaScript para un conjunto completamente diferente de entornos donde se aplican reglas diferentes. Y esto es posible gracias a WebAssembly. Así que, hoy quiero explicar qué es lo que permite WebAssembly. Pero primero, quiero darles un aviso. Esta charla está estructurada un poco diferente a como los expertos en oratoria me dirían que debería estar estructurando esta presentación. Voy a empezar contándoles cómo estamos haciendo que esto funcione en absoluto. Y una vez que hayan escuchado eso, es posible que no estén de acuerdo. Podrían pensar que esta es una idea bastante ridícula. Así que, por eso voy a explicar por qué. Voy a explicar por qué querrían hacer esto en realidad. Y luego, una vez que estén convencidos, y sé que estarán convencidos, entonces volveré y explicaré exactamente cómo es que estamos haciendo que esto sea rápido.
Entonces, comencemos con cómo estamos ejecutando JavaScript dentro de un motor de WebAssembly. Siempre que estás ejecutando JavaScript, el code JS necesita ser ejecutado como code de máquina de una forma u otra. Ahora, esto lo hace el motor JS utilizando una variedad de técnicas diferentes. Desde intérpretes y compiladores JIT. Y expliqué esto con más detalle en mi primer conjunto de artículos sobre WebAssembly en 2017. Así que, si quieres entender más sobre cómo funciona esto, puedes volver y leer esos artículos. Ejecutar este code de JavaScript es realmente bastante fácil en entornos como la Web donde sabes que vas a tener un motor de JavaScript disponible. ¿Pero qué pasa si tu plataforma objetivo no tiene un motor de JavaScript? Entonces necesitas desplegar tu motor de JavaScript con tu code.
2. Ejecutando JavaScript en WebAssembly
Entonces, eso es lo que necesitamos hacer para llevar JavaScript a diferentes entornos. Desplegamos el motor de JavaScript como un módulo de WebAssembly, lo que lo hace portátil en diferentes arquitecturas de máquinas y sistemas operativos. El entorno de JavaScript se agrupa en el módulo y, una vez desplegado, puedes ejecutar código JavaScript. Sin embargo, ejecutar JavaScript dentro de WebAssembly es lento porque solo puede usar el intérprete, no el JIT. ¿Pero qué pasaría si pudiéramos hacer que se ejecute rápido? Este enfoque sería útil en plataformas donde un JIT no está permitido debido a preocupaciones de seguridad, como dispositivos iOS o televisores inteligentes. También ayudaría con los tiempos de inicio en funciones sin servidor, reduciendo la latencia.
Entonces, eso es lo que necesitamos hacer para llevar JavaScript a estos diferentes entornos. Entonces, ¿cómo lo hacemos? Bueno, desplegamos el motor de JavaScript como un módulo de WebAssembly, y eso lo hace portátil en un montón de diferentes arquitecturas de máquinas. Con WASI, podemos hacerlo portátil en un montón de diferentes sistemas operativos también. Esto significa que todo el entorno de JavaScript se agrupa en el módulo de WebAssembly. Y una vez que lo despliegas, todo lo que necesitas hacer es alimentar el código de JavaScript, y ese motor de JavaScript ejecutará ese código. Ahora, en lugar de trabajar directamente en la memoria de la máquina como lo haría para un navegador, el motor de JavaScript pone todo, desde el código de bytes hasta los objetos recolectados por el recolector de basura que el código de bytes trabaja, en la memoria lineal de la memoria de WebAssembly. Para nuestro motor JS, optamos por SpiderMonkey, y ese es el motor JS que utiliza Firefox. Es una de las máquinas virtuales de JavaScript de fuerza industrial, porque ha sido probada en la batalla en el navegador. Y este tipo de pruebas de batalla e inversión en seguridad es realmente importante cuando estás ejecutando código no confiable o ejecutando código que procesa entrada no confiable. SpiderMonkey también utiliza una técnica llamada escaneo de pila preciso, que es importante para algunas de las optimizaciones que describiré un poco más adelante en la charla.
Hasta ahora, no hay nada revolucionario en el enfoque que he descrito. La gente ya ha estado ejecutando JavaScript dentro de WebAssembly de esta manera durante varios años. El problema es que es lento. WebAssembly no te permite generar dinámicamente nuevo código de máquina y ejecutarlo desde dentro del código puro de WebAssembly. Entonces, esto significa que no puedes usar el JIT. Solo puedes usar el intérprete. Ahora, dada esta restricción, podrías estar preguntando por qué. Dado que los JIT son cómo los navegadores hicieron que el código JS se ejecute rápido, y dado que no puedes compilar JIT dentro de un módulo de WebAssembly, esto simplemente no tiene sentido. Pero, ¿qué pasaría si, incluso con estas restricciones, pudiéramos hacer que este JavaScript se ejecute rápido? Veamos un par de casos de uso donde una versión rápida de este enfoque podría ser realmente útil. Hay algunos lugares donde no puedes usar un compilador justo a tiempo debido a preocupaciones de seguridad. Entonces, por ejemplo, dispositivos iOS o algunos televisores inteligentes y consolas de juegos. En estas plataformas, tienes que usar un intérprete. Pero los tipos de aplicaciones que ejecutas en estas plataformas son de larga duración y requieren mucho código y esas son exactamente las condiciones en las que históricamente no querrías usar un intérprete debido a cuánto ralentiza tu ejecución. Si podemos hacer que nuestro enfoque sea rápido, entonces estos desarrolladores podrían usar JavaScript en plataformas sin JIT sin tomar un gran golpe en el rendimiento. Ahora, hay otros lugares donde usar un JIT no es un problema, pero donde los tiempos de inicio son prohibitivos. Entonces, un ejemplo de esto es en las funciones serverless y esto juega en ese problema de latencia de inicio en frío del que podrías haber oído hablar a la gente. Incluso si estás usando el entorno de JavaScript más reducido, que es un aislante que solo inicia un motor de JavaScript desnudo, estás buscando alrededor de cinco milisegundos de latencia de inicio. Ahora, hay algunas formas de ocultar esta latencia de inicio para una solicitud entrante. Pero es cada vez más difícil de ocultar a medida que los tiempos de conexión se optimizan en la capa de red con propuestas como QUIC. Y es más difícil de ocultar cuando estás encadenando funciones serverless
3. Inicialización y tiempo de ejecución del motor JavaScript
Las plataformas que utilizan técnicas para ocultar la latencia a menudo reutilizan instancias entre solicitudes, lo que puede llevar a problemas de seguridad. Los desarrolladores a menudo no siguen las mejores prácticas y meten múltiples funciones en un solo despliegue sin servidor, lo que resulta en un radio de explosión más grande. Al hacer que JavaScript en WASM sea rápido, podemos proporcionar una nueva instancia para cada solicitud, eliminando el estado entre solicitudes y reduciendo el radio de explosión. Para lograr esto, necesitamos entender las dos partes del motor JavaScript: inicialización y tiempo de ejecución. La inicialización implica la configuración de recursos y la lectura del código fuente, mientras que la inicialización del motor inicia el motor JS y añade funciones incorporadas al entorno.
juntos. Pero más que esto, las plataformas que utilizan este tipo de técnicas para ocultar la latencia a menudo también reutilizan instancias entre solicitudes. Y en algunos casos, esto significa que el estado global puede ser observado entre diferentes solicitudes, lo que puede ser un problema de security. Y debido a este problema de inicio en frío, los desarrolladores a menudo no siguen las best practices. Meten muchas funciones en un solo despliegue serverless. Así que, esto resulta en otro problema de security, que es un radio de explosión más grande. Si una parte del despliegue serverless es explotada, el atacante tiene acceso a todo en ese despliegue. Pero si podemos conseguir que los tiempos de inicio de JavaScript sean lo suficientemente bajos en estos contextos, entonces no necesitaríamos ocultar los tiempos de inicio con ningún truco. Podríamos simplemente iniciar una instancia en microsegundos.
Con esto, podemos proporcionar una nueva instancia para cada solicitud, lo que significa que no hay estado residual entre solicitudes. Y como las instancias son tan ligeras, los desarrolladores podrían sentirse libres de dividir su code en piezas de grano fino. Y esto reduciría su radio de explosión a un mínimo para cualquier pieza de code. Así que, para estos casos de uso, hay un gran beneficio en hacer que JavaScript en WASM sea rápido. Pero, ¿cómo podemos hacer eso? Para responder a esa pregunta, necesitamos entender dónde pasa su tiempo el motor de JavaScript. Podemos desglosar el trabajo que tiene que hacer un motor de JavaScript en dos partes diferentes. Inicialización y tiempo de ejecución. Pienso en el motor JS como un contratista. Este contratista es contratado para completar un trabajo, y ese trabajo es ejecutar el code de JavaScript y llegar a un resultado final. Antes de que este contratista pueda realmente empezar a ejecutar el proyecto, sin embargo, necesita hacer un poco de trabajo preliminar. Esta fase de inicialización incluye todo lo que sólo necesita suceder una vez al principio del proyecto. Así que, una parte de esto es la inicialización de la aplicación. Para cualquier proyecto, el contratista necesita echar un vistazo al trabajo que el cliente quiere que haga y luego configurar los recursos que necesita para completar ese trabajo. Así que, por ejemplo, el contratista lee el briefing del proyecto y otros documentos de apoyo y los convierte en algo con lo que pueda trabajar. Así que, esto podría ser algo como configurar el sistema de gestión del proyecto con todos los documentos almacenados y organizados y desglosar las cosas en tareas que van al sistema de gestión de tareas. En el caso del motor JS, esto funciona más como leer a través del nivel superior del código fuente code y parsear funciones en el byte code, o asignar memoria para las variables que son declaradas y establecer valores donde ya están definidos. Así que, eso es la inicialización de la aplicación. Pero en algunos casos, también hay inicialización del motor. Y ves esto en contextos como serverless. El motor JS en sí mismo necesita ser iniciado en primer lugar. Y las funciones incorporadas necesitan ser añadidas al entorno. Pienso en esto como configurar la oficina en sí misma.
4. Mejorando la Inicialización con Instantáneas
Hacer cosas como montar las sillas y mesas de Ikea y todo lo demás en el entorno antes de comenzar el trabajo puede llevar bastante tiempo, lo que hace que el inicio en frío sea un problema para los casos de uso sin servidor. La velocidad de ejecución del código, conocida como rendimiento, está influenciada por las características del lenguaje, la previsibilidad del código, las estructuras de datos utilizadas y el tiempo de ejecución del código. Para hacer el trabajo en las fases de inicialización y tiempo de ejecución más rápido, utilizamos una herramienta llamada Wiser. Con Wiser, logramos un tiempo de inicio seis veces más rápido en una pequeña aplicación de markdown, con el 80% del tiempo dedicado a la inicialización del motor. La instantánea, una técnica en la que el código JavaScript se ejecuta hasta el final de la fase de inicialización y el byte de código resultante se almacena en la memoria lineal, permite un inicio rápido al adjuntar la memoria como una sección de datos a un módulo Wasm.
Hacer cosas como montar las sillas y mesas de Ikea y todo lo demás en el entorno antes de comenzar el trabajo. Ahora, esto puede llevar bastante tiempo. Y eso es parte de lo que puede hacer que el inicio en frío sea un problema para los casos de uso de serverless. Una vez que la fase de inicialización ha terminado, el motor JS puede comenzar su trabajo. Este trabajo de ejecutar el code. Y la velocidad de esta parte del trabajo se llama rendimiento. Y este rendimiento está afectado por muchas variables diferentes. Así, por ejemplo, qué características del lenguaje se están utilizando. Si el code se comporta de manera predecible desde el punto de vista del motor JS. Qué tipos de estructuras de data se utilizan y si el code se ejecuta lo suficiente como para beneficiarse del compilador de optimización del motor JS.
Así que estas son las dos fases en las que el motor JS pasa su tiempo. Inicialización y tiempo de ejecución. Ahora, ¿cómo podemos hacer que el trabajo en estas dos fases sea más rápido? Empecemos con la inicialización. ¿Podemos hacer que sea rápida? Y alerta de spoiler, sí, podemos. Utilizamos una herramienta llamada Wiser para esto. Y explicaré cómo funciona en un minuto. Pero primero quiero mostrarles algunos de los resultados que vimos. Probamos con una pequeña aplicación de markdown. Y usando Wiser, pudimos hacer que el tiempo de inicio fuera seis veces más rápido. Si miramos más a fondo en este caso, alrededor del 80% de esto se gastó en la inicialización del motor. Y el 20% restante se gastó en la inicialización de la aplicación. Y parte de eso es porque este renderizador de markdown es una aplicación muy pequeña y sencilla. A medida que las aplicaciones se vuelven más grandes y complejas, el tiempo de inicialización de la aplicación simplemente lleva más tiempo. Así que veríamos aceleraciones comparativas aún mayores para aplicaciones del mundo real. Ahora, obtenemos este inicio rápido utilizando una técnica llamada instantáneas. Antes de que el code se despliegue, como parte del paso de construcción, ejecutamos el code de JavaScript usando el motor de JavaScript hasta el final de la fase de inicialización. Y en este punto, el motor JS ha analizado todo el byte code o JS y lo ha convertido en byte code, que el módulo del motor JS almacena en la memoria lineal. Y el motor también hace mucho de asignación e inicialización de memoria en esta fase. Debido a que esta memoria lineal es tan autónoma, una vez que todos los valores han sido llenados, podemos simplemente tomar esa memoria y adjuntar como una sección de data a un módulo Wasm. Cuando el módulo del motor JS se instancia, tiene acceso
5. Gestión de Memoria y Separación de Módulos
Siempre que el motor necesita un poco de memoria, puede copiar la sección necesaria en su propia memoria lineal. Esto elimina la necesidad de configuración cuando el motor se inicia. La sección de datos puede enviarse por separado, permitiendo que el módulo del motor JS se reutilice en diferentes aplicaciones. El módulo específico de la aplicación contiene el bytecode de JavaScript y el estado del motor JS, lo que facilita su movimiento y despliegue.
a todos los data en la sección data. Siempre que el motor necesita un poco de esa memoria, puede copiar la sección o más bien la página de memoria que necesita en su propia memoria lineal. Con esto, el motor JS no tiene que hacer ninguna configuración cuando se inicia. Todo esto está pre-inicializado, listo y esperando para que comience su trabajo.
Actualmente, adjuntamos la sección data al mismo módulo que el motor JS, pero en el futuro, una vez que el enlace de módulos de WebAssembly esté en su lugar, podremos enviar la sección data como un módulo separado. Esto proporciona una separación realmente limpia y permite que el módulo del motor JS se reutilice en un montón de diferentes aplicaciones JS. El módulo del motor JS sólo contiene el code para el motor. Eso significa que una vez que está compilado, ese code puede ser efectivamente almacenado en caché y reutilizado entre muchas instancias diferentes.
Ahora, por otro lado, el módulo específico de la aplicación no contiene ningún code de WebAssembly. Sólo contiene la memoria lineal, que a su vez, contiene el bytecode de JavaScript, junto con todo el resto del estado del motor JS que fue inicializado. Esto hace que sea realmente fácil mover esta memoria y enviarla donde sea necesario. Es como si el contratista del motor JS no necesitara configurar su propia oficina en absoluto. Simplemente recibe este maletín de viaje, y ese maletín tiene toda la oficina, con todo en ella ya configurado y listo para ir, para que el motor JS simplemente se ponga a trabajar. Y lo más genial de esto es que no depende de nada que sea dependiente de JS. Sólo está utilizando una propiedad existente de WebAssembly en sí. Por lo tanto, podrías usar la misma técnica con lenguajes como Python o Ruby o Lua y otros
6. Optimizando el Rendimiento de JavaScript
Entonces, con este enfoque, podemos lograr un tiempo de inicio súper rápido. Para JavaScript de corta duración, el rendimiento es similar al del navegador. Sin embargo, para JavaScript de larga duración, el JIT comienza a marcar una diferencia notable. Aunque la compilación JIT no es posible en un módulo puro de WebAssembly, podemos aplicar un pensamiento similar a la compilación anticipada. Una técnica de optimización es el almacenamiento en caché en línea, que almacena traducciones de código interpretado con frecuencia para su reutilización. Estas traducciones, llamadas stubs, se basan en los tipos utilizados. Al parametrizar los stubs de IC, podemos crear un único stub que carga valores de la memoria y cubre patrones comunes en el código de JavaScript. Con solo unos pocos kilobytes de stubs de IC, podemos cubrir la mayoría del código JS, como el 95% del JavaScript en el benchmark Octane de Google.
tiempos de ejecución, también. Entonces, con este enfoque, podemos llegar a este tiempo de inicio súper rápido. ¿Pero qué pasa con el rendimiento? Bueno, para algunos casos de uso, el rendimiento en realidad no es tan malo. Si tienes un fragmento de JavaScript muy corto, no pasaría por el JIT de todos modos. Se quedaría en el intérprete todo el tiempo. Entonces, en ese caso, el rendimiento sería aproximadamente el mismo que en el navegador. Y entonces, esto habría terminado antes de que un motor tradicional de JavaScript hubiera terminado la inicialización en el caso de que necesites hacer la inicialización del motor. Pero para JavaScript de larga duración, no pasa mucho tiempo antes de que el JIT comience a entrar en acción. Y una vez que esto sucede, la diferencia de rendimiento se vuelve bastante obvia. Ahora, como dije antes, no es posible compilar JIT code dentro de un módulo puro de WebAssembly en este momento. Pero resulta que podemos aplicar parte del mismo pensamiento que viene con la compilación justo a tiempo a un modelo de compilación anticipada. Entonces, una técnica de optimización que utilizan los JIT es el almacenamiento en caché en línea, que también expliqué en mi primera serie sobre WebAssembly. Cuando el mismo fragmento de code se interpreta una y otra vez, el motor decide almacenar su traducción para ese fragmento de code para reutilizarla la próxima vez. Y la traducción almacenada se llama stub. Ahora, estos stubs se encadenan en una lista enlazada, y se basan en qué tipos se utilizan para esa invocación en particular. La próxima vez que se ejecute el code, el motor revisará esta lista para ver si tiene o no una traducción que esté disponible para esos tipos, y, si es así, simplemente reutilizará el stub. Debido a que los subs de ICE se utilizan comúnmente en JITs, la gente piensa en ellos como algo muy dinámico, y específico para cada programa, pero resulta que también pueden aplicarse en un contexto de AoT. Incluso antes de ver el code de JavaScript, ya sabemos muchos de los stubs de ICE que vamos a necesitar para generar. Y eso es porque hay algunos patterns en JavaScript que simplemente se utilizan mucho. Un buen ejemplo de esto es el acceso a propiedades en objetos. Esto sucede mucho en el code de JavaScript. Y puede acelerarse utilizando un stub de IC. Para objetos que tienen una cierta forma o clase oculta, es decir, donde las propiedades están dispuestas en el mismo orden, cuando obtienes una propiedad en particular de esos objetos, esa propiedad siempre estará en el mismo desplazamiento.
Tradicionalmente, este tipo de stub de IC en el JIT codificaría dos valores. El puntero a la forma y el desplazamiento de la propiedad. Eso requiere información que no tenemos con anticipación. Pero lo que podemos hacer es parametrizar el stub de IC, por lo que podemos tratar la forma y el desplazamiento de la propiedad como variables que se pasan al stub. Y de esta manera podemos crear un único stub que carga valores de la memoria y luego usar ese mismo code de stub en todas partes. Podemos simplemente hornear todos los stubs para estos patterns comunes en el módulo compilado AOT independientemente de lo que el JavaScript esté haciendo en realidad. Y descubrimos que con solo un par de kilobytes de stubs de IC, podemos cubrir la gran mayoría de todo el code de JS. Por ejemplo, con dos kilobytes de stubs de IC,
7. Esfuerzos de Optimización y Conclusión
A partir de las pruebas preliminares, podemos ver que los esfuerzos de optimización están mostrando resultados prometedores. Todavía tenemos mucho trabajo por hacer para encontrar los atajos inteligentes que se pueden utilizar en este contexto. Si te emociona esto y quieres contribuir o intentar hacer que esto funcione para otro lenguaje, como Python, Ruby o Lua, nos encantaría escuchar de ti. Gracias a los organizadores por invitarme a hablar aquí hoy y gracias a todos por escuchar.
podemos cubrir el 95% del JavaScript en el benchmark Octane de Google. Y a partir de las pruebas preliminares, ese porcentaje parece mantenerse también para la navegación web general. Ahora, este es solo un ejemplo de una posible optimización que podemos hacer. En este momento, estamos en la misma posición que los motores JS de los navegadores estaban en los primeros días cuando estaban experimentando con compiladores justo a tiempo en primer lugar. Todavía tenemos mucho trabajo por hacer para encontrar los atajos inteligentes que podemos usar en este contexto. Pero estamos emocionados de comenzar ese trabajo y emocionados por los cambios que vendrán.
Si te emociona esto como a nosotros y quieres contribuir a los esfuerzos de optimización, o si quieres intentar hacer que esto funcione para otro lenguaje, como Python, Ruby o Lua, nos encantaría escuchar de ti. Puedes encontrarnos en la plataforma de mensajería, Zulip, y no dudes en publicar allí si quieres pedir más información. También puedes encontrar enlaces a los proyectos que mencioné en mi reciente post en el blog de Bytecode Alliance. Quiero agradecer a los organizadores por invitarme a hablar
Uso de WebAssembly y Preguntas y Respuestas
Con el 55% diciendo que no y el 40% diciendo que quieren, no es sorprendente que muchas personas estén usando WebAssembly sin darse cuenta. Aún es temprano en términos de herramientas para el ecosistema, pero a medida que las cosas progresen, más personas comenzarán a apuntar a WebAssembly. Aunque no se utiliza ampliamente en los Países Bajos, las empresas pueden adoptarlo en el futuro. Ahora, pasemos a las preguntas y respuestas.
aquí hoy y gracias a todos por escuchar. Hola. Bueno verte. Bueno verte también. Entonces, con el 55% tenemos no, pero quiero y el 40% dijo que no. ¿Te sorprende esto? ¿Es esto lo que esperabas? No, no me sorprende. Todavía es bastante temprano en términos de las tooling para el ecosystem. Hay muchas personas que están usando WebAssembly como usuarios sin darse cuenta. Entonces, por supuesto, si estás usando Facebook, estás usando WebAssembly cuando subes una foto. Entonces, hay muchas personas que realmente están usando esto en el lado del usuario sin darse cuenta. Hay muchas personas también que lo están usando porque está incrustado en modules que están usando. Y eso tiene sentido. Mucha gente no se da cuenta de que están usando WebAssembly. Creo que a medida que las cosas progresen, la gente se dará cuenta cada vez más de que cuando están usando WebAssembly, van a comenzar a apuntar a WebAssembly en ciertos casos, como con el trabajo de JavaScript a WebAssembly.
Sí, de nuevo, aquí estás hablando más de que las personas lo están usando como consumidor pero no como desarrollador. Sí. Sí, no me sorprende en absoluto. Quiero decir, aunque ha estado alrededor durante mucho tiempo. Realmente salto de cliente a cliente cada año y nunca escucho en ningún lugar donde se use todavía aquí en los Países Bajos. Entonces, por supuesto, habrá empresas pero no en mi experiencia. Entonces, no me sorprende. Entonces, pasemos a las preguntas y respuestas. Tenemos algunas preguntas de nuestra audiencia, y si todavía tienes alguna pregunta para Lynn, puedes ir al canal de Preguntas y Respuestas de la Pista de la Community en Discord. Quiero hacer una pequeña nota, por supuesto, haces tus caricaturas, y bueno, creo que todos aquí deben haberse enamorado de tus diapositivas, y verás un gran aumento en tu tráfico en el sitio web de CodeCartoons. Realmente gran estilo de tus diapositivas. Entonces, quería dar algunos cumplidos por eso. Gracias. Y el sitio web de CodeCartoons no ha sido actualizado en un tiempo. Necesito cuidar eso. Entonces, un gran lugar para encontrarlos es el blog de la alianza de bytecode o el sitio web de hacks de Mozilla. Y en tu Twitter, creo.
El papel de WebAssembly en el desarrollo web y más allá
En la web, tiene sentido mantener el trabajo en JavaScript, excepto para las piezas computacionalmente pesadas. Fuera de la web, WebAssembly ofrece beneficios como aislamiento, pequeña huella y portabilidad. Veremos trabajos interesantes que ocurren fuera de la web, y a medida que las personas quieran usar esas aplicaciones en los sitios web, las traerán de vuelta a la web. Podríamos ver implementaciones de WebAssembly de módulos de JavaScript muy utilizados. Para incorporar WebAssembly en una aplicación existente, considere portar partes computacionalmente pesadas a WebAssembly. Fuera de la web, plataformas como Fastly permiten una fácil implementación de módulos de WebAssembly. En una arquitectura de microservicios, un servicio puede implementarse en WebAssembly.
Sí, y en mi Twitter. Para lo último y lo mejor de Lin, revisa su Twitter.
Veamos, la primera pregunta es de Alexius. ¿Crees que WebAssembly se convertirá en una parte importante del desarrollo web, trayendo otros lenguajes a la web, o se quedará en el área de aplicaciones computacionalmente pesadas? Entonces, creo que este no era el plan, pero creo que en realidad vamos a ver más del desarrollo interesante sucediendo fuera de la web y luego volviendo a la web a través de WebAssembly porque creo que en la web, para la mayoría de las cosas, mantener tu trabajo en JavaScript tiene sentido. Mantenerlo en JavaScript que se ejecuta de forma nativa en el navegador tiene sentido, excepto para esas piezas computacionalmente pesadas. Pero cuando hablas de fuera de la web, obtienes muchos beneficios de WebAssembly. Obtienes el aislamiento, obtienes la pequeña huella, obtienes la portabilidad que no tienes con muchas otras tecnologías. Creo que vamos a ver una gran adopción y trabajo interesante sucediendo fuera de la web. A medida que las personas quieran comenzar a usar esas aplicaciones en sus propios sitios web, lo traerán de vuelta a la web y comenzarán a integrarlo allí. Esa es mi predicción. Eso suena bien. La siguiente pregunta es de Happy to Collaborate. Creo que esta es alguien que quiere ayudar. ¿Crees que existen muchos módulos estándar, muy utilizados que actualmente existen en JavaScript serían imitados o duplicados o reemplazados por equivalentes módulos basados en Wasm? ¿Esto ofrecería una mejor seguridad al consumidor? Me interesaría. ¿Dijiste módulos gestionados? Bueno, módulos muy utilizados, módulos estándar. Entonces, estoy pensando que significa algo como subrayado. Bueno, ese subrayado es como un módulo de NPM. Podría estar hablando sobre módulos incorporados, que son los módulos estandarizados en JavaScript. Y esos son incorporados del navegador. Y luego también está el ecosistema de NPM que tiene muchos módulos comúnmente utilizados. Y sí, creo que vamos a ver implementaciones de esa misma funcionalidad en WebAssembly a veces más rendimiento. Sí, eso sería increíble. La siguiente pregunta es de nuestro asistente Keith. ¿Cuál sería una buena manera de incorporar WebAssembly en una aplicación existente para minimizar el riesgo pero comenzar a sentirse cómodo usándolo y aprovechándolo? ¿Cómo usar WebAssembly en un proyecto existente? Depende de si estás hablando de la web o fuera de la web. Si estás hablando de la web, probablemente quieras estar usando una aplicación donde si tienes algo que es computacionalmente pesado, entonces tiene sentido tomar esa pequeña parte que es computacionalmente pesada y portar ese pequeño bit a WebAssembly. Si estás trabajando fuera de la web, hay plataformas como la que tenemos en Fastly donde puedes poner fácilmente un módulo de WebAssembly como tu, ya sabes, ese es el artefacto que pones para ejecutar en una plataforma de borde computado. Entonces, en ese caso, simplemente vas a iniciar un servicio haciendo WebAssembly. Y así, si tienes una arquitectura de microservicios, entonces puedes
Tamaños de compilación y captura de instantáneas en WebAssembly
Los tamaños de compilación y los costos de ancho de banda de usar WebAssembly dependen de la aplicación. WebAssembly fue diseñado para ser compacto, pero el tamaño puede variar dependiendo del cálculo. La captura de instantáneas es posible en V8, pero la captura de instantáneas del motor solo está disponible con el tiempo de ejecución de WebAssembly. Para obtener más información sobre WebAssembly, consulte mis publicaciones en el blog de Mozilla Hacks o en el sitio de Bike Reliance.
puede hacer uno de sus servicios en WebAssembly. Genial. La siguiente pregunta es de Warlock. ¿Cuáles son los tamaños de compilación en general, los costos de ancho de banda de usar Wasm? Realmente depende del tipo de aplicación que estés haciendo. Los tamaños de compilación son estándar y se diseñaron para ser muy compactos. De hecho, escribí sobre esto en mi primera serie sobre WebAssembly, que puedes encontrar en el blog de Mozilla Hacks. Así que son lo más compactos posible, básicamente. Pero, por supuesto, depende exactamente de qué tipo de cálculo estás haciendo. A veces, todavía será, ya sabes, el equivalente JavaScript seguiría siendo más pequeño, dependiendo de lo que estés haciendo. Vale. Última pregunta para la que tenemos tiempo. Y antes ... Tengo que estornudar. Lo siento. Vale. Lo tengo. Lo tengo. La siguiente pregunta es de Bartos. ¿Es posible la captura de instantáneas con V8 también, o solo se ha explorado en el contexto de WASM? Creo que una cosa que a veces la gente no se da cuenta es que la captura de instantáneas que tienes en V8, eso es aplicaciones. Y esto es algo que ... Esa parte no es nueva. La captura de instantáneas de la aplicación no es nueva. La captura de instantáneas del motor es algo que no tendrías sin el tiempo de ejecución de WebAssembly para hacer esa captura de instantáneas. Porque si estás abriendo un aislante V8, lo que estás iniciando es el aislante en sí. Así que la inicialización del motor también es parte de esto. Muy bien. Genial. Esa fue la última pregunta. Pero tengo una pregunta que siento que es demasiado importante para saltar. Y es de Richard S. Y él dice, ¿dónde puedo aprender más sobre WebAssembly?
Recursos y Preguntas y Respuestas
Puede encontrar más información en el sitio web de Mozilla Hacks o en el sitio de Bike Reliance. Si desea participar en WebAssembly, hay un repositorio de GitHub donde ocurre toda la estandarización. Únete a Lin en Spatial Chat para más discusiones.
Así que he hecho una serie de publicaciones de blog sobre WebAssembly. Puedes encontrarlos en el sitio web de Mozilla Hacks o en el sitio de Bike Reliance. Si quieres involucrarte en WebAssembly, hay un repositorio de GitHub donde ocurre toda la estandarización. Eso es si realmente quieres adentrarte en los detalles a un nivel muy bajo. Genial. Muy bien. Gracias, Lovely. Así que hay algunas preguntas más en el canal de Discord para las que no tenemos tiempo. Pero invitaré a todos los que todavía tienen preguntas para Lin a unirse a Lin en una sala en Spatial Chat, donde ella estará yendo ahora. Así que Lin, muchas gracias por unirte a mí aquí y disfruta de tu Sala de Oradores de Spatial Chat. Gracias. Nos vemos. Adiós.
Comments