Domanda

Sto lavorando su un compilatore per il mio linguaggio personalizzato. Mentre stavo leggendo un articolo sull'ottimizzazione del codice, ho notato che si presume che la rappresentazione intermedia del codice fosse già stata formata. Anche se non ho ancora iniziato a scrivere la sezione di ottimizzazione del mio compilatore, lo stavo attraversando nella mia testa e sembra preferibile avere l'ottimizzatore azionare sull'albero di sintassi prima di convertirsi nella rappresentazione intermedia.

C'è una ragione per preferire un approccio all'altro o per lo più una questione di gusto personale?

Ad esempio, supponiamo di avere un blocco if come

if ( some_expression ) {
    do_stuff
}
.

Se potrebbe essere riconosciuto dal compilatore che some_expression valuterà sempre il vero e non ha effetti collaterali, allora potrei rimuovere il suo calcolo semplicemente potando l'albero.

Tuttavia, se avessi già convertito l'albero in una rappresentazione intermedia, come un elenco di ish di assembly-ish di semplici istruzioni, i processi di riconoscimento e risoluzione dello scenario sarebbero (nella mia immaginazione da quando non ho ancora tentato di implementato questo) molto più complicato.

È stato utile?

Soluzione

In questi giorni, la tendenza è quella di fare ottimizzazione con la rappresentazione intermedia. Check out llvm ad esempio:

.

Le librerie di core LLVM forniscono un moderno ottimizzatore indipendente dalla fonte e dall'obiettivo, insieme al supporto di generazione del codice per molte CPU popolari (così come alcuni meno comuni!) Queste librerie sono costruite attorno a una rappresentazione del codice ben specificata nota come il Rappresentazione intermedia di LLVM ("LLVM IR"). Le librerie di Core LLVM sono ben documentate, ed è particolarmente facile inventare la tua lingua (o porta un compilatore esistente) per utilizzare LLVM come ottimizzatore e generatore di codice.

llvm può fornire un ottimizzatore indipendente di origine perché esegue i suoi passaggi di ottimizzazione sul codice solo dopo che è rappresentato in Llvm IR.

Perché potrebbe essere molto più complicato fare questo? Dipende dalla tua rappresentazione intermedia. Uno degli obiettivi di progettazione per la rappresentazione intermedia sarebbe quello di facilitare varie ottimizzazioni piuttosto che renderli inutilmente complicati. Vedi tutte le ottimizzazioni che LLVM può ottenere il lavoro sul LLVM IR, ad esempio, in questo Elenco di analisi e trasformazione passa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a cs.stackexchange
scroll top