5

Ho letto le tecniche del compilatore di ottimizzazione locale, ma continuo a non capire come vengono implementate. L'idea è che l'ottimizzatore guardi ogni volta una "finestra" del codice e in qualche modo rilevi schemi e li sostituisca con versioni più ottimizzate.pattern di ottimizzazione dello spioncino

La mia domanda è: come si scoprono questi modelli? (supponiamo che la tua piattaforma sia una VM che emette codice assembly per un computer inventato, come Hack di Schocken).

Le persone ispezionano il codice manualmente (utilizzando i diagrammi di flusso di controllo o i DAG o altro) e quindi raccolgono tutti i modelli identificati e li codificano nell'ottimizzatore? O c'è un modo automatico.

Ad esempio, si alimenta il codice in fase di ottimizzazione in un analizzatore e si spiegano i suddetti motivi. Se è così, come si può iniziare a scriverne uno?

+0

Penso che questo sia generalmente chiamato "cache in linea". Troverai molta letteratura per i recenti motori JavaScript che utilizzano questa tecnica in fase di esecuzione. Vedi http://wingolog.org/archives/2012/05/29/inline-cache-applications-in-scheme. – leppie

+0

È interessante, la prima volta che mi imbatto in questo. Generalmente pensavo a operazioni come la riduzione della forza, la valutazione costante, il controllo del flusso opt, ecc. – gfountis

+0

Questo sembra essere mirato al "runtime" sì? O è usato per generare un codice di assemblaggio più stretto? – gfountis

risposta

3

Le ottimizzazioni dello spioncino classico non riguardano la riduzione della forza e le altre cose che nominate. Sono 2-3 sequenze di istruzioni, come ad esempio

BRANCH FALSE $1 
BRANCH $2 
$1: 

che può essere ridotto a

BRANCH TRUE $2 

Sequenze come questa può sorgere in generatori di codice naive come venire con compilatori single-pass che non lo fanno generare AST, come alcuni compilatori COBOL su cui ho lavorato.

+0

Vedo, ma come si possono scoprire queste sequenze? c'è una lista di modelli da qualche parte pubblicati? Le persone compilano codice casuale e quindi iniziano a cercarli da soli? – gfountis

+0

Inoltre, non era un esempio di ottimizzazione del flusso di controllo?=) – gfountis

+1

@gfountis Sicuro, ma i compilatori di cui sto parlando non eseguono analisi del flusso. Le sequenze di spioncini sarebbero ovvie per qualsiasi programmatore di assemblaggi decente, se ne è rimasto qualcuno. Basta controllare l'output e pensare 'hmm ...'. Questo è tutto nei soliti libri. – EJP

1

Dipende da voi se scrivere il proprio analizzatore o utilizzare quelli esistenti. In entrambi i casi l'analizzatore continua a controllare il codice fino a quando non è più ottimizzato. Se si presta un esempio di GCC, ha passaggi specifici per l'ottimizzazione. Il codice intermedio del programma viene assegnato a questi passaggi che vengono eseguiti uno dopo l'altro e ottimizzano il codice. Anche qualsiasi pass può essere eseguito più di una volta.
Se si desidera approfondire la modalità di scrittura di queste ottimizzazioni, è sufficiente passare attraverso il file pass in GCC.

+0

Quindi, nel caso in cui si volesse ottimizzare per la generazione di codice non x86 (per una piattaforma giocattolo), l'unico modo è scrivere il proprio analizzatore o farlo per "mano" giusto? – gfountis

+0

La domanda riguarda l'ottimizzazione dello spioncino e non hai risposto. – EJP