Análisis estático en JavaScript: Lo fácil y lo difícil

Rate this content
Bookmark

Todos usamos herramientas de análisis estático como ESLint todos los días para garantizar una mejor calidad de nuestro código. ¿Cómo funciona y qué es complicado en JavaScript, lo que hace que escribir una regla adecuada a menudo no sea trivial?

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

FAQ

El análisis estático de código en JavaScript es un proceso donde un programa examina el código fuente sin ejecutarlo para identificar posibles errores, problemas de seguridad, o generar métricas y advertencias sobre la calidad del código.

El análisis estático examina el código fuente sin ejecutarlo, mientras que el análisis dinámico involucra la ejecución del código y es utilizado en pruebas como la cobertura de código y pruebas unitarias.

Un árbol de sintaxis abstracta (AST) es una representación en forma de árbol del código fuente, que permite realizar análisis más detallados y específicos del mismo, identificando estructuras como funciones, condiciones y bucles.

No, el análisis estático puede identificar muchos tipos de errores y problemas de calidad, pero no todos, ya que algunas deficiencias solo se revelan durante la ejecución del código.

Una regla en el análisis estático es una directriz que el analizador utiliza para evaluar el código. Se implementan en diversos niveles de análisis y pueden ser simples, como verificar el uso correcto de comillas, o complejas, considerando contextos y excepciones específicas.

Ajustar una regla es crucial para minimizar falsos positivos y asegurar que la regla sea relevante y útil en diversos contextos y situaciones específicas del desarrollo de software.

Los niveles de análisis estático en JavaScript incluyen análisis basado en texto, análisis de tokens, árbol de sintaxis abstracta (AST), análisis semántico, análisis de flujo de control y análisis de flujo de datos.

Elena Vilchik
Elena Vilchik
23 min
05 Jun, 2023

Comments

Sign in or register to post your comment.
Video Summary and Transcription
El análisis estático en JavaScript implica analizar el código fuente sin ejecutarlo, produciendo métricas, problemas o advertencias. El análisis del flujo de datos tiene como objetivo determinar los valores de los datos en un programa. La implementación de reglas en JavaScript puede ser sencilla o requerir una consideración exhaustiva de diversos casos y parámetros. La naturaleza dinámica e incierta de JavaScript hace que el análisis estático sea un desafío, pero puede mejorar en gran medida la calidad del código.

1. Introducción al Análisis Estático en JavaScript

Short description:

Hola a todos. Mi nombre es Elena Vilchik y voy a hablarles sobre el análisis estático en JavaScript. Trabajo en la empresa Cynar, escribiendo analizadores para JavaScript y otros lenguajes. El análisis estático de código es un programa que analiza el código fuente sin ejecutarlo, produciendo métricas, problemas o advertencias. Es diferente del análisis dinámico, que ejecuta el código. Hay diferentes niveles de análisis estático, incluyendo análisis basado en texto, basado en tokens, árbol de sintaxis y análisis semántico. El análisis de flujo de control es un modelo menos utilizado.

Mi nombre es Elena Vilchik y voy a hablarles sobre el análisis estático en JavaScript. Así que, voy a hablar sobre lo que es fácil y lo que es difícil en esto. Un poco sobre mí, trabajo en la empresa Cynar. Estamos desarrollando una plataforma para la detección continua de calidad de código y seguridad. Llevo más de ocho años escribiendo analizadores para JavaScript y muchos otros lenguajes, y cuando se trata de código limpio, algunas personas pueden llamarme una molestia.

Antes de entrar en lo que es fácil y lo que es difícil, quiero contarles primero qué es el análisis estático de código. No todos pueden estar al tanto de eso. Un analizador de código estático es un programa, como podrán haber adivinado, que toma el código fuente , los archivos de texto del programa. A veces, para algunos lenguajes, toma algo más. Algunos archivos precompilados, por ejemplo, bytecode para Java, para obtener información semántica producida por el compilador. Y sin ejecutar realmente el código fuente, puede tener alguna imitación de la ejecución, pero nunca ejecuta realmente el código fuente, produce algunas métricas, problemas o advertencias, hallazgos, como quieran llamarlos. También pueden pensar, bueno, análisis estático, lo entiendo, entonces ¿qué es el análisis dinámico y si son direcciones competidoras de lo mismo, de hecho no, el análisis dinámico lo usan todos los días, esto es algo que realmente ejecuta un código y ejemplos también que son conocidos por todos, esto es la cobertura de código, estas son las pruebas unitarias, y en realidad estas dos cosas son necesarias para todos y grandes amigos y ayudantes de cada desarrollador en la vida cotidiana.

Voy a repasar los niveles de análisis estático, niveles en términos de los modelos que se utilizan para escribir. Vamos a utilizar el término regla que es familiar para todos. El primer nivel será basado en texto cuando solo obtienes el archivo fuente y tratas de inferir algo a partir de eso. Esto puede ser, por ejemplo, el número de líneas en el archivo o la presencia del encabezado de licencia. Para obtener esas cosas, no necesitas saber nada más que el texto del código fuente. El siguiente nivel serán los tokens. Los divides en palabras. Conoces algunos metadatos sobre esos tokens, si es una palabra clave, un dictador, y puedes saber, escribir algunas reglas en este nivel. Por ejemplo, para el literal de cadena, puedes decir que, okay, tengo este token literal y puedo decirte si está usando las comillas correctas, ya sea comillas simples o comillas dobles, lo que configures. El siguiente nivel es el árbol de sintaxis o árbol de sintaxis abstracta, AST por sus siglas en inglés. Esto es muy común, el nivel más utilizado donde representamos el código fuente en el formato de árbol. Aquí está el ejemplo, un poco simplificado por supuesto por la brevedad del código que acabamos de tener antes. Tenemos una función que tiene el nombre foo y el parámetro p que tiene un cuerpo. La declaración if tiene una condición con un operador de igualdad y esos tienen operandos, p falso y una llamada a la función. Así que para aquellos que no lo sabían, realmente recomendaría echar un vistazo al sitio web IST Explorer , un sitio web genial que te mostrará la representación AST del código fuente que pongas allí, muy útil incluso para investigar algunas características nuevas del lenguaje y ver qué es realmente lo que acabas de ingresar allí, qué tipo de sintaxis de lenguaje es. hay un nivel semántico, semántico estamos hablando de rivales, sus declaraciones, usos y en este nivel, por ejemplo, sabes que aquí está el parámetro P, se declara aquí, se usa aquí, luego está la función foo que se declara y se referencia en la última línea y la variable P que no es la misma que el parámetro P aunque tengan el mismo nombre, aquí se declaran en diferentes ámbitos, el ámbito es otra noción de este nivel y aquí se escribe y declara y aquí se lee. Y luego hablamos de modelos más avanzados que generalmente no se utilizan tanto como todos los anteriores, el más común de ellos es el análisis de flujo de control que está presente, por ejemplo, en el núcleo de ESLint.

2. Comprensión del Análisis de Flujo de Datos

Short description:

En este nivel, tenemos en cuenta el orden de ejecución de instrucciones, expresiones y declaraciones. El análisis de flujo de datos tiene como objetivo determinar los valores de los datos en un programa. El compilador de TypeScript realiza análisis de flujo de datos para verificar los tipos de variables basados en el flujo de control. Cada nivel se basa en el anterior, siendo el análisis de flujo de control un requisito previo para el análisis de flujo de datos.

En este nivel, tenemos en cuenta el orden de ejecución de instrucciones, la ejecución de expresiones y declaraciones, o nuestro ejemplo con la declaración if. Dentro de la función foo, tenemos la condición p igual a true y, dependiendo de si es verdadera, la mostraremos en un alert, si no, mostraremos en un alert que podemos salir también. Así que este es el último nivel del que quería hablar, el último modelo es el análisis de flujo de datos.

En este nivel, queremos conocer los valores, lo máximo que podemos aprender sobre los valores de los datos, en otras palabras, del programa. Por supuesto, no podemos saberlo todo porque nadie lo sabe todo hasta que realmente se ejecute el programa, pero podemos saber algo sobre los valores. Por ejemplo, en este bloque de código, si es igual a true, sabremos que p es en realidad un valor verdadero, en el else sabremos que no es verdadero. Fuera de este if, no sabremos nada sobre el valor de p. También puedes pensar en el compilador de TypeScript como un análisis de flujo de datos, porque eso es lo que hace. Observa el flujo de control del programa y verifica, según las diferentes declaraciones, diferentes expresiones, cuáles son los límites para el tipo de variable. Y aquí la noción entre valor y tipo es bastante difusa, debido a la forma en que TypeScript lo define. Y como habrás notado, cada nivel siguiente se basa en el anterior para poder construir el análisis de flujo de datos, necesitas tener necesariamente el análisis de flujo de control, y así sucesivamente.

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.
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.
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.
pnpm: un gestor de paquetes rápido y eficiente para JavaScript
DevOps.js Conf 2022DevOps.js Conf 2022
31 min
pnpm: un gestor de paquetes rápido y eficiente para JavaScript
pnpm is a fast and efficient package manager that gained popularity in 2021 and is used by big tech companies like Microsoft and TikTok. It has a unique isolated node module structure that prevents package conflicts and ensures each project only has access to its own dependencies. pnpm also offers superior monorepo support with its node module structure. It solves the disk space usage issue by using a content addressable storage, reducing disk space consumption. pnpm is incredibly fast due to its installation process and deterministic node module structure. It also allows file linking using hardlinks instead of symlinks.
De la Fricción al Flujo: Depuración con Chrome DevTools
JSNation 2024JSNation 2024
32 min
De la Fricción al Flujo: Depuración con Chrome DevTools
The Talk discusses the importance of removing frictions in the debugging process and being aware of the tools available in Chrome DevTools. It highlights the use of the 'Emulate a Focus Page' feature for debugging disappearing elements and the improvement of debugging tools and workflow. The Talk also mentions enhancing error understanding, improving debugging efficiency and performance, and the continuous improvement of DevTools. It emphasizes the importance of staying updated with new features and providing feedback to request new features.
Rome, ¡una cadena de herramientas moderna!
JSNation 2023JSNation 2023
31 min
Rome, ¡una cadena de herramientas moderna!
Top Content
Rome is a toolchain built in Rust that aims to replace multiple tools and provide high-quality diagnostics for code maintenance. It simplifies tool interactions by performing all operations once, generating a shared structure for all tools. Rome offers a customizable format experience with a stable formatter and a linter with over 150 rules. It integrates with VCS and VLSP, supports error-resilient parsing, and has exciting plans for the future, including the ability to create JavaScript plugins. Rome aims to be a top-notch toolchain and welcomes community input to improve its work.

Workshops on related topic

Masterclass de Depuración de Rendimiento de React
React Summit 2023React Summit 2023
170 min
Masterclass de Depuración de Rendimiento de React
Top Content
Featured WorkshopFree
Ivan Akulov
Ivan Akulov
Los primeros intentos de Ivan en la depuración de rendimiento fueron caóticos. Vería una interacción lenta, intentaría una optimización aleatoria, vería que no ayudaba, y seguiría intentando otras optimizaciones hasta que encontraba la correcta (o se rendía).
En aquel entonces, Ivan no sabía cómo usar bien las herramientas de rendimiento. Haría una grabación en Chrome DevTools o React Profiler, la examinaría, intentaría hacer clic en cosas aleatorias, y luego la cerraría frustrado unos minutos después. Ahora, Ivan sabe exactamente dónde y qué buscar. Y en esta masterclass, Ivan te enseñará eso también.
Así es como va a funcionar. Tomaremos una aplicación lenta → la depuraremos (usando herramientas como Chrome DevTools, React Profiler, y why-did-you-render) → identificaremos el cuello de botella → y luego repetiremos, varias veces más. No hablaremos de las soluciones (en el 90% de los casos, es simplemente el viejo y regular useMemo() o memo()). Pero hablaremos de todo lo que viene antes - y aprenderemos a analizar cualquier problema de rendimiento de React, paso a paso.
(Nota: Esta masterclass es más adecuada para ingenieros que ya están familiarizados con cómo funcionan useMemo() y memo() - pero quieren mejorar en el uso de las herramientas de rendimiento alrededor de React. Además, estaremos cubriendo el rendimiento de la interacción, no la velocidad de carga, por lo que no escucharás una palabra sobre Lighthouse 🤐)
React, TypeScript y TDD
React Advanced 2021React Advanced 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.
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.
De Todo App a B2B SaaS con Next.js y Clerk
React Summit US 2023React Summit US 2023
153 min
De Todo App a B2B SaaS con Next.js y Clerk
Top Content
WorkshopFree
Dev Agrawal
Dev Agrawal
Si eres como yo, probablemente tengas un millón de ideas para proyectos secundarios, algunas de las cuales incluso podrían hacerte ganar dinero como un micro SaaS, o podrían resultar ser la próxima startup de mil millones de dólares. Pero, ¿cómo sabes cuáles? ¿Cómo pasas de una idea a un producto funcional que puede ser puesto en manos de clientes que pagan sin renunciar a tu trabajo e invirtiendo todo tu tiempo y dinero en ello? ¿Cómo pueden competir tus proyectos secundarios en solitario con las aplicaciones construidas por enormes equipos y grandes empresas?
Construir productos SaaS ricos viene con desafíos técnicos como infraestructura, escalabilidad, disponibilidad, seguridad y subsistemas complicados como autenticación y pagos. Por eso, a menudo son los gigantes tecnológicos ya establecidos quienes pueden construir y operar productos de este tipo de manera razonable. Sin embargo, una nueva generación de devtools está permitiendo a los desarrolladores construir fácilmente soluciones completas que aprovechan la mejor infraestructura en la nube disponible, y ofrecen una experiencia que te permite iterar rápidamente en tus ideas por un bajo costo de $0. Se llevan todos los desafíos técnicos de construir y operar productos de software para que solo tengas que pasar tu tiempo construyendo las características que tus usuarios quieren, dándote una oportunidad razonable de competir contra el mercado al mantenerte increíblemente ágil y receptivo a las necesidades de los usuarios.
En esta masterclass de 3 horas comenzarás con una simple aplicación de gestión de tareas construida con React y Next.js y la convertirás en un producto SaaS completamente funcional y escalable integrando una base de datos escalable (PlanetScale), autenticación multi-tenant (Clerk), y pagos basados en suscripción (Stripe). También aprenderás cómo los principios del desarrollo de software ágil y el diseño impulsado por el dominio pueden ayudarte a construir productos rápidamente y de manera rentable, y competir con las soluciones existentes.
Depuración del Rendimiento de React
React Advanced 2023React Advanced 2023
148 min
Depuración del Rendimiento de React
Workshop
Ivan Akulov
Ivan Akulov
Los primeros intentos de Ivan en la depuración de rendimiento fueron caóticos. Veía una interacción lenta, probaba una optimización aleatoria, veía que no ayudaba, y seguía probando otras optimizaciones hasta que encontraba la correcta (o se rendía).
En aquel entonces, Ivan no sabía cómo usar bien las herramientas de rendimiento. Hacía una grabación en Chrome DevTools o React Profiler, la examinaba, intentaba hacer clic en cosas al azar, y luego la cerraba frustrado unos minutos después. Ahora, Ivan sabe exactamente dónde y qué buscar. Y en esta masterclass, Ivan te enseñará eso también.
Así es como va a funcionar. Tomaremos una aplicación lenta → la depuraremos (usando herramientas como Chrome DevTools, React Profiler, y why-did-you-render) → identificaremos el cuello de botella → y luego repetiremos, varias veces más. No hablaremos de las soluciones (en el 90% de los casos, es simplemente el viejo y regular useMemo() o memo()). Pero hablaremos de todo lo que viene antes - y aprenderemos cómo analizar cualquier problema de rendimiento de React, paso a paso.
(Nota: Esta masterclass es más adecuada para ingenieros que ya están familiarizados con cómo funcionan useMemo() y memo() - pero quieren mejorar en el uso de las herramientas de rendimiento alrededor de React. Además, cubriremos el rendimiento de interacción, no la velocidad de carga, por lo que no escucharás una palabra sobre Lighthouse 🤐)