2010-05-19 7 views
7

Ho appena ricevuto un nuovo incarico che sembra essere una sfida interessante.Analisi del codice statico per nuova lingua. Dove iniziare?

Il cliente desidera uno strumento di controllo dello stile del codice da sviluppare per il proprio linguaggio di programmazione interno (di prossima apertura) che viene eseguito sulla JVM. La sintassi del linguaggio è molto simile a Java.

Il cliente vuole sostanzialmente che produca qualcosa come checkstyle.

Quindi la mia domanda è questa, come faresti ad affrontare questo problema? Dato una tabula rasa, quali raccomandazioni daresti al cliente?

penso di avere 3 opzioni

  1. Scrivi qualcosa da zero. L'id preferisce non farlo in quanto sembra che questo tipo di problema con lo strumento di analisi del codice sia stato risolto così tante volte che deve esserci un approccio più "quadro" o "piattaforma".

  2. Fork uno strumento di controllo stile codice esistente e modificare il parsing per adattarsi a questo nuovo linguaggio etc etc

  3. Estendere o collegare in uno strumento di analisi statica del codice esistente. (Forse scrivere un plugin per Yasca?)

risposta

4

Tali strumenti fondamentalmente necessario implementare un compilatore front-end per almeno un sottoinsieme del linguaggio. Il punto di partenza più semplice è spesso quello di adattare un front-end del compilatore esistente, quindi dovresti iniziare a guardare il compilatore del tuo cliente. Se sei fortunato avrà una netta separazione tra front-end e back-end e sarà in grado di usarlo così com'è e usare l'AST o qualsiasi altra IR che il front-end produce per fare la tua analisi aggiuntiva.

+0

Sì, o utilizzare un generatore di parser se questo non è possibile. –

0

Date un'occhiata a FindBugs

+0

Sì, FindBugs, stile di controllo PMD ecc. Ecc. I documenti affermano che è estensibile, ma sembra che tutta la magia venga eseguita a livello di codice byte. Così fuori dalla scatola questo potrebbe rilevare problemi nel codice byte generato, ma poi potrebbe essere abbastanza difficile mappare questi errori al codice sorgente di questa nuova lingua. – tinny

1

Non si desidera scrivere tutte queste cose da zero.

Vedere DMS Software Reengineeering Toolkit. Ciò ha generalizzato il macchinario del compilatore per l'analisi, la costruzione di AST, la costruzione di tabelle di simboli, la costruzione/il controllo di flussi di controllo e grafici di flussi di dati e alberi di chiamata.

DMS può essere ottenuto con un front-end Java completo che crea AST, tabelle di simboli e analisi di flusso sopra. DMS gestisce dialetti linguistici con aplomb, quindi dovrebbe essere tanto semplice quanto pratico modificare questo front end in modo che corrisponda al linguaggio della variante Java del cliente e tuttavia acquisire tutto questo meccanismo di analisi.

0

Che dire di PMD? Ho usato PMD per anni, ma non mi sono mai esercitato nei suoi meccanismi interni prima d'ora.

PMD può essere esteso scrivendo un parser di lingua personalizzato, che viene eseguito fornendo implementazioni di quanto segue all'interno di un JAR sul percorso della classe.

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

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

Poi utilizzando il PMD rule designer posso definire le regole dalla AST risultante.

La cosa che mi piace di PMD è che è uno strumento di analisi del codice ampiamente riconosciuto nello spazio Java, quindi ha un sacco di supporto di terze parti. E.g plug-in Eclipse, plug-in Hudson CI ecc. Ecc.