Il compilatore per il tipo dipendente è molto più difficile di un intero?


11

Ho imparato qualcosa sull'implementazione di tipi dipendenti, come questo tutorial , ma la maggior parte di essi sta implementando interpreti. La mia domanda è, sembra che l'implementazione di un compilatore per il tipo dipendente sia molto più difficile di un compilatore, perché puoi davvero valutare gli argomenti del tipo dipendente per il controllo del tipo.

Così

  • La mia impressione ingenua è giusta?
  • Se è giusto, qualche esempio / risorsa sull'implementazione di un linguaggio controllato staticamente che supporti il ​​tipo dipendente?

No, poiché è possibile ridurre i tipi dipendenti compilando il problema a un problema noto: (1) digitare il programma usando un interprete; (2) estrarre il programma su OCaml / Haskell / qualunque; (3) compilare usando ocamlopto GHC :-) (A proposito, questo è l'approccio Coq e Agda.)
xrq

Risposte:


12

Questa è una domanda interessante! Come suggerisce la risposta di Anthony, si possono usare i soliti approcci per compilare un linguaggio funzionale non dipendente, purché si abbia già un interprete per valutare i termini per il controllo del tipo .

Questo è l'approccio adottato da Edwin Brady. Ora questo è concettualmente più semplice, ma perde i vantaggi di velocità della compilazione quando si esegue il controllo del tipo. Questo è stato affrontato in diverse maniere.

Innanzitutto, è possibile implementare una macchina virtuale che compila i termini in byte-code al volo per eseguire il controllo di conversione. Questa è l'idea alla base vm_computeimplementata in Coq da Benjamin Gregoire . Apparentemente c'è anche questa tesi di Dirk Kleeblatt su questo argomento esatto, ma verso il basso il codice macchina reale piuttosto che una macchina virtuale.

In secondo luogo, si può generare codice in un linguaggio più convenzionale che, al momento dell'esecuzione, controlla tutte le conversioni necessarie per il controllo del tipo di un programma tipizzato in modo dipendente. Questo significa che possiamo usare Haskell, diciamo, per controllare il tipo di un modulo Agda. Il codice può essere compilato ed eseguito, e se accetta, si può presumere che il codice nel linguaggio di tipo dipendente sia ben digitato (salvo errori di implementazione e compilatore). Ho sentito per la prima volta questo approccio suggerito da Mathieu Boesflug .

Infine, si potrebbe richiedere che i termini che compaiono nei tipi e i termini che si intende eseguire siano parte di due lingue distinte. Se i termini che appaiono a livello di tipo non hanno essi stessi tipi dipendenti, si può compilare in due fasi: in primo luogo, compilare il codice "a livello di tipo" e quindi è possibile eseguirlo quando si controllano i tipi di "livello a termine" codice. Non sono a conoscenza di alcun sistema che procede in questo modo, ma è potenzialmente possibile per molti sistemi, come il linguaggio F* di Microsoft che ha termini distinti a livello di tipo e di programma.


1
Un po 'ironico: perché dovresti preoccuparti di scrivere un compilatore se hai un interprete che fa il controllo del tipo? Dopotutto, la maggior parte (tutti?) Gli utenti seri di linguaggi di programmazione tipicamente dipendenti si preoccupano solo del controllo del tipo, usando il linguaggio come assistente di correzione. Certamente non ho mai eseguito nessuno dei miei programmi Agda o Coq. Quindi, se ti interessa la velocità, non vorresti compilare le conversioni di tipo?
Martin Berger,

2
Le soluzioni 2 e 3 affrontano questo problema: si compila il codice che controlla la tipicità (e in particolare esegue le conversioni di tipo). La mia seconda osservazione è che in realtà vuoi eseguire codice tipicamente dipendente in alcune situazioni (vedi Idris, Ur / Web).
codice

1
Inoltre: fino a un certo punto, anche la soluzione 1 la affronta, confondendo le linee tra interprete e compilatore.
cody,

1
Mi chiedo se la tecnica delle proiezioni futurama possa essere utilizzata per accelerare l'interprete, finendo effettivamente con un compilatore?
Steven Shaw,

1
L'unica cosa che ho visto è Unison unisonweb.org/2017-10-13/scala-world.html
Steven Shaw,

10

La tesi di dottorato di Edwin Brady delinea come costruire un compilatore per un linguaggio di programmazione tipicamente dipendente. Non sono un esperto, ma direi che non è estremamente difficile implementare un compilatore simile a System F. Molti dei principi sono abbastanza simili e alcuni sono gli stessi (ad es. Compilazione di supercombinatori). La tesi copre molte altre preoccupazioni.

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.