Ich möchte ein paar statistische Daten über ein Repository sammeln, um es im Laufe der Zeit zu vergleichen. Ziel ist es zu wissen, wie sich die Verwendung bestimmter Sprachen im Laufe der Zeit entwickelt hat und wie die Komplexität und Größe verschiedener Projekte zugenommen oder abgenommen hat.
Es gibt ein großartiges Tool namens cloc
, das Codezeilen in verschiedenen Sprachen misst. Es ist ein guter Anfang, aber das LOC-Maß ist nicht sehr repräsentativ. Ich möchte bessere Maße sammeln, wie zunächst logische Codezeilen und Funktionspunkte und schließlich die zyklomatische Komplexität.
Auch dafür gibt es Tools:
Python hat eine ausgezeichnete radon
Bibliothek, die LLOCs, zyklomatische Komplexität usw. liefert und es ermöglicht, die Anzahl der Funktionspunkte indirekt zu bestimmen.
C# verfügt offensichtlich über die Codemetriken von Visual Studio, die auch detaillierte Informationen liefern, einschließlich ILLOC, das im Gegensatz zu LOC ziemlich repräsentativ für die Größe eines Projekts sowie für die zyklomatische Komplexität ist.
JavaScript complexity-report
ermöglicht es auch, die Anzahl der Funktionspunkte sowie die LLOC- und zyklomatische Komplexität zu berechnen.
PHP scheint auch ein Tool zu haben, das sowohl LLOC und die Anzahl der Funktionspunkte als auch zyklomatische Komplexität und andere Informationen liefert.
Was ich nicht finden kann, ist ein ähnliches Tool für Bash. Es gibt ein bekanntes statisches Analysetool ShellCheck , aber das ist nicht das, was ich will: ShellCheck sucht eher nach möglichen Problemen mit dem Code, ähnlich wie die Codeanalyse von JavaScript jslint
und C#.
So:
Gibt es ein Tool, das, ähnlich wie cloc
, LLOC, Funktionspunkte und zyklomatische Komplexität für Dutzende von Sprachen anzeigt?
Oder gibt es ein solches Tool speziell für Bash-Skripte?
Hinweis: Ich interessiere mich für ein kostenloses Tool, das von einem Linux-Terminal aus verwendet werden kann, nicht für kostenpflichtige Produkte und nicht für Online-Dienste oder APIs.
[2 Monate und keine Antworten. Ich gebe eine kommerzielle Antwort, da keine anderen Antworten zu erwarten scheinen.]
Unsere Source Code Search Engine (SCSE) wird verwendet, um große Repositories mit vielen (wohl Dutzenden) Sprachen nach interessanten Code-Idiomen zu durchsuchen. Es ist schnell, weil es die Codebasis gemäß der lexikalischen Syntax jeder der Sprachen indiziert; Es gibt einen sprachgenauen Lexer, der für jede Sprache verwendet wird. (Dies ist ein Windows-Produkt, wurde aber explizit so gepackt, dass es auch den Betrieb mit Wine ermöglicht, mit Shell-Skripten, die es Linux-nativ aussehen lassen).
Bemerkenswerterweise ist ein Nebeneffekt des Indizierungsprozesses die Erzeugung verschiedener Metriken auf Dateiebene mit SLOC, nicht leeren Codezeilen, Leerzeilen, zyklomatischer Komplexität und Halstead-Maßnahmen . Es macht keine Funktionspunkte (Sie würden für jede Sprache nach hinten losgehende Zahlen benötigen, und dann könnten Sie dies leicht berechnen). Die Metriken werden tatsächlich als XML-Datei erstellt; ein triviales Skript wandelt es in eine HTML-Tabelle wie die gezeigte um.
Dies würde die Sprachen in Ihrer Codebasis mit Ausnahme von Bash abdecken. (Nicht von der Stange, aber SCSE ist so geworden, dass es einen Prozess zum Definieren solcher Lexer hat, und es wäre möglich, einen genauen Lexer für Bash zu definieren). Einer der verfügbaren Lexer ist jedoch für etwas, das wir AdhocText nennen, das die Programmiersprache sein soll, die Sie in einem zufälligen Computerprogrammierbuch finden, also enthält es alle klassischen Lexeme, die Sie in einer generischen Sprache erwarten. Dies funktioniert besser, als Sie es von einer zufälligen Programmiersprache erwarten würden.
Ein unordentliches Problem bei einer großen Codebasis besteht darin, die Dateien nach Sprachen zu kategorisieren, um jede Datei ihrem entsprechenden Sprachlexer zuzuordnen. Wir haben ein weiteres Dateiinventar -Tool, das auf eine Reihe von Verzeichnissen verweisen kann, Dateien nach Erweiterungs- und Inhaltshinweisen klassifiziert und dann die Klassifizierung erneut validiert, indem es dieselben Lexer verwendet, die von der SCSE verwendet werden. Das Ausführen dieses Tools erfordert im Grunde einen völlig unorganisierten Satz von Verzeichnissen, sortiert die Dateien nach Typen, identifiziert Duplikate und generiert die Konfigurationsdateien zum Ausführen von SCSE.
Zusammenfassung:
Ich habe Cyclomatic Complexity Analyzer für Shell-Skript veröffentlicht.
ShellMetrics – Cyclomatic Complexity Analyzer für Shell-Skript
https://github.com/shellspec/shellmetrics
Es misst NLOC (Non-Comment Line of Code), LLOC (Logical Lines of Code) und CCN (Cyclomatic Complexity Number) von Shell-Skripten, einschließlich Bash.
Hier ist ein Beispiel für einen Abdeckungsbericht.
==============================================================================
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 Murzenko
cloc
und vor allem zyklomatische Komplexität hinzufügt, fehlen ihm LLOC und Funktionspunkte. Andererseits ist mir nicht klar, ob LLOC wirklich viel relevanter ist als LOC für Bash, und Funktionspunkte sind möglicherweise auch nicht relevant (z. B. für große Skripte, die keine Funktionen enthalten). Ich schlage vor, dass wir ein paar Tage auf andere Antworten warten, und wenn es keine gibt, schließe meine Frage als Duplikat.