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?

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.

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.

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.

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
Pocos desarrolladores disfrutan depurando, y la depuración puede ser compleja para las aplicaciones web modernas debido a los múltiples marcos, lenguajes y bibliotecas utilizados. Pero, las herramientas de desarrollo han avanzado mucho en facilitar el proceso. En esta charla, Jecelyn profundizará en el estado moderno de la depuración, las mejoras en DevTools y cómo puedes usarlas para depurar tus aplicaciones de manera confiable.
El Futuro de las Herramientas de Rendimiento
JSNation 2022JSNation 2022
21 min
El Futuro de las Herramientas de Rendimiento
Top Content
Nuestra comprensión del rendimiento y la experiencia del usuario ha evolucionado mucho a lo largo de los años. Las herramientas de desarrollo web necesitan evolucionar de manera similar para asegurarse de que sean centradas en el usuario, accionables y contextuales donde se refiere a las experiencias modernas. En esta charla, Addy te guiará a través de cómo Chrome y otros han estado pensando en este problema y qué actualizaciones han estado haciendo a las herramientas de rendimiento para reducir la fricción para construir grandes experiencias en la web.
Depuración de JS
React Summit 2023React Summit 2023
24 min
Depuración de JS
Top Content
Como desarrolladores, pasamos gran parte de nuestro tiempo depurando aplicaciones, a menudo código que ni siquiera escribimos. Lamentablemente, a pocos desarrolladores se les ha enseñado cómo abordar la depuración, es algo que la mayoría de nosotros aprendemos a través de la experiencia dolorosa. La buena noticia es que _puedes_ aprender a depurar de manera efectiva, y hay varias técnicas y herramientas clave que puedes usar para depurar aplicaciones de JS y React.
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
Aprenderás sobre uno de los gestores de paquetes más populares para JavaScript y sus ventajas sobre npm y Yarn.Una breve historia de los gestores de paquetes de JavaScriptLa estructura aislada de node_modules creada por pnpmQué hace que pnpm sea tan rápidoQué hace que pnpm sea eficiente en el uso del espacio en discoSoporte para monoreposGestión de versiones de Node.js con pnpm
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
Codificar y depurar debería fluir, no desvanecerse. Veamos qué hay de nuevo y mejorado en Chrome DevTools para que tu viaje de desarrollo y depuración web sea suave como la seda.
Rome, ¡una cadena de herramientas moderna!
JSNation 2023JSNation 2023
31 min
Rome, ¡una cadena de herramientas moderna!
Top Content
Los proyectos modernos de JavaScript vienen en muchas formas: sitios web, aplicaciones web, aplicaciones de escritorio, aplicaciones móviles y más. Para la mayoría de ellos, el denominador común es la deuda técnica que proviene de la configuración de herramientas: empaquetadores, suite de pruebas, análisis de código, documentación, etc. Quiero presentarte Rome, una cadena de herramientas que aspira a ser una herramienta todo en uno para la web, con una sola herramienta puedes mantener la salud de todos tus proyectos!

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 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.
Depuración del Rendimiento de React
React Advanced Conference 2023React Advanced Conference 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 🤐)
El Masterclass de Clinic.js
JSNation 2022JSNation 2022
71 min
El Masterclass de Clinic.js
Workshop
Rafael Gonzaga
Rafael Gonzaga
Aprende las formas de la suite de herramientas clinic, que te ayudan a detectar problemas de rendimiento en tus aplicaciones Node.js. Este masterclass te guiará a través de varios ejemplos y te proporcionará los conocimientos necesarios para hacer pruebas de rendimiento y solucionar problemas de E/S y del bucle de eventos.
Soluciona el 100% de tus errores: Cómo encontrar problemas más rápido con la Reproducción de Sesiones
JSNation 2023JSNation 2023
44 min
Soluciona el 100% de tus errores: Cómo encontrar problemas más rápido con la Reproducción de Sesiones
WorkshopFree
Ryan Albrecht
Ryan Albrecht
¿Conoces ese molesto error? ¿El que no aparece localmente? Y no importa cuántas veces intentes recrear el entorno, no puedes reproducirlo. Has revisado las migas de pan, leído la traza de pila y ahora estás jugando al detective para unir los tickets de soporte y asegurarte de que sea real.
Únete al desarrollador de Sentry, Ryan Albrecht, en esta charla para aprender cómo los desarrolladores pueden utilizar la Reproducción de Sesiones, una herramienta que proporciona reproducciones de video de las interacciones de los usuarios, para identificar, reproducir y resolver errores y problemas de rendimiento más rápido (sin golpear tu cabeza contra el teclado).