Construyendo un motor JS -- ¡Por diversión!

Rate this content
Bookmark

Los motores JS de producción moderna pueden parecer intimidantes, ¡pero eso no es todo lo que hay! Esta charla relámpago se basa en mis experiencias pasadas trabajando en motores JS de aficionados, y cubrirá lo siguiente:


- Diferentes ángulos para abordar esta tarea aparentemente compleja

- Cosas que puedes aprender en el camino

- Algunos proyectos existentes que optimizan por diversión (en lugar de perseguir benchmarks), y lo que los hace únicos


Verás que no necesitas tener experiencia en diseño de compiladores para comenzar a explorar los internos del motor JS. ¡Lo más importante, es divertido!

This talk has been presented at JSNation 2024, check out the latest edition of this JavaScript Conference.

Linus Groh
Linus Groh
9 min
13 Jun, 2024

Comments

Sign in or register to post your comment.

Video Summary and Transcription

La charla discute los fundamentos de la construcción de un motor JS, destacando la complejidad y la completitud de las características de los motores existentes. Enfatiza la posibilidad de crear un motor más simple adaptado a casos de uso específicos y audiencias objetivo. El orador sugiere comenzar en cualquier punto del proceso y proporciona consejos sobre el uso de bibliotecas de análisis, implementación de características en tiempo de ejecución y garantía de corrección a través de pruebas. Además, la charla alienta a explorar los estándares de JavaScript y a participar en la comunidad de código abierto.
Available in English: Building a JS Engine -- For Fun!

1. Conceptos básicos de la construcción de un motor JS

Short description:

Soy Linus, trabajo en Bloomberg en infraestructura de JavaScript. Hoy, quiero hablar sobre la construcción de un motor JS por diversión. Spidermankey, V8 y JavaScript Core son motores JS maduros que hicieron viable JavaScript a gran escala. Sin embargo, son complejos y completos en características, lo que dificulta encontrar algo más simple para implementar. Además, están vinculados a hojas de ruta de productos y requieren una integración extensa. Podemos hacer nuestro propio motor JS utilizando diferentes lenguajes y eligiendo el alcance en función de nuestro caso de uso y público objetivo.

Soy Linus, trabajo en Bloomberg en infraestructura de JavaScript, y quiero hablar brevemente sobre algo que he estado haciendo durante los últimos años, que es construir un motor JS por diversión. Pero primero que nada, retrocedamos un paso. Todos conocemos estos, ¿verdad? Entonces, Spidermankey, V8 y JavaScript Core de WebKit, y son geniales. No estoy aquí para cambiar tu opinión sobre eso. Estos son todos motores JS muy maduros y altamente optimizados y básicamente hicieron que JavaScript fuera viable a scale, y lo hicieron tan popular como es hoy tanto en el cliente como en el servidor. Esto es todo bueno.

Pero, también son muy complejos. Esto tiene una razón, que es en gran medida performance, por lo que no son solo intérpretes simples, tienen estos varios niveles de compiladores just-in-time que crean código nativo, y obviamente, todos existen en navegadores, por lo que necesitan mucha integración con eso, y eso los hace bastante intimidantes y no tan fáciles de entender. También son en gran medida completos en características, por lo que, obviamente, estos han existido durante al menos una década, V8 y los demás incluso más tiempo, por lo que puede ser bastante difícil encontrar algo para implementar que no sea puramente relacionado con el rendimiento, o bastante complejo. Todos son muy competitivos, nuevamente, por una razón, ninguno de estos quiere quedarse atrás, todos quieren mantenerse a la vanguardia de la performance y el cumplimiento, pero, nuevamente, eso puede quitar un poco la diversión. Por último, están vinculados a las hojas de ruta de los productos, al menos en cierto sentido, ya que nuevamente existen en los navegadores y no pueden simplemente hacer lo suyo sino que tienen que seguir todo lo demás alrededor de eso, que es más que solo JavaScript, obviamente. Y ahora puedes simplemente aparecer y participar, pero eso es más o menos la excepción más que la norma. La mayoría de las personas que trabajan en estos están empleadas en Google, o Apple, o Mozilla, y hacen esto como un trabajo a tiempo completo. Pero podemos hacer el nuestro, por diversión, para cambiar eso, y simplemente ver cómo funciona. Primero que nada, necesitas elegir un lenguaje para implementar un lenguaje. Tradicionalmente, eso es C o C++ que te da buena velocidad por defecto y mucho control sobre la memoria y las asignaciones y todo eso. Ahora eso puede ser bastante aterrador para algunas personas. Obviamente, estos lenguajes no son conocidos por ser seguros, tienen muchos problemas que no podemos realmente solucionar debido a la historia. Pero lo bueno es que no tienes que usar C o C++. Hay una larga lista de lenguajes aquí. Encontré al menos una implementación en todos estos, podría haber incluso más, pero tú sabes, podría ser lo que sea, Go, Java, JavaScript, cualquiera de estos. Solo elige lo que quieras. Incluso puedes escribir uno en ensamblador raw86 si eso es lo tuyo. Tú eliges. Luego, a continuación, tienes que elegir un alcance. Podría ser muy simple, solo ES5, todavía existe el transpilador. Puedes usar todas las nuevas características y compilarlas, o cualquier cosa intermedia, como ES6, mézclalo, usa las características más nuevas, o decides apuntar a lo más reciente y grandioso, comúnmente conocido como ES Next, o podrías implementar extensiones personalizadas, por ejemplo, el motor rápido JS, tienen algo como use strict, llamado use math, y eso te da algunas extensiones no estándar. Todo esto depende un poco de cuál sea tu caso de uso y tu público objetivo. Obviamente, un navegador necesita más soporte para varias características que solo una implementación simple que sirve como un complemento, por ejemplo, en un game engine. Y también hay ciertas partes del lenguaje que se conocen comúnmente como Anexo B, que es solo como lo llaman en la especificación.

2. Construyendo un Motor JS

Short description:

Puedes comenzar en cualquier lugar en la construcción de un motor JS. Usa bibliotecas de analizador independientes o crea tu propio AST. Elige qué implementar en el lado de tiempo de ejecución. Sigue la especificación ECMA 262 y realiza pruebas para garantizar la corrección y manejar casos límite. Accede a 50,000 pruebas mantenidas en test262.fyi. Obtén una mejor comprensión de JavaScript e interactúa con los contribuyentes de estándares en GitHub. Explora proyectos divertidos que construyen motores JS.

Esto, puedes omitirlo completamente a menos que estés construyendo un navegador. Existe por razones de legado y, si pudieran eliminarlo, totalmente lo harían, pero, ya sabes, la historia.

De nuevo, tú eliges. Luego, lo siguiente es que tecleas git init, y estás un poco perdido sobre por dónde empezar. Podrías mirarlo usando el ciclo de vida del script, así que, primero pasas el script. Obviamente, necesitas comenzar con el analizador, y luego necesitas algo que ejecute tu script, y luego construyes el tiempo de ejecución al final. Eso no es realmente cierto.

Básicamente puedes comenzar en cualquier lugar. Gracias a muchas herramientas JS, como formateadores y linters, tenemos bibliotecas de analizador independientes que puedes tomar, y luego tienes un inicio rápido, o simplemente escribes tu AST a mano al principio. Eso es algo que hicimos en el motor en el que trabajé. Y luego, puedes agregar el analizador, y ya tienes algo después de eso implementado, y todo encaja bien. En el lado del tiempo de ejecución, de nuevo, eso es enorme, al menos si eliges implementar todo eso, así que solo elige lo que quieras. Podría ser el clásico prototipo de cadena, número, booleano, o algo más emocionante como matrices de tipo, o proxies, simplemente comienza donde quieras. Eso está bien.

Luego, obviamente, necesitas tener una especificación, conocida como ECMA 262. Es muy completa, lo cual es genial. Hoy en día, no se especifica mucho. En gran medida se ve así, por lo que obtienes un pseudocódigo que puedes traducir aproximadamente a tu propio código. Eso puede no parecer muy divertido, pero aún puedes hacer un montón de cosas personalizadas como optimizaciones. Esto se centra realmente en la corrección y el comportamiento. Luego necesitas algunas pruebas, obviamente. Después de haber implementado algunas cosas, necesitas asegurarte de que funciona correctamente, maneja todos los casos límite.

Buenas noticias, obtienes 50,000 pruebas gratis que se mantienen junto a la especificación, por lo que es algo oficial. Hoy en día es un requisito para todo lo que entra en el lenguaje que tiene nuevas pruebas añadidas a la suite de pruebas. Se sabe que muchas características nuevas están completamente probadas. Hay un maravilloso sitio web llamado test262.fyi que rastrea los resultados de todos los motores que existen, y los actualiza todos los días, por lo que puedes ver muy detalladamente qué motor implementa qué cosa y qué tan bien. Personalmente, encuentro que tener un gráfico que te muestra que sube con el tiempo es muy bueno para la motivación.

Más en general, obviamente puedes aprender una gran cantidad de cosas si haces esto. Cosas sobre cómo funcionan los analizadores, los intérpretes, si haces code generation de motor de bytecode, si quieres hacer un JIT incluso, algo de código nativo, ciertas optimizaciones. Para mí, una gran cosa fue una mejor comprensión de JavaScript en sí, así que, una vez que lo implementas realmente, realmente entiendes cómo funcionan las cosas bajo el capó. Algunos conceptos de bajo nivel, y luego uno de mis favoritos es que te expones a los estándares, por lo que estas nuevas características no aparecen de la nada, y tienes la oportunidad de interactuar con las personas que agregan cosas nuevas a JavaScript, e incluso puedes involucrarte. Todo está en GitHub.

Ahora, yo hago esto. Soy un delegado de Bloomberg, pero comencé como un experto invitado en TC39, al igual que el organismo de estándares, y un día se acercaron y pensaron, esto es genial en lo que trabajas, ¿quieres involucrarte? Y finalmente, aquí hay una lista de algunos proyectos que definitivamente deberías revisar si esto te parece interesante. Todos hacen esto por diversión, no aspiran a competir con V8, y todos estos grandes motores, simplemente lo hacen por diversión, así que hay algunos de ellos. Definitivamente revisa eso.

Y eso es todo. Si tienes alguna pregunta, por favor encuéntrame después o en línea. Gracias.

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

Una Guía del Comportamiento de Renderizado de React
React Advanced Conference 2022React Advanced Conference 2022
25 min
Una Guía del Comportamiento de Renderizado de React
Top Content
This transcription provides a brief guide to React rendering behavior. It explains the process of rendering, comparing new and old elements, and the importance of pure rendering without side effects. It also covers topics such as batching and double rendering, optimizing rendering and using context and Redux in React. Overall, it offers valuable insights for developers looking to understand and optimize React rendering.
Escalando con Remix y Micro Frontends
Remix Conf Europe 2022Remix Conf Europe 2022
23 min
Escalando con Remix y Micro Frontends
Top Content
This talk discusses the usage of Microfrontends in Remix and introduces the Tiny Frontend library. Kazoo, a used car buying platform, follows a domain-driven design approach and encountered issues with granular slicing. Tiny Frontend aims to solve the slicing problem and promotes type safety and compatibility of shared dependencies. The speaker demonstrates how Tiny Frontend works with server-side rendering and how Remix can consume and update components without redeploying the app. The talk also explores the usage of micro frontends and the future support for Webpack Module Federation in Remix.
Concurrencia en React, Explicada
React Summit 2023React Summit 2023
23 min
Concurrencia en React, Explicada
Top Content
React 18's concurrent rendering, specifically the useTransition hook, optimizes app performance by allowing non-urgent updates to be processed without freezing the UI. However, there are drawbacks such as longer processing time for non-urgent updates and increased CPU usage. The useTransition hook works similarly to throttling or bouncing, making it useful for addressing performance issues caused by multiple small components. Libraries like React Query may require the use of alternative APIs to handle urgent and non-urgent updates effectively.
Componentes de Full Stack
Remix Conf Europe 2022Remix Conf Europe 2022
37 min
Componentes de Full Stack
Top Content
RemixConf EU discussed full stack components and their benefits, such as marrying the backend and UI in the same file. The talk demonstrated the implementation of a combo box with search functionality using Remix and the Downshift library. It also highlighted the ease of creating resource routes in Remix and the importance of code organization and maintainability in full stack components. The speaker expressed gratitude towards the audience and discussed the future of Remix, including its acquisition by Shopify and the potential for collaboration with Hydrogen.
Depuración de JS
React Summit 2023React Summit 2023
24 min
Depuración de JS
Top Content
Debugging JavaScript is a crucial skill that is often overlooked in the industry. It is important to understand the problem, reproduce the issue, and identify the root cause. Having a variety of debugging tools and techniques, such as console methods and graphical debuggers, is beneficial. Replay is a time-traveling debugger for JavaScript that allows users to record and inspect bugs. It works with Redux, plain React, and even minified code with the help of source maps.
Haciendo JavaScript en WebAssembly Rápido
JSNation Live 2021JSNation Live 2021
29 min
Haciendo JavaScript en WebAssembly Rápido
Top Content
WebAssembly enables optimizing JavaScript performance for different environments by deploying the JavaScript engine as a portable WebAssembly module. By making JavaScript on WebAssembly fast, instances can be created for each request, reducing latency and security risks. Initialization and runtime phases can be improved with tools like Wiser and snapshotting, resulting in faster startup times. Optimizing JavaScript performance in WebAssembly can be achieved through techniques like ahead-of-time compilation and inline caching. WebAssembly usage is growing outside the web, offering benefits like isolation and portability. Build sizes and snapshotting in WebAssembly depend on the application, and more information can be found on the Mozilla Hacks website and Bike Reliance site.

Workshops on related topic

Consejos sobre React Hooks que solo los profesionales conocen
React Summit Remote Edition 2021React Summit Remote Edition 2021
177 min
Consejos sobre React Hooks que solo los profesionales conocen
Top Content
Featured Workshop
Maurice de Beijer
Maurice de Beijer
La adición de la API de hooks a React fue un cambio bastante importante. Antes de los hooks, la mayoría de los componentos tenían que ser basados en clases. Ahora, con los hooks, estos son a menudo componentes funcionales mucho más simples. Los hooks pueden ser realmente simples de usar. Casi engañosamente simples. Porque todavía hay muchas formas en las que puedes equivocarte con los hooks. Y a menudo resulta que hay muchas formas en las que puedes mejorar tus componentes con una mejor comprensión de cómo se puede usar cada hook de React.Aprenderás todo sobre los pros y los contras de los diversos hooks. Aprenderás cuándo usar useState() versus useReducer(). Veremos cómo usar useContext() de manera eficiente. Verás cuándo usar useLayoutEffect() y cuándo useEffect() es mejor.
Diseñando Pruebas Efectivas con la Biblioteca de Pruebas de React
React Summit 2023React Summit 2023
151 min
Diseñando Pruebas Efectivas con la Biblioteca de Pruebas de React
Top Content
Featured Workshop
Josh Justice
Josh Justice
La Biblioteca de Pruebas de React es un gran marco para las pruebas de componentes de React porque responde muchas preguntas por ti, por lo que no necesitas preocuparte por esas preguntas. Pero eso no significa que las pruebas sean fáciles. Todavía hay muchas preguntas que tienes que resolver por ti mismo: ¿Cuántas pruebas de componentes debes escribir vs pruebas de extremo a extremo o pruebas de unidad de nivel inferior? ¿Cómo puedes probar una cierta línea de código que es difícil de probar? ¿Y qué se supone que debes hacer con esa persistente advertencia de act()?
En esta masterclass de tres horas, presentaremos la Biblioteca de Pruebas de React junto con un modelo mental de cómo pensar en el diseño de tus pruebas de componentes. Este modelo mental te ayudará a ver cómo probar cada bit de lógica, si debes o no simular dependencias, y ayudará a mejorar el diseño de tus componentes. Te irás con las herramientas, técnicas y principios que necesitas para implementar pruebas de componentes de bajo costo y alto valor.
Tabla de contenidos- Los diferentes tipos de pruebas de aplicaciones de React, y dónde encajan las pruebas de componentes- Un modelo mental para pensar en las entradas y salidas de los componentes que pruebas- Opciones para seleccionar elementos DOM para verificar e interactuar con ellos- El valor de los mocks y por qué no deben evitarse- Los desafíos con la asincronía en las pruebas de RTL y cómo manejarlos
Requisitos previos- Familiaridad con la construcción de aplicaciones con React- Experiencia básica escribiendo pruebas automatizadas con Jest u otro marco de pruebas unitarias- No necesitas ninguna experiencia con la Biblioteca de Pruebas de React- Configuración de la máquina: Node LTS, Yarn
Master Patrones de JavaScript
JSNation 2024JSNation 2024
145 min
Master Patrones de JavaScript
Featured Workshop
Adrian Hajdin
Adrian Hajdin
Durante este masterclass, los participantes revisarán los patrones esenciales de JavaScript que todo desarrollador debe conocer. A través de ejercicios prácticos, ejemplos del mundo real y discusiones interactivas, los asistentes profundizarán su comprensión de las mejores prácticas para organizar el código, resolver desafíos comunes y diseñar arquitecturas escalables. Al final del masterclass, los participantes ganarán confianza en su capacidad para escribir código JavaScript de alta calidad que perdure en el tiempo.
Puntos Cubiertos:
1. Introducción a los Patrones de JavaScript2. Patrones Fundamentales3. Patrones de Creación de Objetos4. Patrones de Comportamiento5. Patrones Arquitectónicos6. Ejercicios Prácticos y Estudios de Caso
Cómo Ayudará a los Desarrolladores:
- Obtener una comprensión profunda de los patrones de JavaScript y sus aplicaciones en escenarios del mundo real- Aprender las mejores prácticas para organizar el código, resolver desafíos comunes y diseñar arquitecturas escalables- Mejorar las habilidades de resolución de problemas y la legibilidad del código- Mejorar la colaboración y comunicación dentro de los equipos de desarrollo- Acelerar el crecimiento profesional y las oportunidades de avance en la industria del software
Masterclass: Integrando LangChain con JavaScript para Desarrolladores Web
React Summit 2024React Summit 2024
92 min
Masterclass: Integrando LangChain con JavaScript para Desarrolladores Web
Featured Workshop
Vivek Nayyar
Vivek Nayyar
Sumérgete en el mundo de la IA con nuestro masterclass interactivo diseñado específicamente para desarrolladores web. "Masterclass: Integrando LangChain con JavaScript para Desarrolladores Web" ofrece una oportunidad única para cerrar la brecha entre la IA y el desarrollo web. A pesar de la prominencia de Python en el desarrollo de IA, el vasto potencial de JavaScript sigue siendo en gran medida inexplorado. Este masterclass tiene como objetivo cambiar eso.A lo largo de esta sesión práctica, los participantes aprenderán cómo aprovechar LangChain, una herramienta diseñada para hacer que los modelos de lenguaje grandes sean más accesibles y útiles, para construir agentes de IA dinámicos directamente dentro de entornos JavaScript. Este enfoque abre nuevas posibilidades para mejorar las aplicaciones web con funciones inteligentes, desde el soporte al cliente automatizado hasta la generación de contenido y más.Comenzaremos con los conceptos básicos de LangChain y los modelos de IA, asegurando una base sólida incluso para aquellos nuevos en IA. A partir de ahí, nos sumergiremos en ejercicios prácticos que demuestran cómo integrar estas tecnologías en proyectos reales de JavaScript. Los participantes trabajarán en ejemplos, enfrentando y superando los desafíos de hacer que la IA funcione sin problemas en la web.Este masterclass es más que una experiencia de aprendizaje; es una oportunidad de estar a la vanguardia de un campo emergente. Al final, los asistentes no solo habrán adquirido habilidades valiosas, sino que también habrán creado funciones mejoradas con IA que podrán llevar a sus proyectos o lugares de trabajo.Ya seas un desarrollador web experimentado curioso acerca de la IA o estés buscando expandir tus habilidades en áreas nuevas y emocionantes, "Masterclass: Integrando LangChain con JavaScript para Desarrolladores Web" es tu puerta de entrada al futuro del desarrollo web. Únete a nosotros para desbloquear el potencial de la IA en tus proyectos web, haciéndolos más inteligentes, interactivos y atractivos para los usuarios.
Uso de CodeMirror para construir un editor de JavaScript con Linting y AutoCompletado
React Day Berlin 2022React Day Berlin 2022
86 min
Uso de CodeMirror para construir un editor de JavaScript con Linting y AutoCompletado
Top Content
WorkshopFree
Hussien Khayoon
Kahvi Patel
2 authors
Usar una biblioteca puede parecer fácil a primera vista, pero ¿cómo eliges la biblioteca correcta? ¿Cómo actualizas una existente? ¿Y cómo te abres camino a través de la documentación para encontrar lo que quieres?
En esta masterclass, discutiremos todos estos puntos finos mientras pasamos por un ejemplo general de construcción de un editor de código usando CodeMirror en React. Todo mientras compartimos algunas de las sutilezas que nuestro equipo aprendió sobre el uso de esta biblioteca y algunos problemas que encontramos.
Pruebas de Aplicaciones Web utilizando Cypress
TestJS Summit - January, 2021TestJS Summit - January, 2021
173 min
Pruebas de Aplicaciones Web utilizando Cypress
WorkshopFree
Gleb Bahmutov
Gleb Bahmutov
Este masterclass te enseñará los conceptos básicos de cómo escribir pruebas de extremo a extremo utilizando Cypress Test Runner.
Cubriremos la escritura de pruebas, abarcando todas las características de la aplicación, estructurando las pruebas, interceptando solicitudes de red y configurando los datos del backend.
Cualquier persona que conozca el lenguaje de programación JavaScript y tenga NPM instalado podrá seguir el masterclass.