2009-09-30 13 views
23

Sto studiando corso compilatori, compilazione di programma segue i passaggi qui sottoCome posso vedere albero di analisi, codice intermedio, codice di ottimizzazione e codice assembly durante COMPILATION?

  1. Analisi lessicale
  2. Sintassi analisi
  3. Analisi semantica
  4. generazione del codice intermedio
  5. Ottimizzazione del codice
  6. target generazione del codice.

Come visualizzare l'output di ciascun passaggio, ad esempio Voglio vedere l'albero di analisi dopo l'analisi della sintassi.

Sto compilando un programma su una macchina Linux con compilatore GCC.

Possiamo vedere il codice assembly del programma usando l'opzione -Wa del compilatore in gcc, allo stesso modo ci sono opzioni per vedere Token, Parse tree e Inetmediate code.

risposta

8

È possibile visualizzare l'output del preprocessore con -E. -fdump-tree-* esegue il dump della rappresentazione interna dell'albero, ad es. -fdump-tree-all. Sono disponibili varie opzioni -d per eseguire il dump delle rappresentazioni intermedie RTL, ad es. -fdump-rtl-all (consultare il manuale per i passaggi inviduali di cui si ricevono i dump); inoltre, -dD scarica tutte le definizioni di macro.

+2

Una nota per i lettori: con l'opzione il compilatore scarica l'albero in un file con il nome del codice sorgente e un suffisso come ".optimized". Non è affatto ovvio, ho speso ≈20 minuti, ho esaminato una documentazione e ho cercato casi in cui gcc non produce la discarica, quando occasionalmente ho notato il nuovo file * (che non è facile dato che ho fatto un test in '/ tmp /', che è piuttosto junky) *. –

15

Mentre è possibile utilizzare le opzioni -fdump-tree-all e -fdump-rtl-all in gcc, non penso che il loro output sia molto utile per uno studente del compilatore. FWIW, ho iniziato a lavorare su gcc come parte dei miei studi di dottorato, avendo già completato due corsi di laurea e ho trovato gcc ei suoi file di debug erano opachi e difficili da seguire.

Inoltre, gcc non segue realmente la progettazione di libri di testo dei compilatori. Nessuno, davvero, perché non funziona bene in quel modo. Sono abbastanza sicuro che gcc non produce un albero di analisi o un albero di sintassi astratto. Costruisce un IR (chiamato gimple) su cui eseguire le sue ottimizzazioni di alto livello.

Vorrei suggerire di provare LLVM, che ha una reputazione per essere ben progettato e facile da seguire. Un'altra alternativa è scaricare il codice da un libro di testo, in particolare il libro di Appel, assumendo che sia disponibile.

Un altro suggerimento, se posso raccomandare il mio per un momento, è quello di utilizzare phc. Con phc, è possibile vedere l'albero di analisi come un'immagine e visualizzare l'AST e il codice sorgente dopo ogni singola passata nel compilatore. Here is a comparison of parts of the AST and the parse tree. Sono generati banalmente usando phc. Sul ramo dataflow, è possibile visualizzare gli IR del compilatore, il modulo CFG, SSA e l'output di debug di inferenza di tipo e analisi alias. Puoi anche attivare le ottimizzazioni e attivare e disattivare i video per vedere l'effetto che hanno.

Penso che questo potrebbe essere utile per voi.

+0

Oh no, questo è il tuo sito? La spiegazione dell'eredità virtuale di quel sito è fantastica.Dopo aver letto che ho davvero avuto il "perché" del virtuale e che è prefigurato nei sistemi di oggetti C. I tuoi pensieri su buoni compilatori pedagogici sono diversi oggi? – Praxeolitic

+0

Ma 'phc' sembra essere un compilatore da solo, cioè non è un'applicazione per facilitare la comprensione bytecode di GCC. –