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 cloc
que 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 radon
biblioteca 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-report
que 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 jslint
aná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.
[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:
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
------------------------------------------------------------------------------
steve barnes
Arseni Mourzenko
cloc
y, 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.