Ottimizzazioni nella progettazione del compilatore

0

Durante gli studi sull'ottimizzazione in Compiler Design ho esaminato un articolo che parla di "Algebraic Simplification and Reassociation" in ottimizzazione . usando questa (algebrica semplificazione) potremmo ignorare le istruzioni di codice come X = X * 1 .

Ma mi piacerebbe sapere se qualcuno usa questo tipo di affermazioni perché naturalmente nessuno potrebbe mai fare una tale moltiplicazione. O se mostra qualche ottimizzazione indiretta come la rottura di un enorme codice in istruzioni e poi ottenerle ( X = X * 1 ) tipi di dichiarazioni di codice. Qualcuno potrebbe aiutarmi.

    
posta justin 15.11.2014 - 07:01
fonte

2 risposte

4

Gli esempi nel documento a cui stai collegando sono (e sono destinati ad essere) esempi semplificati di un particolare tipo di ottimizzazione. Nel mondo reale, ovviamente, non è particolarmente probabile che uno sviluppatore scriva esplicitamente una dichiarazione come x = x * 1 , quindi non è particolarmente importante che un compilatore ottimizzi quella specifica affermazione. D'altra parte, ci sono molte trasformazioni più complesse di questo tipo che un compilatore può implementare che sarebbe molto più utile per i programmi reali.

L'articolo a cui si rimanda parla di come l'applicazione della semplificazione algebrica e della riassociazione viene spesso utilizzata per integrare altre ottimizzazioni. Può essere utilizzato per riorganizzare le espressioni al fine di implementare la riduzione della forza dell'operatore o il piegamento costante o il movimento del codice invariante il ciclo. Molte delle trasformazioni algebriche che il compilatore sta per applicare saranno con l'obiettivo di fare cose come raccogliere tutti i termini costanti di un'espressione insieme in modo che possano essere scomposti, raccogliendo tutti i termini invarianti del ciclo insieme in modo che possano essere spostati fuori dal ciclo, ecc.

Un bell'esempio di questo è la sezione "Semplificazioni algebriche delle espressioni di indirizzamento" in questa parola doc .

Se vuoi un esempio di un caso in cui verrebbe utilizzata una trasformazione molto semplice, immagina qualcosa come

[(4*(a + b))/ (4*a)] * c

facendo la semplificazione algebrica, ottieni

[(4*a + 4*b)/ (4*a)] * c
[(4*a)/(4*a) + (4*b)/(4*a)] * c
[1 + b/a] * c
(1*c) + (b/a)*c
c + (b*c)/a

La semplificazione 1*c = c arriva verso la fine e solo dopo diverse altre semplificazioni algebriche e trasformazioni create quell'espressione. Generalmente, non sono gli sviluppatori umani che stanno scrivendo questo, è il compilatore che applica altre trasformazioni che alla fine si basano su semplici regole.

    
risposta data 15.11.2014 - 08:21
fonte
2

Affermazioni come x = x * 1 o y = y + 0 sono più comuni di quanto si possa pensare. Possono non essere scritti esattamente in quella forma nel codice sorgente (di alto livello), ma si verificano frequentemente dopo la conversione del codice di alto livello in codice a tre indirizzi.
Altre ottimizzazioni, come la propagazione costante, possono anche risultare in espressioni così banali.

Un costrutto molto comune che può dare l'espressione y = y + 0 nel codice a tre indirizzi è l'accesso al primissimo membro di una struttura o classe di dati composta (nei linguaggi OO, questo è spesso il vtable utilizzato per la distribuzione virtuale).

    
risposta data 15.11.2014 - 08:47
fonte

Leggi altre domande sui tag