¿Qué software puedo usar para medir LLOC, puntos de función y complejidad ciclomática de scripts Bash?

Quiero recopilar algunos datos estadísticos sobre un repositorio para compararlo a lo largo del tiempo. El objetivo es saber cómo evolucionó el uso de lenguajes específicos a lo largo del tiempo y cómo creció o se redujo la complejidad y el tamaño de los diferentes proyectos.

Existe una gran herramienta llamada clocque mide líneas de código en diferentes lenguajes. Es un buen comienzo, pero la medida LOC no es muy representativa. Me gustaría recopilar mejores medidas como, para empezar, líneas lógicas de código y puntos de función y, finalmente, la complejidad ciclomática.

También hay herramientas para eso:

  • Python tiene una excelente radonbiblioteca que proporciona LLOC, complejidad ciclomática, etc., y permite determinar indirectamente el número de puntos de función.

  • C# tiene, obviamente, Code Metrics de Visual Studio que también brinda información detallada, incluido ILLOC que, a diferencia de LOC, es bastante representativo del tamaño de un proyecto, así como de la complejidad ciclomática.

  • Tiene JavaScript complexity-reportque también permite calcular el número de puntos de función, así como la LLOC y la complejidad ciclomática.

  • PHP parece tener una herramienta también, que proporciona tanto LLOC como el número de puntos de función, así como la complejidad ciclomática y otra información.

Lo que no puedo encontrar es una herramienta similar para Bash. Hay una herramienta de análisis estático ShellCheck bien conocida , pero esto no es lo que quiero: ShellCheck busca posibles problemas con el código, de manera similar al jslintanálisis de código de JavaScript y C#.

Asi que:

  • ¿Existe alguna herramienta que, al igual que cloc, muestre LLOC, puntos de función y complejidad ciclomática para decenas de idiomas?

  • ¿O existe una herramienta específica para scripts de Bash?


Nota: Estoy interesado en una herramienta gratuita que se puede usar desde una terminal Linux, no en productos pagos, ni en servicios en línea o API.

@SteveBarnes: si bien es un poco más relevante en comparación clocy, lo que es más importante, agrega complejidad ciclomática, carece de LLOC y puntos de función. Por otro lado, no me queda claro si LLOC es realmente mucho más relevante que LOC para Bash, y los puntos de función tampoco pueden ser relevantes (por ejemplo, para scripts grandes que no contienen funciones). Sugiero que esperemos unos días para otras respuestas, y si no hay ninguna, cierre mi pregunta como un duplicado.

Respuestas (2)

[2 meses y sin respuestas. Estoy proporcionando una respuesta comercial ya que no parece haber otras respuestas.]

Nuestro motor de búsqueda de código fuente (SCSE) se utiliza para buscar expresiones de código interesantes en grandes repositorios que contienen muchos (posiblemente docenas) idiomas. Es rápido porque indexa el código base de acuerdo a la sintaxis léxica de cada uno de los lenguajes; hay un lexer de lenguaje preciso que usa para cada idioma. (Este es un producto de Windows, pero se ha empaquetado explícitamente para permitir también la operación con Wine, con scripts de shell que lo hacen parecer nativo de Linux).

Sorprendentemente, un efecto secundario del proceso de indexación es la producción de varias métricas a nivel de archivo con SLOC, líneas de código que no están en blanco, líneas en blanco, complejidad ciclomática y medidas de Halstead . No hace puntos de función (necesitaría números contraproducentes para cada idioma, y ​​luego podría calcular esto fácilmente). Las métricas en realidad se producen como un archivo XML; un script trivial lo convierte en una tabla HTML como la que se muestra.

Esto cubriría los idiomas en su base de código excepto Bash. (No listo para usar, pero SCSE obtuvo la forma en que está al tener un proceso para definir dichos lexers, y sería posible definir un lexer preciso para Bash). Sin embargo, uno de los lexers disponibles es para algo que llamamos AdhocText, que pretende ser el lenguaje de programación que encuentra en un libro de programación de computadoras al azar, por lo que contiene todos los lexemas clásicos que espera encontrar en un lenguaje genérico. Esto funciona mejor de lo que cabría esperar en un lenguaje de programación aleatorio.

Un problema complicado con una gran base de código es categorizar los archivos según qué idiomas, para asociar cada archivo con su lexer de idioma correspondiente. Tenemos otra herramienta de Inventario de archivos , que se puede apuntar a un conjunto de directorios, clasifica los archivos según la extensión y las sugerencias de contenido, y luego vuelve a validar la clasificación usando los mismos lexers que usa el SCSE. La ejecución de esta herramienta básicamente toma un conjunto de directorios completamente desorganizado, clasifica los archivos según los tipos, identifica duplicados y genera los archivos de configuración para ejecutar SCSE.

Resumen:

  • SCSE es una herramienta que calcula archivos XML que contienen LLOC, complejidad ciclomática para decenas de idiomas
  • Utiliza lexers precisos para procesar los archivos fuente, según el tipo de idioma.
  • Puede manejar Bash (u otros lenguajes desconocidos para él) como Adhoc Text; alternativamente, sería posible definir un lexer preciso del idioma para Bash
  • Una herramienta FileInventory puede clasificar un gran conjunto de archivos en preparación para su uso con SCSE
  • SCSE no calcula puntos de función
  • Función "adicional" gratuita: búsqueda interactiva rápida en la base de código

Lancé Cyclomatic Complexity Analyzer para script de shell.

ShellMetrics - Analizador de complejidad ciclomática para script de shell
https://github.com/shellspec/shellmetrics

Mide NLOC (Línea de código sin comentarios), LLOC (Líneas de código lógicas) y CCN (Número de complejidad ciclomática) de scripts de shell, incluido bash.

Aquí hay una muestra del informe de cobertura.

==============================================================================
  LLOC  CCN  Location
------------------------------------------------------------------------------
     1    1  usage:9 shellmetrics
...
     3    1  repeat_string:73 shellmetrics
     3    2  array:79 shellmetrics
     2    1  array_is_empty:86 shellmetrics
     7    2  push_array:91 shellmetrics
    11    3  pop_array:102 shellmetrics
    11    3  shift_array:119 shellmetrics
     8    3  peel:136 shellmetrics
     7    3  pretty:149 shellmetrics
     2    1  process:162 shellmetrics
    65   27  parse:167 shellmetrics
...
    52    2  <main> shellmetrics
------------------------------------------------------------------------------
 1 file(s), 33 function(s) analyzed. [bash 4.4.20(1)-release]

==============================================================================
 NLOC    NLOC  LLOC    LLOC    CCN Func File (lines:comment:blank)
total     avg total     avg    avg  cnt
------------------------------------------------------------------------------
  412   12.48   332   10.06   3.18   33 shellmetrics (479:5:62)
------------------------------------------------------------------------------

==============================================================================
 NLOC    NLOC  LLOC    LLOC    CCN Func File    lines comment   blank
total     avg total     avg    avg  cnt  cnt    total   total   total
------------------------------------------------------------------------------
  412   12.48   332   10.06   3.18   33    1      479       5      62
------------------------------------------------------------------------------