2009-09-16 12 views
11

Abbiamo bisogno di generare codice sorgente Java. Facciamo questo modellando l'albero della sintassi astratta e disponiamo di un tree walker che genera il vero codice del codice sorgente. Tutto molto bene.Generazione di alberi di analisi del codice java e valutazione per test

Poiché il mio codice AST è un po 'vecchio, non ha il supporto per annotazioni e generici. Quindi mi sto occupando di progetti aperti da utilizzare per progetti futuri con esigenze di generazione di codice. E questo è dove arriva il vero problema. Vogliamo verificare che il codice generato abbia il comportamento corretto.

Ecco dove ho avuto l'idea di valutare effettivamente l'AST invece di generare il codice sorgente Java, compilarlo ed eseguire test su quel codice. Un valutatore accelererebbe i test unitari e uno potrebbe valutare pezzi più piccoli di codice generato, come solo un metodo, rendendo le "unità" più ragionevoli.

Finora ho trovato il progetto com.sun.codemodel che sembra abbastanza bello per essere una soluzione di generazione di codice basata su AST moderna (supporto per java5 e 6).

Qualcuno sa se c'è un altro progetto che mi consenta di valutare direttamente pezzi di AST (come un singolo metodo generato)?

+1

+1 domanda interessante, vogliamo le risposte ora :-) – KLE

+1

Vorrei solo generare il codice per tale metodo, compilare e testare. Creare un interprete è un bel po 'di lavoro. –

+0

non c'è alcuna opzione per far sì che javac emetta alberi di analisi e rappresentazioni intermedie? (tipo risoluzione, ricerca di classe, qualunque cosa abbia detto Ira Baxter nella loro risposta). –

risposta

2

Per valutare Java, è necessario tutte le analisi semantica che va di pari passo con essa ("qual è lo scopo di questo identificatore? Che tipo ha?") E come interprete.

Per ottenere quell'analisi semantica, è necessario più di un semplice AST: è necessaria la risoluzione del nome completo (costruzione della tabella dei simboli) e la risoluzione del tipo (determinazione dei tipi di espressione e convalida che le espressioni siano valide nel contesto in cui sono state trovate), così come classe di ricerca (che fa metodo effettivo foo riferisce?)

Con questo, si può considerare la costruzione di un interprete strisciando nel corso degli alberi in ordine di esecuzione. Dovrai anche creare un gestore di archiviazione; potresti non aver bisogno di fare un garbage collector completo, ma avrai bisogno di qualcosa. Avrai anche bisogno di un interprete per i file .class se vuoi veramente eseguire qualcosa, il che significa che hai bisogno di un parser (e anche del nome/tipo di risoluzione per i file di classe).

Non so se Eclipse ha tutto questo (almeno la parte del gestore di memoria che è possibile ottenere gratuitamente :). Mi sarei aspettato di farlo, dato che il suo design originale era quello di supportare lo sviluppo di Java, ma sono stato fortemente deluso da molti strumenti nel corso degli anni.

Il DMS Software Reengineering Toolkit è anche un programma di analisi/trasformazione che gestisce molte lingue. Ha un intero Java front end che include parsing, costruzione AST, costruzione di tabelle di simboli e risoluzione dei nomi, risoluzione dei tipi, costruisce i grafici delle chiamate (necessari per risolvere le chiamate di funzioni virtuali) e ha un lettore di file .class da avviare con la risoluzione dei nomi. Quindi sarebbe una buona base per costruire un interprete.

DMS può anche costruire AST arbitrari e quindi generare codice sorgente da essi, in modo da gestire anche la fine della generazione del codice.

[La ragione per cui DMS esiste è la parte "gravemente delusa"].

2

Non sono sicuro se questo è quello che stai cercando, ma il progetto JDT di Eclipse offre un'ottima vista su Java AST (incluse le funzionalità Java 5 e 6). Ha una serie di utility e strumenti per la visualizzazione/riscrittura del codice (non necessariamente generazione). Sono tutti autorizzati con la licenza pubblica Eclipse.

È possibile ottenere ulteriori informazioni presso http://eclipse.org/jdt/

+1

Sì, quella codemodel di one e Sun sembra essere la migliore opzione per generare codice creando AST. Ma quello che voglio in aggiunta, è la capacità di interpretare l'AST (con la semantica che segue Java compilato). – Christian

+0

JDT Core (all'indirizzo http://www.eclipse.org/jdt/core/index.php) pubblicizza quanto segue: "Supporto di valutazione in una pagina di album o in un contesto di debugger." Penso che darò un'occhiata ... –

Problemi correlati