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.

Chris Griffing
Chris Griffing
9 min
15 Nov, 2023

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.

Available in English

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

3. Herramientas AST y Tree Sitter

Short description:

Una cosa a recordar es que ts-morph tiene funciones para manipular el código, pero es posible que necesites escribir funciones personalizadas para recorrer tu código. ESLint te permite crear tus propias herramientas basadas en AST y hacer cumplir los estándares de codificación. Tree sitter es una herramienta portátil escrita en C puro que admite muchos idiomas y se puede compilar en wasm. Se puede utilizar en el navegador para construir IDEs o editores de texto sin un servidor. Algunos analizadores de tree sitter pueden no compilar correctamente en wasm, pero aún puedes admitir más de 40 idiomas en el navegador.

con el que tengo experiencia de mi propio uso, y es bastante útil. Una cosa a recordar, sin embargo, es que no es compatible con unist. Creo que está utilizando un nodo muy similar a TypeScript, por lo que no vas a poder utilizar ninguna de esas funciones de utilidad del ecosistema unist. ts-morph tiene algunas funciones realmente buenas para manipular el código, pero en cuanto a recorrer tu código, es posible que quieras escribir algunas funciones personalizadas para eso. Y eslint es otra forma interesante de crear tus propias herramientas basadas en AST. Podrías escribir tus propias reglas que hagan cumplir los estándares de codificación en tu organización ¡y eso es genial! Una cosa a recordar, sin embargo, es que no es la misma estructura de AST con la que te has familiarizado con unist o TypeScript. La razón de eso es muy simple. Existía antes de que esas cosas fueran lo suficientemente prevalentes como para, ya sabes, construir sobre ellas. Y otra parte interesante de escribir una regla para ESLint es que pasas un objeto a ESLint que tiene una propiedad que es un selector y una función para esa propiedad que es una función de devolución de llamada que ESLint va a llamar mientras recorre el árbol. ¿Por qué es esto importante? Bueno, si cada regla recorriera el árbol de arriba a abajo por sí misma, ESLint sería realmente lento. Así que en su lugar puede hacer un solo recorrido, llamar a tu función de devolución de llamada cuando encuentres un nodo que estás buscando, y luego desde allí puedes navegar en relación con ese nodo que encontraste. Así que todavía puedes recorrer un poco el árbol, pero la mayoría de las veces no quieres hacer un recorrido completo. Y por último, pero no menos importante, tree sitter es muy interesante. Creo que viene con NeoVim por defecto, y admite muchos idiomas. Está escrito en C puro, lo que lo hace realmente portátil. Así que es utilizable en muchos idiomas, y eso significa que también se puede compilar en wasm, lo cual es genial. Como puedes usarlo en tu navegador ahora. Así que podrías escribir básicamente una IDE o un editor de texto de algún tipo con conocimiento específico del analizador allí mismo en el navegador sin necesidad de un servidor. Una cosa a recordar sobre la salida wasm es que algunos de los analizadores para tree sitter no necesariamente se compilan muy bien en wasm. Me encontré con ello hace un par de años, quizás hace un año, donde creo que como ocho de los más de 40 analizadores que tenía disponibles no se compilaban correctamente en wasm lo cual está bien. Pero tal vez lo han mejorado y siempre hay espacio para que se creen más. Así que sí, podrías admitir más de 40 idiomas en el navegador escribiendo tu propia herramienta. Así que sí, sé que pasé por alto algunas cosas, salté un poco rápido, pero espero que tengas suficientes palabras clave y conocimientos para investigar algunas de estas cosas y escribir algunas herramientas que ayuden a mejorar tu vida y la vida de los desarrolladores de tu equipo a tu alrededor. Gracias por dejarme hablar y espero que disfrutes el resto de la masterclass.

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

Modern Web Debugging
JSNation 2023JSNation 2023
29 min
Modern Web Debugging
Top Content
Few developers enjoy debugging, and debugging can be complex for modern web apps because of the multiple frameworks, languages, and libraries used. But, developer tools have come a long way in making the process easier. In this talk, Jecelyn will dig into the modern state of debugging, improvements in DevTools, and how you can use them to reliably debug your apps.
The Future of Performance Tooling
JSNation 2022JSNation 2022
21 min
The Future of Performance Tooling
Top Content
Our understanding of performance & user-experience has heavily evolved over the years. Web Developer Tooling needs to similarly evolve to make sure it is user-centric, actionable and contextual where modern experiences are concerned. In this talk, Addy will walk you through Chrome and others have been thinking about this problem and what updates they've been making to performance tools to lower the friction for building great experiences on the web.
TypeScript and React: Secrets of a Happy Marriage
React Advanced Conference 2022React Advanced Conference 2022
21 min
TypeScript and React: Secrets of a Happy Marriage
Top Content
TypeScript and React are inseparable. What's the secret to their successful union? Quite a lot of surprisingly strange code. Learn why useRef always feels weird, how to wrangle generics in custom hooks, and how union types can transform your components.
React's Most Useful Types
React Day Berlin 2023React Day Berlin 2023
21 min
React's Most Useful Types
Top Content
We don't think of React as shipping its own types. But React's types are a core part of the framework - overseen by the React team, and co-ordinated with React's major releases.In this live coding talk, we'll look at all the types you've been missing out on. How do you get the props type from a component? How do you know what ref a component takes? Should you use React.FC? And what's the deal with JSX.Element?You'll walk away with a bunch of exciting ideas to take to your React applications, and hopefully a new appreciation for the wonders of React and TypeScript working together.
Stop Writing Your Routes
Vue.js London 2023Vue.js London 2023
30 min
Stop Writing Your Routes
The more you keep working on an application, the more complicated its routing becomes, and the easier it is to make a mistake. ""Was the route named users or was it user?"", ""Did it have an id param or was it userId?"". If only TypeScript could tell you what are the possible names and params. If only you didn't have to write a single route anymore and let a plugin do it for you. In this talk we will go through what it took to bring automatically typed routes for Vue Router.
Making Magic: Building a TypeScript-First Framework
TypeScript Congress 2023TypeScript Congress 2023
31 min
Making Magic: Building a TypeScript-First Framework
I'll dive into the internals of Nuxt to describe how we've built a TypeScript-first framework that is deeply integrated with the user's IDE and type checking setup to offer end-to-end full-stack type safety, hints for layouts, middleware and more, typed runtime configuration options and even typed routing. Plus, I'll highlight what I'm most excited about doing in the days to come and how TypeScript makes that possible not just for us but for any library author.

Workshops on related topic

React, TypeScript, and TDD
React Advanced Conference 2021React Advanced Conference 2021
174 min
React, TypeScript, and TDD
Top Content
Featured WorkshopFree
Paul Everitt
Paul Everitt
ReactJS is wildly popular and thus wildly supported. TypeScript is increasingly popular, and thus increasingly supported.

The two together? Not as much. Given that they both change quickly, it's hard to find accurate learning materials.

React+TypeScript, with JetBrains IDEs? That three-part combination is the topic of this series. We'll show a little about a lot. Meaning, the key steps to getting productive, in the IDE, for React projects using TypeScript. Along the way we'll show test-driven development and emphasize tips-and-tricks in the IDE.
Best Practices and Advanced TypeScript Tips for React Developers
React Advanced Conference 2022React Advanced Conference 2022
148 min
Best Practices and Advanced TypeScript Tips for React Developers
Top Content
Featured Workshop
Maurice de Beijer
Maurice de Beijer
Are you a React developer trying to get the most benefits from TypeScript? Then this is the workshop for you.In this interactive workshop, we will start at the basics and examine the pros and cons of different ways you can declare React components using TypeScript. After that we will move to more advanced concepts where we will go beyond the strict setting of TypeScript. You will learn when to use types like any, unknown and never. We will explore the use of type predicates, guards and exhaustive checking. You will learn about the built-in mapped types as well as how to create your own new type map utilities. And we will start programming in the TypeScript type system using conditional types and type inferring.
Deep TypeScript Tips & Tricks
Node Congress 2024Node Congress 2024
83 min
Deep TypeScript Tips & Tricks
Top Content
Workshop
Josh Goldberg
Josh Goldberg
TypeScript has a powerful type system with all sorts of fancy features for representing wild and wacky JavaScript states. But the syntax to do so isn't always straightforward, and the error messages aren't always precise in telling you what's wrong. Let's dive into how many of TypeScript's more powerful features really work, what kinds of real-world problems they solve, and how to wrestle the type system into submission so you can write truly excellent TypeScript code.
Practice TypeScript Techniques Building React Server Components App
TypeScript Congress 2023TypeScript Congress 2023
131 min
Practice TypeScript Techniques Building React Server Components App
Workshop
Maurice de Beijer
Maurice de Beijer
In this hands-on workshop, Maurice will personally guide you through a series of exercises designed to empower you with a deep understanding of React Server Components and the power of TypeScript. Discover how to optimize your applications, improve performance, and unlock new possibilities.
 
During the workshop, you will:
- Maximize code maintainability and scalability with advanced TypeScript practices
- Unleash the performance benefits of React Server Components, surpassing traditional approaches
- Turbocharge your TypeScript with the power of Mapped Types
- Make your TypeScript types more secure with Opaque Types
- Explore the power of Template Literal Types when using Mapped Types
 
Maurice will virtually be by your side, offering comprehensive guidance and answering your questions as you navigate each exercise. By the end of the workshop, you'll have mastered React Server Components, armed with a newfound arsenal of TypeScript knowledge to supercharge your React applications.
 
Don't miss this opportunity to elevate your React expertise to new heights. Join our workshop and unlock the potential of React Server Components with TypeScript. Your apps will thank you.
Advanced TypeScript types for fun and reliability
TypeScript Congress 2022TypeScript Congress 2022
116 min
Advanced TypeScript types for fun and reliability
Workshop
Maurice de Beijer
Maurice de Beijer
If you're looking to get the most out of TypeScript, this workshop is for you! In this interactive workshop, we will explore the use of advanced types to improve the safety and predictability of your TypeScript code. You will learn when to use types like unknown or never. We will explore the use of type predicates, guards and exhaustive checking to make your TypeScript code more reliable both at compile and run-time. You will learn about the built-in mapped types as well as how to create your own new type map utilities. And we will start programming in the TypeScript type system using conditional types and type inferring.
Are you familiar with the basics of TypeScript and want to dive deeper? Then please join me with your laptop in this advanced and interactive workshop to learn all these topics and more.
You can find the slides, with links, here: http://theproblemsolver.nl/docs/ts-advanced-workshop.pdf
And the repository we will be using is here: https://github.com/mauricedb/ts-advanced
Mastering Node.js Test Runner
TestJS Summit 2023TestJS Summit 2023
78 min
Mastering Node.js Test Runner
Workshop
Marco Ippolito
Marco Ippolito
Node.js test runner is modern, fast, and doesn't require additional libraries, but understanding and using it well can be tricky. You will learn how to use Node.js test runner to its full potential. We'll show you how it compares to other tools, how to set it up, and how to run your tests effectively. During the workshop, we'll do exercises to help you get comfortable with filtering, using native assertions, running tests in parallel, using CLI, and more. We'll also talk about working with TypeScript, making custom reports, and code coverage.