2010-05-19 6 views
7

Ich habe gerade eine neue Aufgabe bekommen, die aussieht, als ob es eine interessante Herausforderung wird.Statische Codeanalyse für neue Sprache. Wo soll man anfangen?

Der Kunde möchte ein Code-Style-Checking-Tool für seine interne (bald offene) Programmiersprache entwickeln, die auf der JVM läuft. Die Sprachsyntax ist sehr Java-ähnlich.

Der Kunde möchte grundsätzlich etwas wie checkstyle produzieren.

Also meine Frage ist dies, wie würden Sie dieses Problem angehen? Welche Empfehlungen würden Sie dem Kunden geben?

Ich glaube, ich habe 3 Optionen

  1. schreiben etwas von Grund auf neu. Ich würde es vorziehen, dies nicht zu tun, da es so aussieht, als wäre diese Art von Code-Analyse-Tool-Problem so oft gelöst worden, dass es einen mehr "Framework" oder "Plattform" -orientierten Ansatz geben muss.

  2. Gabel ein bestehender Code-Stil Prüfinstrument und das Parsen ändern mit dieser neuen Sprache etc etc

  3. Verlängern oder Stecker in eine bestehende statische Code-Analyse-Tool passen. (Schreiben vielleicht ein Plugin für Yasca?)

Antwort

4

Solche Werkzeuge im Grunde einen Compiler-Frontend für mindestens eine Teilmenge der Sprache zu implementieren. Der einfachste Ausgangspunkt ist oft, ein vorhandenes Compiler-Frontend anzupassen, also sollten Sie sich unbedingt den Compiler Ihres Kunden ansehen. Wenn Sie Glück haben, wird es eine saubere Trennung zwischen dem Front-End und dem Back-End geben und Sie können es wie es ist verwenden und verwenden Sie die AST oder was auch immer IR das Frontend produziert, um Ihre zusätzliche Analyse zu tun.

+0

Ja, oder verwenden Sie einen Parser-Generator, wenn dies nicht möglich ist. –

0

Werfen Sie einen Blick auf FindBugs

+0

Ja, FindBugs, PMD checkstyle etc etc Die Dokumente geben an, dass es erweiterbar ist, aber es sieht so aus, als ob die ganze Magie auf Byte-Code-Ebene erfolgt. Aus der Box heraus könnte dies Probleme in dem erzeugten Byte-Code erkennen, aber dann ist es ziemlich schwierig, diese Fehler dem Quellcode dieser neuen Sprache zuzuordnen. – tinny

1

Sie wollen nicht alles von Grund auf neu schreiben.

Siehe die DMS Software Reengineeering Toolkit. Dies hat verallgemeinerte Compiler-Maschinen zum Parsen, Erstellen von ASTs, Konstruieren von Symboltabellen, Konstruieren/Durchlaufen von Kontrollfluss- und Datenflussgraphen und Aufrufbäumen.

DMS kann mit einem vollständigen Java-Frontend erstellt werden, das ASTs, Symboltabellen und die obigen Flussanalysen erstellt. DMS beherrscht Sprachdialekte mit Bravour. Daher sollte es so einfach wie möglich sein, dieses Frontend so zu modifizieren, dass es der Sprache Ihrer Kunden in Java-Sprache entspricht und trotzdem alle diese Analysemaschinen anwendet.

0

Was ist mit PMD? Ich habe PMD seit Jahren benutzt, aber nie wirklich in seine inneren Abläufe eingedrungen.

PMD kann erweitert werden, indem ein benutzerdefinierter Sprachenparser geschrieben wird. Dies geschieht durch Bereitstellung der folgenden Implementierungen innerhalb einer JAR auf dem Klassenpfad.

net.sourceforge.pmd.cpd.Language
net.sourceforge.pmd.cpd.Tokenizer

http://pmd.sourceforge.net/cpd-parser-howto.html

dann durch die PMD rule designer I kann Regeln aus dem resultierenden AST definieren.

Die Sache, die ich an PMD mag, ist, dass es ein weithin anerkanntes Code-Analyse-Tool im Java-Bereich ist, also viel Unterstützung von Drittanbietern hat. ZB Eclipse-Plugin, Hudson CI-Plugin etc usw.

Verwandte Themen