2014-10-23 18 views
5

Sono interessato a raccogliere alcune statistiche su un grande corpus di codice Java a cui ho accesso. Alcune statistiche a cui sarei interessato potrebbero includere la frequenza con cui determinati metodi/classi vengono utilizzati, con quale frequenza vengono importati determinati pacchetti e così via.Statistiche della lingua Java

Il mio primo pensiero è stato quello di utilizzare javaparser, ma quella libreria supporta solo fino a Java 1.5 e la maggior parte del codice che ho è in versione 1.6 o successiva.

C'è una libreria che mi fornirà un AST accurato da qualche codice Java (ad esempio, posso chiedere a javac in qualche modo?) Oppure esiste un modo migliore per affrontare questo problema (esaminando il bytecode, forse)?

+0

Vorrei entrare nel pmd [come funziona] (http://pmd.sourceforge.net/pmd-5.1.0/howitworks.html) e vedere se è possibile adattarlo a ciò che stai cercando. Detto questo, non è una piccola cosa a cui stai pensando. –

+1

Non ho idea di come risolvere questo problema, ma hai una stella da parte mia perché mi piacerebbe scoprire cosa ti viene in mente. Se trovi una risposta, per favore pubblicala come risposta! Aiuterebbe un sacco di persone su Internet come se steste cercando una soluzione! – DreadHeadedDeveloper

+1

@DreadHeadedDeveloper Sarò sicuro di postare quando capisco qualcosa. Se solo fosse così facile come in Haskell ... (grazie haskell-src-exts!) –

risposta

0

Non so su AST accurato, ma puoi certamente leggere i bytecode utilizzando pacchetti come ASM o BCEL e la scansione di quelle strutture di dati per le chiamate di funzione sarebbe ragionevolmente semplice. Certo, potrebbe essere dopo che è stata eseguita qualche ottimizzazione iniziale, quindi potrebbe non riflettere direttamente la fonte ... ed è prima della JIT, quindi potrebbe non riflettere direttamente ciò che è effettivamente in esecuzione.

Un'altra soluzione sarebbe quella di eseguire il codice sotto il controllo di un profiler, che potrebbe fornire una frequenza relativa o assoluta di invocazione da vari luoghi.

Nessuno di questi vi darebbe il numero di importazioni - questo è puramente un dettaglio sintattico-zucchero. Ma per la stessa ragione, non penso che sia in realtà un numero significativo.

+0

Questo approccio potrebbe rendere relativamente facile trovare i siti * call *. La parte difficile del problema è determinare quali metodi di destinazione specifici richiamano un sito di chiamata? Per questo, hai bisogno di un call-graph. Sì, le informazioni non elaborate per costruire un grafo delle chiamate sono in ASM o BCEL (così come lo sono anche nel codice sorgente). L'estrazione non è facile perché è necessario eseguire un'analisi punti per prima o simultaneamente. –

+0

Per i modelli di invocazione, un buon profiler può essere la soluzione migliore, dal momento che le tue ipotesi durante l'analisi manuale del codice potrebbero non corrispondere a ciò che accade realmente quando i condizionali eseguono il codice del mondo reale e la sottoclasse può introdurre livelli/alternative che non hai aspettatevi – keshlam

Problemi correlati