Strumento di prototipazione della semantica del linguaggio di programmazione


11

Esiste uno strumento per la prototipazione di una semantica del linguaggio di programmazione e di un sistema di tipi che consenta anche una sorta di controllo del modello delle proprietà standard, come la solidità del tipo?

Lo sto chiedendo, perché sto leggendo un libro su Alloy e fornisce l'esatta funzionalità che desidero, ma per i modelli espressi usando la logica relazionale.

Sono a conoscenza di Ott , ma non ha questo tipo di funzionalità di "verifica del modello", poiché si concentra sulla generazione di codice per i sistemi di assistenza alla prova.

Qualsiasi riferimento su tale esistenza di strumenti sarebbe bello.


1
Ott è il primo passo, quindi fai il controllo del modello nel tuo assistente di prove preferito.
Gilles 'SO- smetti di essere malvagio'

@Gilles: Ok, ma un punto di uno strumento di verifica del modello è che genera un intero insieme di elementi di una determinata dimensione per verificare se la proprietà è effettivamente valida per loro. In questo modo, dovrò codificare questa parte di generazione per ogni lingua definita. Sapevi se esiste un modo per automatizzare questo passaggio di generazione?
Rodrigo Ribeiro,

Tecnicamente, puoi farlo in un assistente di prova (almeno in uno come Coq) ma probabilmente sarà molto lento. Gli assistenti di prova sono orientati verso prove assistite dall'uomo piuttosto che provare automaticamente milioni di modi per risolvere il problema. Se si desidera riutilizzare Ott, è possibile aggiungere un backend per il proprio correttore modello preferito.
Gilles 'SO- smetti di essere malvagio' il

Risposte:


8

Sebbene esistano framework creati appositamente allo scopo di prototipare linguaggi di programmazione (compresa la loro semantica, sistemi di tipi, valutazione, nonché controllo delle proprietà su di essi), la scelta migliore dipende dal caso particolare e dalle esigenze specifiche.

Detto questo, ci sono diverse alternative (forse non così distinte) che potresti prendere (che includono quelle che hai già menzionato):

  • utilizzando un linguaggio / framework specifico progettato per creare e prototipare nuovi linguaggi: ad esempio Redex [1], un linguaggio specifico del dominio incorporato in Racket per specificare e verificare la semantica (operativa) dei linguaggi di programmazione, che, data la definizione di un linguaggio, consente una facile gestione di compiti come la composizione tipografica (in lattice), l'ispezione di tracce di riduzione, test unitari e test casuali (ad esempio per il controllo della digitazione)
  • utilizzare linguaggi di modellazione generali che offrono la definizione e l'esecuzione di determinate analisi facilmente, purché siano in grado di acquisire la lingua specifica a portata di mano nella misura necessaria; La lega [2] è un esempio di tale approccio: sebbene piuttosto generale e flessibile, le lingue possono essere modellate come relazioni tra stati, mentre il supporto per il controllo del modello (ad es. Valutazione all'interno di tale linguaggio) viene fornito gratuitamente dopo che la semantica è espressa con un modello di relazione (ad esempio alcune idee per modellare la semantica di una lingua sono disponibili in [3])
  • incorporare la lingua per verificarne le proprietà usando un proverore di teoremi; un esempio potrebbe definire il linguaggio e la sua semantica incorporandolo in un sistema di prova come Coq [4] (ulteriori dettagli su questo approccio, nonché la discussione e la dimostrazione della differenza tra incorporamento profondo e superficiale in Coq è data in [ 5])
  • usare Ott (come già accennato, con spirito simile a Redex, ma fornendo un nuovo linguaggio di definizione piuttosto che essere incorporato); Ott consente di definire il linguaggio di programmazione in una notazione conveniente e di produrre composizioni e definizioni in un sistema di prova (di solito con incorporamento profondo), dove la maggior parte del controllo (cioè prova) deve essere eseguita manualmente
  • sviluppare il linguaggio e la sua semantica, nonché controlli appropriati (ad esempio come test) "da zero" in un linguaggio di programmazione generico e traduzione in altri sistemi, se necessario, a scopo di controllo (alcuni linguaggi come Leon [6], includere verificatori integrati, che consentono di provare automaticamente determinate proprietà e rendere questo approccio simile all'incorporamento in un sistema di prova)

Si noti che esiste un compromesso tra quanto sia facile utilizzare il framework / strumento (ad es. Facile come stendere la definizione su carta o in lattice) e quanto siano potenti i meccanismi per controllare le proprietà della lingua (ad es. Incorporare il il linguaggio in un proverbi teorema può consentire di controllare proprietà molto elaborate).

[1] Casey Klein, John Clements, Christos Dimoulas, Carl Eastlund, Matthias Felleisen, Matthew Flatt, Jay A. McCarthy, Jon Rafkind, Sam Tobin-Hochstadt e Robert Bruce Findler. Gestisci la tua ricerca: sull'efficacia della meccanizzazione leggera. POPL, 2012.

[2] Daniel Jackson. Lega: una leggera notazione di modellazione di oggetti. TOSEM, 2002.

[3] Greg Dennis, Felix Chang, Daniel Jackson. Verifica modulare del codice con SAT. ISSTA, 2006

[4] Sistema di gestione delle prove formali Coq

[5] Ragionamento formale sui programmi. Adam Chlipala, 2016

[6] Sistema automatizzato Leon per la verifica, la riparazione e la sintesi di programmi funzionali Scala

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.