Il compilatore Stalin ottimizza brutalmente, ma come?


14

La dichiarazione di ricerca di JM Siskind afferma:

Stalin è un compilatore di ottimizzazione per Scheme che esegue analisi statiche dell'intero programma e utilizza i risultati di tale analisi per generare codice estremamente efficiente. Stalin utilizza una vasta collezione di tecniche di analisi statica. Esegue una nuova forma di analisi del flusso polivinescente che utilizza l'analisi del flusso monovariante iterata per eseguire la suddivisione orientata al flusso: clonazione di copie specializzate di procedure e assegnazione di siti per chiamata di target a tali cloni. Utilizza i risultati dell'analisi del flusso per eseguire analisi del tempo di vita, analisi di escape, analisi point-to e analisi must-alias. Queste analisi supportano una nuova forma di conversione di chiusura leggera che elimina la maggior parte degli slot di chiusura, utilizzando tecniche come la globalizzazione e la localizzazione variabili, comprime il backchain statico e di solito elimina la maggior parte delle chiusure dai programmi. Utilizza inoltre le analisi di cui sopra per supportare la gestione dell'archiviazione basata sul flusso in base alla regione, in cui la garbage collection di runtime viene sostituita con allocazione statica e deallocazione su base per valore astratto e per punto di programma. Esegue anche la conversione CPS leggera orientata al flusso, utilizzando estensioni delle tecniche introdotte con Screamer, per supportare continuazioni di prima classe estremamente efficienti. Infine, supporta la linea di flusso diretta e la selezione della rappresentazione di basso livello per scegliere l'implementazione (o non implementazione) di tag, controllo tag e invio di tag in base al valore per abstract e per punto di programma. Ciò elimina la maggior parte dei tag di runtime, controllo tag, tag, stripping tag, invio tag, boxing e unboxing dai programmi. dove la garbage collection di runtime viene sostituita con allocazione statica e deallocazione in base al valore per abstract e per punto di programma. Esegue anche la conversione CPS leggera orientata al flusso, utilizzando estensioni delle tecniche introdotte con Screamer, per supportare continuazioni di prima classe estremamente efficienti. Infine, supporta la linea di flusso diretta e la selezione della rappresentazione di basso livello per scegliere l'implementazione (o non implementazione) di tag, controllo tag e invio di tag in base al valore per abstract e per punto di programma. Ciò elimina la maggior parte dei tag di runtime, controllo tag, tag, stripping tag, invio tag, boxing e unboxing dai programmi. dove la garbage collection di runtime viene sostituita con allocazione statica e deallocazione in base al valore per abstract e per punto di programma. Esegue anche la conversione CPS leggera orientata al flusso, utilizzando estensioni delle tecniche introdotte con Screamer, per supportare continuazioni di prima classe estremamente efficienti. Infine, supporta la linea di flusso diretta e la selezione della rappresentazione di basso livello per scegliere l'implementazione (o non implementazione) di tag, controllo tag e invio di tag in base al valore per abstract e per punto di programma. Ciò elimina la maggior parte dei tag di runtime, controllo tag, tag, stripping tag, invio tag, boxing e unboxing dai programmi. utilizzando estensioni delle tecniche introdotte con Screamer, per supportare continuazioni di prima classe estremamente efficienti. Infine, supporta la linea di flusso diretta e la selezione della rappresentazione di basso livello per scegliere l'implementazione (o non implementazione) di tag, controllo tag e invio di tag in base al valore per abstract e per punto di programma. Ciò elimina la maggior parte dei tag di runtime, controllo tag, tag, stripping tag, invio tag, boxing e unboxing dai programmi. utilizzando estensioni delle tecniche introdotte con Screamer, per supportare continuazioni di prima classe estremamente efficienti. Infine, supporta la linea di flusso diretta e la selezione della rappresentazione di basso livello per scegliere l'implementazione (o non implementazione) di tag, controllo tag e invio di tag in base al valore per abstract e per punto di programma. Ciò elimina la maggior parte dei tag di runtime, controllo tag, tag, stripping tag, invio tag, boxing e unboxing dai programmi.Queste analisi e ottimizzazioni consentono a Stalin di generare un codice estremamente efficiente che supera tutti gli altri compilatori di Scheme per fattori che vanno da duecento a cento, in particolare per il codice a intensità numerica. Stalin genera spesso un codice che supera quello scritto a mano c e il codice Fortran.

Sono stato in grado di trovare il seguente documento molto interessante sull'implementazione di chiusure / chiamate di funzione: Conversione di chiusura leggera a flusso diretto . Ho anche inviato un'e-mail all'autore per chiedere i documenti sugli altri argomenti, che sono menzionati come da scrivere nel documento di conversione di chiusura:

Siskind, JM 2000a. Conversione CPS leggera orientata al flusso. In preparazione.

Siskind, JM 2000b. Polivalenza orientata al flusso. In preparazione.

Siskind, JM 2000c. Selezione della rappresentazione orientata al flusso. In preparazione.

Siskind, JM 2000d. Gestione dell'archiviazione orientata al flusso. In preparazione

Sfortunatamente, non è mai riuscito a scrivere quei documenti. La mia domanda per te è: ci sono documenti alternativi o correlati che trattano questi argomenti? Sono molto interessato a sapere come Stalin (o altri compilatori) può compilare un linguaggio di così alto livello come Scheme che viene raccolto, immesso in modo dinamico, supporta funzioni di prima classe e persino continuazioni di prima classe, che possono essere compilate staticamente in un codice così efficiente . Sebbene i documenti sull'analisi del flusso siano abbastanza abbondanti, i documenti sull'uso dei risultati di tale analisi per fare le ottimizzazioni sopra menzionate non lo sono.

Risposte:


11

La chiave è probabilmente il fatto che utilizza l'intera analisi del programma e l'ottimizzazione dell'intero programma. Più sai come si comporta un programma, più puoi specializzarti, incorporare e rendere performante.

Il compilatore MLton per Standard ML fa una cosa simile ( http://mlton.org/ ). C'è una presentazione (almeno) al riguardo: http://mlton.org/pages/References/attachments/060916-mlton.pdf .

Il lavoro precedente è stato svolto da Craig Chambers e dal suo gruppo all'Università di Washington (ad esempio: http://www.cs.washington.edu/research/projects/cecil/www/pubs/jdean-thesis.html ). Ciò è stato fatto nel contesto del Sé e successivamente di Cecil / Vortex.

Probabilmente c'è più lavoro nella comunità Scheme / Lisp. Probabilmente vuoi prendere in considerazione google "ottimizzazione dell'intero programma".

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.