Algoritmi di verifica del tipo


19

Sto iniziando una ricerca bibliografica personale sugli algoritmi di controllo del tipo e voglio alcuni consigli. Quali sono gli algoritmi, le strategie e le tecniche generali di controllo del tipo più comunemente usati?

Sono particolarmente interessato a complessi algoritmi di controllo del tipo che sono stati implementati in linguaggi tipizzati fortemente statici ampiamente noti come, ad esempio, C ++, Java 5+, Scala o altri. IE, algoritmi di controllo del tipo che non sono molto semplici a causa della tipizzazione molto semplice del linguaggio sottostante (come Java 1.4 e precedenti).

Non sono di per sé interessato a una lingua specifica X, Y o Z. Sono interessato a algoritmi di controllo del tipo, indipendentemente dalla lingua di destinazione. Se fornisci una risposta del tipo "linguaggio L di cui non hai mai sentito parlare e che è fortemente tipizzato e la digitazione è complessa ha un algoritmo di controllo del tipo che esegue A, B e C controllando X e Y utilizzando l'algoritmo Z", oppure "il la strategia X e Y usata per Scala e una variante Z di A usata per C # sono fantastiche a causa delle caratteristiche R, S e T che funzionano in quel modo ", quindi le risposte sono buone.


3
Forse dovresti modificare questa domanda per chiedere il controllo del tipo per una lingua specifica. Le domande aperte e di tipo elenco sono generalmente sconsigliate su SE (sebbene questo particolare sito non abbia ancora una politica in merito). Inoltre: <type-system-elitist> Il sistema dei tipi di Java non è complesso </type-system-elitist>.
sepp2k,

3
Forse la domanda potrebbe essere riformulata per essere più specifica, ma non credo che dovrebbe essere chiusa.
Dave Clarke,

1
@ sepp2k: so che è un po 'ampio, ma è finito in questo modo perché non voglio limitare l'utilità delle risposte. A proposito, non ho capito cosa vuoi dire con "<type-system-elitist> il sistema di tipi di Java non è complesso </type-system-elitist>". Il sistema di tipo 1.4 e sotto di Java in effetti era semplice, ma con i generici in Java 5, divenne molto più complesso.
Victor Stafusa,

2
Chiedere una lingua particolare renderebbe la domanda più inadatta a questo sito, imho. La domanda dovrebbe forse chiedere tecniche generali.
Raffaello

1
@Victor Uno strumento di base sono le grammatiche degli attributi . Forse non sarai in grado di fare ogni cosa malvagia che puoi immaginare con loro, ma sono un buon punto di partenza.
Raffaello

Risposte:


13

La maggior parte della ricerca non pubblica effettivamente gli algoritmi di controllo del tipo per linguaggi di programmazione completi. Troverai alcune formalizzazioni di gran parte dei sistemi di tipi per linguaggi di programmazione completi, come il lavoro svolto da Drossopoulou ed Eisenbach per Java o Nipkov et al lavoro su C ++ . Più spesso, tuttavia, troverai solo i sistemi di tipi per una parte fondamentale del linguaggio (Featherweight Java ne è un esempio) o per i concetti chiave di un linguaggio come l' approccio di inferenza del tipo locale di scala .

In conferenze come POPL e ICFP troverai molti algoritmi di verifica dei tipi per tipi specifici di sistemi di tipi e nuovi approcci come bidirezionale e controllo del tipo tridirezionale .

Più in generale, probabilmente è necessario conoscere l' algoritmo Damas-Milner , l'inferenza del tipo locale, il controllo bidirezionale e tridirezionale del tipo ed espandersi da lì, seguendo i riferimenti nei documenti e utilizzando google scholar per trovare quali documenti citano questi e costruire su gli approcci descritti. Inoltre, come suggerito sopra, conferenze come POPL, ICPF, ESOP e persino ECOOP e OOPSLA avranno documenti pertinenti alla tua ricerca.


Dopo tutto, il sistema di tipi di Scala è stato sviluppato in progetti di ricerca e viene quindi pubblicato. Anche il compilatore è open source. Non ho esaminato neanche, però.
Raffaello

Non c'è bisogno che io deduca; Io so che ci sono articoli pubblicati sul sistema di tipi di Scala. Questa affermazione viene prontamente verificata dalla ricerca . Inoltre, considero il codice sorgente del compilatore come una pubblicazione sufficiente sull'algoritmo (purché sia ​​incluso nelle fonti; presumo di sì ma non ho verificato). La mia affermazione iniziale è stata ambigua, vera, ma la tua reazione sembra ingiustificata.
Raffaello

2

Uno strumento di base sono le grammatiche degli attributi . Forse non sarai in grado di fare ogni cosa malvagia che puoi immaginare con loro, ma sono un buon punto di partenza.

In sostanza, puoi camminare sull'albero di sintassi astratto di un programma dall'alto verso il basso e / o dal basso verso l'alto e passare informazioni in giro. Pertanto, ad esempio, è possibile passare verso il basso le informazioni sul tipo di ambito globale (ad es. Classi e i relativi membri) e determinare ricorsivamente il tipo di espressioni, ovvero dal basso verso l'alto, passando i tipi risultanti verso l'alto.

Trova alcune spiegazioni ed esempi nelle diapositive qui (Capitolo 5).


Qualcuno ha un riferimento migliore? Immagino di dover comprare il Dragonbook o Wilhelm / Maurer uno di questi giorni ...
Raffaello

1
Lo strumento JastAdd è un eccellente e moderno sistema di compilazione di compilatori basato su grammatiche di attributi di riferimento. L'abbiamo usato in numerosi progetti.
Dave Clarke,
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.