2012-07-26 12 views
10

This page descrive come posso utilizzare il generatore di codice in javac per generare codice dato che posso creare un AST (utilizzando un parser separato che ho scritto). La tecnica prevede la modifica del codice sorgente di javac per bypassare fondamentalmente il parser Java, in modo che uno possa fornire il proprio AST al generatore di codice. Questo potrebbe funzionare, ma speravo di farlo in un modo leggermente più pulito. Voglio includere la parte che genera codice di javac come libreria nel mio progetto, così posso usarla per generare codice, senza portare con sé il resto della sorgente di javac.Esiste una libreria Java per generare file di classe da un AST?

C'è un modo per farlo con javac, o c'è forse una libreria migliore?

Inoltre, sentitevi liberi di cambiare il titolo della domanda. Non riuscivo a pensarne uno migliore, ma è un po 'ambiguo. Se suggerisci una modifica per un titolo migliore, la accetterò.

+0

È questo il proprio AST, un AST intermedio comune o l'AST già utilizzato da javac? (Quella parte non è prontamente evidente per me.) –

+0

Il mio AST. Lo sto generando con un parser che ho scritto. (Ci scusiamo per l'ambiguità) – Hassan

+0

Se è il tuo AST, dovrai prima tradurre il modulo AST usato da javac. –

risposta

3

Penso che quello che potrebbe essere interessato a è una libreria Java come BCEL (ByteCode Engineering Library)

ho giocato intorno con esso indietro quando ho preso una classe sulla costruzione del compilatore, in fondo, ha una bella wrapper per generando il pool costante, inserendo istruzioni bytecode denominate in un metodo e quant'altro, al termine, è possibile caricare la classe in fase di esecuzione con un programma di caricamento classi personalizzato o scriverlo su un file nel modo normale.

Con BCEL, dovrebbe essere relativamente semplice passare dalla sintassi al bytecode java, anche se un po 'noioso, ma si consiglia di utilizzare semplicemente BCEL per generare il codice byte non elaborato senza costruire l'albero in alcuni casi .

+0

Certamente esaminerò BCEL. La fonte di Javac è comunque caotica. – Hassan

0

Un altro quadro interessante è ASM, un'analisi del codice byte e un framework di manipolazione.

Nel caso in cui non si voglia utilizzare un framework, sin da ora (2014), non è possibile generare bytecode da un albero utilizzando le rappresentazioni arbitrarie di com.sun.source.tree. * Come detto here.