Compilatore certificato e ottimizzazioni in Coq / Agda


9

Sono interessato a compilatori verificati formalizzati nella teoria dei tipi di Martin-Löf, ovvero Coq / Agda. Al momento ho scritto un piccolo esempio di giocattolo. In tal modo posso dimostrare che le mie ottimizzazioni sono corrette. Ad esempio, è possibile eliminare le aggiunte con zero, ovvero espressioni come "x + 0".

Ci sono ottimizzazioni difficili da eseguire con un normale compilatore, che potrebbero servire da buon esempio? È possibile dimostrare alcune proprietà di un programma che consentono ottimizzazioni che non è possibile eseguire con un compilatore regolare? (cioè senza l'inferenza che è possibile con un teorema prover)

Sarei interessato a idee o esempi e anche a riferimenti sull'argomento.

Una domanda correlata: prove di correttezza del compilatore

modifica: Come Tsuyoshi ha ben inserito nei commenti: sto cercando tecniche di ottimizzazione che sono difficili da implementare se un compilatore è scritto in (diciamo) C ma più facile da implementare se un compilatore è scritto in (diciamo) Coq. Mentre Agda si compila in C (tramite haskell) è possibile fare tutto il possibile in Agda anche in C. Probabilmente l'unico vantaggio dei dimostratori di teoremi come Coq / Agda è che il compilatore e le ottimizzazioni possono essere verificati.

edit2: Come suggerito da Vijay DI, scrivi quello che ho letto finora. Mi sono concentrato principalmente su Xavier Leroy e sul progetto CompCert di INRIA (c'è un documento di 80 pagine che è una buona lettura, credo). Un secondo interesse è stato per il lavoro di Anton Setzer sui programmi interattivi. Pensavo che forse il suo lavoro potesse essere usato per dimostrare le proprietà dei programmi IO e la bisimulazione dei programmi IO. Grazie per aver menzionato Sewell. Ho sentito il suo discorso "Racconti dalla giungla" all'ICFP e ho letto forse 2-3 dei suoi articoli. Ma non ho esaminato in modo specifico il suo lavoro e quello dei suoi coautori.
Non ho ancora scoperto da dove iniziare o cercare documenti sull'ottimizzazione dei compilatori; ad esempio, quali ottimizzazioni sarebbero interessanti da guardare nell'impostazione di un compilatore verificato.


1
"Ci sono ottimizzazioni che sono difficili da eseguire con un normale compilatore": Non è impossibile? Se rimuovo una prova di correttezza da un compilatore verificato, otterrei un compilatore regolare. Pertanto, tutto ciò che un compilatore verificato può fare può essere fatto anche da un compilatore normale. Il punto di un compilatore verificato è che non può eseguire un'ottimizzazione errata. (Le mie conoscenze sui compilatori e sulla verifica dei programmi sono minime. Mi scusi se mi manca il punto.)
Tsuyoshi Ito

@Tsuyoshi grazie per il tuo commento. Intendevo: posso dimostrare determinate proprietà (che sono garantite per essere mantenute) per un programma (ad esempio, una subroutine non è partecipante e non può mai chiamare se stessa) che consentono di eseguire ottimizzazioni che di solito non sono possibili. Alcuni invarianti potrebbero essere difficili da verificare per un programma e forse queste ottimizzazioni non vengono eseguite dai compilatori di uso comune. Ma forse mi sbaglio completamente.
Martedì

1
Stai parlando di un compilatore scritto in Coq / Agda o di un compilatore per Coq / Agda? Pensavo che la tua domanda riguardasse un compilatore scritto in Coq / Agda, ma poi non penso che un compilatore scritto in Coq / Agda possa dimostrare più proprietà sui programmi target di un compilatore scritto in C.
Tsuyoshi Ito

2
Sarebbe bene aggiungere ciò che hai letto alla domanda. Conosci il lavoro sulla compilazione verificata, ad esempio quella di Xavier Leroy? O quello di Peter Sewell e dei collaboratori?
Vijay D,

1
Non ci sono ottimizzazioni di questo tipo, a meno che tu non limiti ulteriormente la tua domanda. In casi estremi, il compilatore C può implementare segretamente un proverti teorema nelle sue viscere (e la maggior parte in realtà lo fa in modo limitato). Penso che non sia chiaro cosa intendi per "compilatore regolare".
Andrej Bauer,

Risposte:


5

questo articolo di Yves Bertot, Benjamin Gr´egoire e Xavier Leroy costruisce un compilatore ottimizzante per un linguaggio di tipo C basato esclusivamente sulle specifiche Coq. alcune di questa tecnologia è apparentemente utilizzata nel compilatore CompCert C .

Un approccio strutturato per dimostrare l'ottimizzazione del compilatore basato sull'analisi del flusso di dati

considera la correttezza di due ottimizzazioni, la propagazione costante (CP) e l'eliminazione della sottoespressione comune (CSE), sezione 4. queste ottimizzazioni sono più avanzate di quelle associate ai compilatori non basati su Coq per la stessa lingua. vedi ad esempio questo grafico di riferimento rispetto a gcc. (il compilatore basato su Coq è presumibilmente più lento da compilare anche se questo è raramente menzionato!)

Un aspetto originale di ConCert è che la maggior parte del compilatore è scritto direttamente nel linguaggio delle specifiche Coq, in uno stile puramente funzionale. Il compilatore eseguibile è ottenuto mediante estrazione automatica del codice Caml da questa specifica.

tuttavia alla fine dell'articolo notano che ci sono alcune ottimizzazioni del compilatore in compilatori reali che non possono essere modellate nel loro framework.

l'ottimizzazione migliorata non è l'unico elemento da considerare qui, un altro aspetto è che la logica di ottimizzazione del compilatore può essere soggetta a sottili difetti a causa della sua natura complessa. nel corso degli anni è stato riscontrato che gcc ha dei bug nelle sue numerose routine logiche di ottimizzazione. ad es. bug gcc?


3

Posso dimostrare determinate proprietà (che sono garantite per essere conservate) per un programma (ad esempio, una subroutine non è partecipante e non può mai chiamare se stessa) che consentono di eseguire ottimizzazioni che di solito non sono possibili.

È equivalente all'estensione del typechecker per fornire all'ottimizzatore alcune proprietà di un programma. Credo che Tsuyoshi Ito abbia ragione e potresti essere un po 'fuorviante su Coq. È un ottimo strumento per fornire un compilatore senza bug, ma nel caso che descrivi, non fornisce più potenza alle analisi statiche.

L'unica cosa che posso pensare sul rafforzamento delle analisi statiche con Coq è di equipaggiare il tuo linguaggio con affermazioni contenenti alcune prove scritte dall'utente. - Se il compilatore stesso fosse tradotto in una lingua che include una sfumatura per il controllo dinamico dei caratteri e se le prove scritte dall'utente fossero convertibili in funzioni, sarebbe possibile applicare tali funzioni come proprietà prerequisito per alcuni sottotitoli o ottimizzazioni. - Questo in effetti, fornirebbe più potenza al compilatore.

Tuttavia, per quanto posso vedere, sarebbe piuttosto utile per rafforzare il sottotipo. - È difficile far sapere a un programmatore quale proprietà in quale luogo sarebbe utile per l'ottimizzatore.

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.