No debe confundirse con lente o linterna: aquí se trata de código.

Un linter es una herramienta de software que analiza automáticamente el código fuente para detectar y reportar errores de programación, bugs, fallos estilísticos y construcciones sospechosas. Su propósito es hacer cumplir un conjunto de reglas de estilo y calidad, garantizando que el código sea más legible, mantenible y consistente en todo el proyecto.

Un linter en programación es un programa que analiza el código en busca de errores y verifica que se adhiera a un conjunto de reglas predefinidas. Generalmente, los linters se utilizan en equipos de desarrollo, ya que facilitan la escritura de código uniforme y legible. En este artículo, te explicaré en detalle la función de un linter, su funcionamiento, sus diferencias con un formateador y su utilidad en el trabajo diario.

Diagrama que explica qué es un linter en programación.
Ilustración conceptual de un linter como una lupa gigante escaneando líneas de código en un monitor para encontrar y resaltar errores.

¿Para qué sirve un linter y en qué se diferencia de un formateador?

Imagina un equipo de varias decenas de desarrolladores, donde cada uno posee su propio estilo de codificación: uno utiliza espacios para la indentación, otro tabulaciones, un tercero omite las llaves de cierre en los bloques y un cuarto sigue otras convenciones personales.

Cuando este código heterogéneo se integra en un repositorio común, el proyecto puede fallar al compilar o generar errores inesperados en tiempo de ejecución. Un linter ayuda a evitar estos problemas: analiza automáticamente el código para verificar su conformidad con las reglas establecidas, identifica bugs potenciales y variables no utilizadas, y alerta al desarrollador si incumple los estándares de formato adoptados por el equipo.

Sin embargo, el linter не es la única herramienta para mantener el orden en el código. En proyectos de gran envergadura, los equipos también emplean sistemas de pruebas automatizadas, análisis estático, verificación de estilo, pipelines de CI y muchos otros programas. De todo este conjunto de herramientas de análisis de código, la más cercana al linter es el formateador.

La principal diferencia en el debate linter vs formateador es que el linter señala errores potenciales y problemas lógicos, mientras que un formateador se limita a estandarizar la apariencia del código: ajusta la indentación, modifica las comillas, alinea bloques y elimina espacios en blanco superfluos. En otras palabras, el linter comunica: «Aquí hay un error, es necesario reescribirlo», mientras que el formateador se ocupa exclusivamente del formato sin analizar la semántica. Por esta razón, se suelen utilizar conjuntamente: el formateador es responsable del aspecto visual del código, y el linter, de su calidad y lógica.

¿Cómo funciona un linter?

Cuando un programador ejecuta un linter, este analiza el código de forma secuencial, lo contrasta con un conjunto de reglas y, en caso de incumplimiento, emite una advertencia o un error. Por ejemplo, un linter puede señalar la omisión de un punto y coma al final de una línea o el uso de construcciones prohibidas en el proyecto. La mayoría de los linters incluyen un conjunto de reglas predeterminadas, aunque estas suelen ser personalizables para adaptarse a los requisitos de un proyecto específico.

En equipos grandes, la configuración y la gestión de los archivos de configuración son responsabilidad de los líderes de equipo (team leads) o desarrolladores designados. Ellos definen qué linters utilizar y qué reglas aplicar. Por lo tanto, el desarrollador a menudo no necesita configurar nada manualmente, sino que recibe un conjunto de reglas predefinido junto con el proyecto.

Es importante considerar que muchos linters están optimizados para un lenguaje de programación o tipo de archivo específico. Sin embargo, las aplicaciones modernas casi siempre utilizan un stack tecnológico completo: por ejemplo, JavaScript, TypeScript, CSS o SCSS, componentes de React con JSX, entre otros. En consecuencia, para la mayoría de los proyectos, un único linter es insuficiente, y los desarrolladores combinan varios.

Por ejemplo, para un proyecto típico de React, se pueden integrar varias herramientas: ESLint para el análisis de código JavaScript y TypeScript, Stylelint para la verificación de estilos CSS y SCSS, y Prettier como formateador automático para unificar el estilo de todo el código.

Documentación de ESLint
Toda herramienta popular de este tipo dispone de una documentación similar, donde se describe en detalle el funcionamiento de las reglas incorporadas, se proporcionan ejemplos de código correcto e incorrecto y se especifican los ajustes que puedes modificar. Fuente

Ejemplo de la documentación técnica de ESLint.
Captura de pantalla de la documentación oficial de ESLint, mostrando un ejemplo de una regla y su configuración.

Linters populares para diferentes lenguajes de programación

Casi todos los lenguajes de programación disponen de varios linters que se diferencian por la rigurosidad de sus reglas, la velocidad de ejecución y las capacidades de configuración. A continuación, te presento algunas herramientas de probada eficacia:

  • Linters para JavaScript, TypeScript: ESLint; StandardJS (funciona sin configuración); JSHint (uso ocasional); TSLint.
  • Linters para Python: Pylint (analizador completo con informes); Flake8 (herramienta ligera para verificar el estilo según el estándar PEP 8); Ruff (linter de alto rendimiento escrito en Rust). Para profundizar en este lenguaje, puedes consultar mi guía sobre qué es Python.
  • CSS, SCSS: Stylelint (linter principal para CSS y preprocesadores); PostCSS-bem-linter (verifica la conformidad con la metodología BEM).
  • C, C++: Cppcheck (detecta errores que el compilador puede pasar por alto); Clang-Tidy (herramienta flexible con una gran cantidad de verificaciones).
  • Go: golint (se encuentra en proyectos antiguos); staticcheck (herramienta moderna con verificaciones avanzadas); golangci-lint (unifica decenas de analizadores en uno).
  • Rust: Clippy (herramienta principal); rustc (compilador de Rust con verificaciones y advertencias integradas).
  • Java: Checkstyle (analiza el estilo del código); PMD (detecta errores y antipatrones); SpotBugs (identifica bugs potenciales).

Si ninguno de los linters mencionados se ajusta a tus necesidades, te recomiendo considerar los agregadores analysis-tools.dev o el repositorio de GitHub static-analysis. Estos recursos recopilan colecciones de herramientas para diferentes lenguajes de programación, con sus descripciones y comparativas.

Cómo utilizar un linter

Para observar el funcionamiento de un linter, abre el editor VS Code y, en la lista de extensiones disponibles, introduce «StandardJS». Esta herramienta no requiere configuración, por lo que es ideal para esta demostración.

Crea un archivo index.js e inserta el siguiente código:

let message = "Hello world"
let unused = 42
console.log(message)

Abre el terminal en VS Code e instala el linter StandardJS para que pueda verificar tu archivo según las reglas de JavaScript Standard Style:

npm install --save-dev standard

Espera a que finalice la descarga de todos los paquetes y ejecuta la verificación:

npx standard --fix

StandardJS mostrará la siguiente advertencia:
'unused' is assigned a value but never used. (no-unused-vars)

Esto significa que se ha declarado una variable unused en el archivo, se le ha asignado un valor, pero no se utiliza posteriormente en el código. Este comportamiento se considera una mala práctica, por lo que el linter emite una advertencia.

Dado que el programa está en sus fases iniciales, añade un comentario especial en el código y ejecuta nuevamente la verificación. En este caso, el linter ignorará la variable especificada:

let message = "Hello world"
// eslint-disable-next-line no-unused-vars
let unused = 42
console.log(message)

Además, StandardJS reemplazará las comillas dobles por comillas simples y utilizará la palabra clave const en lugar de let. Sin embargo, no añadirá puntos y comas al final de las líneas, ya que los considera superfluos:

Código corregido por el linter StandardJS en la terminal.
Captura de pantalla de la terminal de VS Code mostrando el output del linter StandardJS antes y después de aplicar las correcciones de código.

De manera similar, puedes instalar cualquier otro linter, estudiar su documentación y, si es necesario, configurarlo para tus proyectos específicos.

Categorizado en:

Herramientas y DevOps,