Welche Software kann ich verwenden, um LLOC, Funktionspunkte und zyklomatische Komplexität von Bash-Skripten zu messen?

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 radonBibliothek, 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-reportermö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 jslintund 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.

@SteveBarnes: Obwohl es im Vergleich zu etwas relevanter ist clocund 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.

Antworten (2)

[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:

  • SCSE ist ein Tool, das XML-Dateien berechnet, die LLOC, zyklomatische Komplexität, für Dutzende von Sprachen enthalten
  • Es verwendet präzise Lexer, um die Quelldateien je nach Sprachtyp zu verarbeiten
  • Es kann Bash (oder andere ihm unbekannte Sprachen) als Adhoc-Text behandeln; Alternativ wäre es möglich, einen sprachgenauen Lexer für Bash zu definieren
  • Ein FileInventory-Tool kann einen großen Satz von Dateien in Vorbereitung auf die Verwendung mit SCSE klassifizieren
  • SCSE berechnet keine Funktionspunkte
  • Kostenloses "zusätzliches" Feature: schnelle interaktive Suche über die Codebasis

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
------------------------------------------------------------------------------