Los árboles no son solo follaje: ASTs y uso práctico

Rate this content
Bookmark

Los ASTs son prevalentes en todo lo que hacemos. ESLint, Typescript, etc nos permiten sumergirnos en nuestro código fuente de una manera con la que podríamos no estar familiarizados. Echemos un vistazo a cómo algunas herramientas modernas utilizan ASTs para mejorar nuestras vidas como desarrolladores. Algunas de las herramientas a cubrir incluyen: TS-Morph, Typescript, TreeSitter y ESlint. Dependiendo del tiempo, puedo profundizar en varias herramientas y patrones para trabajar con ASTs y cómo pueden encajar en cualquier flujo de trabajo de desarrollador moderno.

This talk has been presented at React Summit US 2023, check out the latest edition of this React Conference.

FAQ

Un AST, o Árbol de Sintaxis Abstracta, es una estructura que representa las partes importantes de un código, omitiendo detalles menos relevantes como paréntesis o puntos y comas. Su función principal es facilitar la manipulación del código en diversas herramientas de desarrollo.

Los ASTs se utilizan en múltiples áreas como la compilación de código, por ejemplo, convertir TypeScript en JavaScript, el análisis de código mediante herramientas como ESLint, y la edición de código con herramientas como Prettier para formatear código automáticamente.

ESLint utiliza ASTs para permitir a los desarrolladores escribir reglas o extensiones personalizadas que ayuden a mantener los estándares de codificación y realizar análisis de código, mejorando la calidad y consistencia del software.

Herramientas como Babel, TypeScript, ESLint y Prettier utilizan ASTs para realizar tareas como compilación de código, análisis, formateo y más, mejorando la eficiencia y calidad del trabajo de los desarrolladores.

Prettier es una herramienta de formateo de código que descompone el código en un AST y luego lo reconstruye siguiendo un estilo estándar. Esto asegura que el código sea consistente y legible sin que los desarrolladores tengan que formatearlo manualmente.

TypeScript utiliza ASTs para transformar código TypeScript en JavaScript. Esto es parte del proceso de compilación donde el código es analizado, manipulado y luego generado en un formato que los navegadores pueden entender y ejecutar.

Tree sitter es una herramienta que soporta análisis de sintaxis para múltiples lenguajes y está integrada en editores como NeoVim. Escrito en C, es altamente portátil y puede incluso compilarse en wasm para usarse en navegadores, facilitando el desarrollo de IDEs o editores de texto online.

Chris Griffing
Chris Griffing
9 min
15 Nov, 2023

Comments

Sign in or register to post your comment.

Video Summary and Transcription

Los ASTs, o árboles de sintaxis abstracta, son utilizados por herramientas populares como Babel, TypeScript, ESlint y Prettier para mejorar la experiencia del desarrollador. Tienen varios casos de uso, incluyendo la compilación y el análisis de código. Las herramientas de edición y escritura pueden ser mejoradas usando ASTs, con ejemplos que incluyen el formateo con Prettier, las anotaciones de tipo en los editores de JetBrains y los mods de código para actualizaciones de marco. Ts-morph es una herramienta útil para las transformaciones de código, mientras que Tree Sitter es una herramienta portátil que soporta muchos idiomas y puede ser utilizada para construir IDEs o editores de texto en el navegador.

1. Introducción a los ASTs

Short description:

Hoy hablaré sobre los ASTs y cómo los árboles no son solo follaje. Los ASTs, o árboles de sintaxis abstracta, representan las partes importantes de nuestro código. Herramientas populares como Babel, TypeScript, ESlint y Prettier utilizan ASTs para mejorar la experiencia del desarrollador. Los ASTs tienen varios casos de uso, incluyendo la compilación y el análisis de código. ESLint, una herramienta basada en ASTs, se utiliza ampliamente para el análisis de código.

Hola a todos. Mi nombre es Chris y hoy hablaré sobre los ASTs y cómo los árboles no son solo follaje. Primero, ¿quién soy? Transmito programación demasiado en Twitch, soy un YouTuber perezoso, y soy un ingeniero senior de front end en Fairwinds. En Fairwinds, podemos ayudarte a optimizar y gestionar tus clusters de Kubernetes a gran escala. Entonces, primero, ¿qué es un AST? Es un tipo de árbol de sintaxis. Los árboles de sintaxis concreta representan cada detalle de nuestro código. Eso significa los paréntesis, los corchetes, los puntos y comas, la indentación, todo. Los árboles de sintaxis abstracta en realidad representan las partes importantes de nuestro código. Entonces, si pensamos en una declaración if, la cláusula y el bloque son nodos separados pero aún relacionados y vinculados entre sí. Echemos un vistazo a una imagen que lo explica un poco más. Entonces, aquí tenemos un ejemplo de una secuencia de declaraciones. Dentro de esa secuencia de declaraciones vemos un bucle while y una declaración de retorno. Dentro del bucle while, vemos la condición y el cuerpo. Y dentro de la condición, vemos un operador de comparación y las cosas que se comparan. Todas estas cosas se ramifican y se unen, casi como un árbol genealógico, lo cual es bastante interesante. Algunas herramientas populares que la mayoría de nosotros usamos día a día son Babel, TypeScript, ESlint y Prettier. Todos estos utilizan ASTs para mejorar nuestra experiencia de desarrollador. Entonces, ¿qué están haciendo? ¿Cuáles son algunos casos de uso comunes para ellos? ¿Por qué querrías usar ASTs para escribir herramientas de desarrollo? Bueno, algunos casos de uso son la compilación, el análisis de código, las herramientas de edición tooling, y los mods de código. Para la compilación, podríamos pensar tal vez en TypeScript siendo convertido en JavaScript a través de TSC, que significa TypeScript Compiler. En el pasado, convertir ES6 en ES5 a través de Babel es una forma de hacerlo. Ahora usamos versiones más modernas de JavaScript en navegadores que aún no los soportan. Eso es lo que está haciendo Babel. Y técnicamente, Babel solía llamarse six-to-five cuando estaba limitado a ES6 y ES5. También tenemos JSX siendo convertido en React.createElement. Ese es otro paso del compilador. Y los compiladores en general para otros lenguajes, sabes, para convertir C en ensamblador. Esa es otra forma de compilar usando ASTs. Cuando pensamos en análisis de código, probablemente lo primero que pensamos es en ESLint. Pero hay algunas herramientas más antiguas como JSHint que no estaban basadas en AST. La razón por la que ESLint es la que todos nos importa y pensamos en estos días es porque es más fácil escribir una regla o una extensión para ESLint a través de ASTs en lugar de la forma en que JSHint lo hacía en el pasado.

2. Herramientas de edición y escritura con ASTs

Short description:

Para las herramientas de edición, podríamos considerar el formato con Prettier, las anotaciones de tipo en los editores de JetBrains, el resaltado de sintaxis con resaltado semántico en VS Code y los mods de código para actualizaciones de marco. La escritura de herramientas utilizando ASTs implica el uso de TypeScript (ts), unist, tsmorph y tree sitter. Unist proporciona una línea de base para otras herramientas como HAST, MDEST, ZAST, SAS, SCS y less. Ts-morph es útil para transformaciones de código como react-code-mod.

Para las herramientas de edición, podríamos considerar el formato. Prettier descompone nuestro código en un AST y lo reconstruye con la indentación estándar, donde van los corchetes, todas esas cosas de una manera puramente estándar que no tenemos que preocuparnos o hacer manualmente, lo cual es genial. Las anotaciones de tipo en los editores de JetBrains son realmente geniales. Así que podrías obtener los nombres de los argumentos de una función anotados. Si no estás pasando un objeto con props, si estás pasando argumentos ordenados, tener esos nombres es realmente agradable como una experiencia de desarrollador. También pueden anotar tipos inferidos cuando estás asignando una variable o un valor de retorno.

Otro aspecto realmente interesante de las herramientas de edición es el resaltado de sintaxis. Ten en cuenta que la mayoría de los resaltados de sintaxis se basan en gramáticas de texto, que son fundamentalmente expresiones regulares bajo el capó, pero VS Code incluye una característica llamada resaltado semántico que utiliza conocimientos de los servidores de lenguaje para varios lenguajes para darnos un resaltado un poco más preciso de lo que está pasando en nuestro código.

Y finalmente, los mods de código. Así que piensa en las actualizaciones de marco. Hoy en día, no tenemos que hacer import React from React, y si tienes una base de código que está haciendo eso, si has actualizado tus empaquetadores o compiladores, es posible que ya no necesites hacer eso. Así que en su lugar, podríamos tener un mod de código de React que lo elimine automáticamente en toda la base de código en lugar de ir archivo por archivo, eliminando manualmente esas cosas. Otra opción es convertir la función dot bind this en una función de flecha, que es lo que un dot bind this para una función está haciendo bajo el capó, pero es solo azúcar sintáctica. Todas estas cosas son agradables para los autores de marcos y bibliotecas para implementar como cosas que nos ayudan a actualizar y mantenernos al día, porque no quieren tratar y lidiar con bugs para versiones antiguas de su marco de todos modos.

Entonces, ¿cómo podrías escribir algunas herramientas usando ASTs? ¿Cuáles son algunas herramientas o herramientas de escritura? Bueno, veamos ts, es decir, TypeScript. Veamos unist, tsmorph y tree sitter. Esos son los que realmente voy a profundizar. Así que ts es literalmente TypeScript. Solo importarías TypeScript, harías ts dot create source file a partir del fragmento de texto que tienes, y luego puedes iterar cada nodo dentro de ese árbol usando for-each-child, buscando el tipo de nodo que te interesa. Aquí, estoy buscando una declaración de clase A. Unist es muy interesante porque no hay un estándar para cómo los ASTs deben especificar props y cómo podemos entender qué partes del código son y qué tipo de nodo es, etc. Una cosa a recordar, sin embargo, es que unist no está destinado a ser autosuficiente, es una línea de base para que otras cosas la utilicen. Así, HAST para HTML, MDEST para Markdown, ZAST para XML, o SAS para CSS, SCS, y less. Todas estas herramientas añaden sus propias props a ese tipo de nodo que ayudan a darnos un poco más de información sobre qué está haciendo el código y más metadatos que podemos usar para manipular ese código o entenderlo mejor. Una cosa importante es que hay algo así como 32 funciones de utilidad escritas para unist, y probablemente haya incluso más. Todas estas funciones de utilidad pueden ser utilizadas para cualquier árbol de sintaxis compatible con unist, lo que significa que no tienes que escribir muchas de esas funciones de patrón de visitante a mano, lo cual es realmente genial. ts-morph es muy interesante porque es útil para las transformaciones de código. Piensa en mods de código como react-code-mod. Creo que react-code-mod usa JS code shift, pero podría estar equivocado al respecto. Pero aún así, ts-morph es algo que tengo experiencia

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
This Talk discusses modern web debugging and the latest updates in Chrome DevTools. It highlights new features that help pinpoint issues quicker, improved file visibility and source mapping, and ignoring and configuring files. The Breakpoints panel in DevTools has been redesigned for easier access and management. The Talk also covers the challenges of debugging with source maps and the efforts to standardize the source map format. Lastly, it provides tips for improving productivity with DevTools and emphasizes the importance of reporting bugs and using source maps for debugging production code.
Los tipos más útiles de React
React Day Berlin 2023React Day Berlin 2023
21 min
Los tipos más útiles de React
Top Content
Today's Talk focuses on React's best types and JSX. It covers the types of JSX and React components, including React.fc and React.reactnode. The discussion also explores JSX intrinsic elements and react.component props, highlighting their differences and use cases. The Talk concludes with insights on using React.componentType and passing components, as well as utilizing the react.element ref type for external libraries like React-Select.
El Futuro de las Herramientas de Rendimiento
JSNation 2022JSNation 2022
21 min
El Futuro de las Herramientas de Rendimiento
Top Content
Today's Talk discusses the future of performance tooling, focusing on user-centric, actionable, and contextual approaches. The introduction highlights Adi Osmani's expertise in performance tools and his passion for DevTools features. The Talk explores the integration of user flows into DevTools and Lighthouse, enabling performance measurement and optimization. It also showcases the import/export feature for user flows and the collaboration potential with Lighthouse. The Talk further delves into the use of flows with other tools like web page test and Cypress, offering cross-browser testing capabilities. The actionable aspect emphasizes the importance of metrics like Interaction to Next Paint and Total Blocking Time, as well as the improvements in Lighthouse and performance debugging tools. Lastly, the Talk emphasizes the iterative nature of performance improvement and the user-centric, actionable, and contextual future of performance tooling.
TypeScript y React: Secretos de un matrimonio feliz
React Advanced Conference 2022React Advanced Conference 2022
21 min
TypeScript y React: Secretos de un matrimonio feliz
Top Content
React and TypeScript have a strong relationship, with TypeScript offering benefits like better type checking and contract enforcement. Failing early and failing hard is important in software development to catch errors and debug effectively. TypeScript provides early detection of errors and ensures data accuracy in components and hooks. It offers superior type safety but can become complex as the codebase grows. Using union types in props can resolve errors and address dependencies. Dynamic communication and type contracts can be achieved through generics. Understanding React's built-in types and hooks like useState and useRef is crucial for leveraging their functionality.
Haciendo Magia: Construyendo un Marco de Trabajo Primero-TypeScript
TypeScript Congress 2023TypeScript Congress 2023
31 min
Haciendo Magia: Construyendo un Marco de Trabajo Primero-TypeScript
Top Content
Daniel Rowe discusses building a TypeScript-first framework at TypeScript Congress and shares his involvement in various projects. Nuxt is a progressive framework built on Vue.js, aiming to reduce friction and distraction for developers. It leverages TypeScript for inference and aims to be the source of truth for projects. Nuxt provides type safety and extensibility through integration with TypeScript. Migrating to TypeScript offers long-term maintenance benefits and can uncover hidden bugs. Nuxt focuses on improving existing tools and finds inspiration in frameworks like TRPC.
Deja de Escribir tus Rutas
Vue.js London 2023Vue.js London 2023
30 min
Deja de Escribir tus Rutas
Designing APIs is a challenge, and it's important to consider the language used and different versions of the API. API ergonomics focus on ease of use and trade-offs. Routing is a misunderstood aspect of API design, and file-based routing can simplify it. Unplugging View Router provides typed routes and eliminates the need to pass routes when creating the router. Data loading and handling can be improved with data loaders and predictable routes. Handling protected routes and index and ID files are also discussed.

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.
Dominando conceptos avanzados en TypeScript
React Summit US 2023React Summit US 2023
132 min
Dominando conceptos avanzados en TypeScript
Top Content
Featured WorkshopFree
Jiri Lojda
Jiri Lojda
TypeScript no es solo tipos e interfaces. Únete a esta masterclass para dominar características más avanzadas de TypeScript que harán tu código a prueba de balas. Cubriremos tipos condicionales y notación de inferencia, cadenas de plantillas y cómo mapear sobre tipos de unión y propiedades de objetos/arrays. Cada tema se demostrará en una aplicación de muestra que se escribió con tipos básicos o sin tipos en absoluto y juntos mejoraremos el código para que te familiarices más con cada característica y puedas llevar este nuevo conocimiento directamente a tus proyectos.
Aprenderás:- - ¿Qué son los tipos condicionales y la notación de inferencia?- ¿Qué son las cadenas de plantillas?- Cómo mapear sobre tipos de unión y propiedades de objetos/arrays.
Consejos y Trucos Profundos de TypeScript
Node Congress 2024Node Congress 2024
83 min
Consejos y Trucos Profundos de TypeScript
Top Content
Featured Workshop
Josh Goldberg
Josh Goldberg
TypeScript tiene un sistema de tipos poderoso con todo tipo de características sofisticadas para representar estados de JavaScript salvajes y extravagantes. Pero la sintaxis para hacerlo no siempre es sencilla, y los mensajes de error no siempre son precisos al decirte qué está mal. Vamos a profundizar en cómo funcionan muchas de las características más poderosas de TypeScript, qué tipos de problemas del mundo real resuelven, y cómo dominar el sistema de tipos para que puedas escribir código TypeScript verdaderamente excelente.
Mejores Prácticas y Consejos Avanzados de TypeScript para Desarrolladores de React
React Advanced Conference 2022React Advanced Conference 2022
148 min
Mejores Prácticas y Consejos Avanzados de TypeScript para Desarrolladores de React
Top Content
Featured Workshop
Maurice de Beijer
Maurice de Beijer
¿Eres un desarrollador de React tratando de obtener los máximos beneficios de TypeScript? Entonces esta es la masterclass para ti.En esta masterclass interactiva, comenzaremos desde lo básico y examinaremos los pros y contras de las diferentes formas en que puedes declarar componentes de React usando TypeScript. Después de eso, pasaremos a conceptos más avanzados donde iremos más allá de la configuración estricta de TypeScript. Aprenderás cuándo usar tipos como any, unknown y never. Exploraremos el uso de predicados de tipo, guardias y comprobación exhaustiva. Aprenderás sobre los tipos mapeados incorporados, así como cómo crear tus propias utilidades de mapa de tipo nuevo. Y comenzaremos a programar en el sistema de tipos de TypeScript usando tipos condicionales e inferencia de tipos.
Building Your Own Custom Type System
React Summit 2024React Summit 2024
38 min
Building Your Own Custom Type System
Featured Workshop
Kunal Dubey
Kunal Dubey
I'll introduce the audience to a concept where they can have end-to-end type systems that helps ensure typesafety across the teams Such a system not only improves communication between teams but also helps teams collaborate effectively and ship way faster than they used to before. By having a custom type system, teams can also identify the errors and modify the API contracts on their IDE, which contributes to a better Developer Experience. The workshop would primarily leverage TS to showcase the concept and use tools like OpenAPI to generate the typesystem on the client side. 
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.