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
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
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
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.
Comments