Che cos'è una sorta di semantica del linguaggio di programmazione?


9

Nel capitolo 1 di Basi pratiche per i linguaggi di programmazione , l'autore menziona che gli alberi di sintassi astratti sono associati a specie .

Intuitivamente, i tipi sono come i tipi, ma mi piacerebbe sapere se hanno una definizione precisa. Sarei felice se anche alcuni riferimenti fossero forniti.

Risposte:


4

Dipende da quale semantica prenderemmo per tipi e specie. - Tuttavia, una breve - informale - definizione potrebbe essere - Gli ordinamenti sono classi di AST e i tipi sono classi di valori .


4

Vi è in realtà molta somiglianza tra i tipi per la sintassi abstact e tipi come di solito capito. Ma i tipi sono un concetto sintattico formale e anche gli alberi AS sono sintassi, mentre i tipi sono un concetto semantico .

La terminologia deriva dal termine algebre (chiamate anche algebre libere ) e algebra universale . Queste sono essenzialmente teorie sintattiche delle strutture algebriche, analizzate indipendentemente da qualsiasi interpretazione. Sono stati sviluppati nella prima metà del 20 ° secolo.

Un termine può essere visto come un albero, in cui i nodi sono etichettati da un insieme finito di operatori, ogni operatore ha un'arità fissa che specifica il numero di figlie nell'albero. Arity 0 è per le foglie. Nelle algebre multi-ordinate, questo viene perfezionato con ordinamenti, in modo che ogni operatore appartenga a un ordinamento e le arità vengano sostituite da un elenco ordinato di ordinamenti, che fissa per ogni figlia il tipo del suo operatore principale. Il tipo di operatore, insieme all'elenco dei tipi di sua figlia, è chiamato la firma dell'operatore.

Nelle algebre universali, ciò viene ulteriormente perfezionato introducendo relazioni di equivalenza definite equazionalmente tra i termini.

Sebbene sembri essersi un po 'sbiadito, questi concetti erano piuttosto popolari e molto studiati nell'informatica alla fine del 20 ° secolo, come algebre astratte dove poi sono state viste come base per tipi di dati astratti, che è, in parte, precursore di ciò che è nos classi nella programmazione orientata agli oggetti.

Le algebre universali sono legate allo sviluppo della teoria delle categorie, che è anche fondamentale nella visione attuale di tipi e linguaggi di programmazione.

Le algebre sono oggetti sintattici e devono essere utilizzate con un'interpretazione in alcuni domini semantici corrispondenti a tipi. Un'interpretazione è un omomorfismo che mappa gli ordinamenti in domini di valori (tipi) e operatori in funzioni tra tali domini, in modo che le firme vengano rispettate e anche le equazioni nel caso di un'algebra equazionale. È così che puoi applicare i risultati della teoria dei gruppi a qualsiasi dominio con un'operazione che rispetti la definizione di un gruppo.

Questa organizzazione è stata considerata molto conveniente dai primi ricercatori nei linguaggi di programmazione, in particolare quelli che si occupano di formalizzare i linguaggi di programmazione. Aveva il vantaggio di isolare la sintassi e la semantica e di essere matematicamente ben compreso.

Un altro motivo per adottarlo era una preoccupazione per lo sviluppo di strumenti per manipolare i programmi, sia in ambienti di sviluppo che in sistemi formali per dimostrare le proprietà dei programmi (che si sono rivelati sempre più problemi gemelli).

Ciò ha portato alla nascita del concetto di albero di sintassi astratto (AST) per i linguaggi di programmazione, che sono essenzialmente termini di un'algebra multi-ordinata (a volte perfezionata con l'uso dell'unione di ordinamento in alcuni sistemi). L'AST è la sintassi di riferimento per una lingua, dalla quale la semantica può essere definita dall'omomorfismo come nella semantica denotazionale.

Non solo è conveniente studiare la semantica delle lingue, ma gli alberi sono strutturati meglio delle stringhe e quindi una base migliore per lo sviluppo di strumenti di programmazione e ambienti di programmazione.

Permette di isolare l'analisi che era tradizionalmente una parte disordinata poiché i limiti della tecnologia di analisi costringevano l'uso di grammatiche distorte. Inoltre risolve i problemi di presentazione.

Permette molteplici rappresentazioni concrete (stringhe o grafiche) di programmi, che a volte possono essere utili (non vi è alcun motivo per cui l'uso della punteggiatura piuttosto che delle schede, o viceversa, nella sintassi del programma debba essere forzato sulle persone).

Rende facile definire molte interpretazioni di programmi e di sorta , al fine di analizzare le proprietà del programma con interpretazioni astratte.

È utile per scrivere strumenti di manipolazione dei programmi (semi) automatizzati, ad esempio per trasformazioni di programmi automatiche o traduzioni tra lingue.

Le cose a volte possono essere un po 'più complicate nella pratica, perché alcune forme di sintassi astratta consentono ad alcuni operatori di costruire alberi (espressioni) che appartengono a diversi tipi (un modo informale di vederlo). Ad esempio potrebbe esserci un ordinamento per costrutti sintattici che rappresentano variabili (entità assegnabili) e un altro per espressioni. Ma ogni variabile può essere usata come espressione, il contrario è falso.

I primi articoli su questo, per i linguaggi di programmazione, risalgono alla metà degli anni settanta. La concettualizzazione all'epoca era intesa per la produzione di ambienti di programmazione consapevoli della sintassi (la parola "diretta" veniva quindi usata). Cerca Mentor e Centaur in Europa e Cornell Program Synthesizer negli Stati Uniti. Furono i primi due sistemi a utilizzare effettivamente tali concetti in modo pratico. Molti altri furono sviluppati successivamente.

Ma la sintassi astratta precede questi sistemi. Il linguaggio Lisp (1958) aveva una sintassi astratta, che non sorprende in quanto è stato sviluppato da un logico e allo scopo di creare programmi che manipolano i programmi (vedi anche ML e LCF ... che sono arrivati ​​dopo). Ma Lisp non era ordinato: tutto era sintatticamente un elenco e una struttura più raffinata dipendeva essenzialmente dalla semantica. Ciò ha portato alcune persone a ritenere, in qualche modo errato, che Lisp non avesse sintassi.


Diresti che ci sono 2 diverse gerarchie, una nella terra della sintassi e un'altra nella terra della semantica. Nella sintassi abbiamo AST e ordinamenti e classi di ordinamento. In semantica abbiamo valori, tipi, tipi ... ecc. Non ci sono linguaggi che uniscono entrambi in un unico ambiente di sviluppo come Twelf o Coq?
CMCDragonkai,

@CMCDragonkai Direi (salvo possibili errori) proprio quello che ho detto. Non chiamerei queste gerarchie, ma piuttosto domini di (meta-) discorso. La separazione sintassi-semantica distingue ciò di cui parliamo e come lo facciamo, che richiede rappresentazione. Non dovresti voler mescolare la sintassi e la semantica della stessa lingua, ma la sintassi di una lingua può essere un oggetto di discorso, quindi appartenere alla semantica di un'altra lingua. In tal senso potresti vedere un po 'di unificazione, da gestire con cura. La sintassi viene sempre generata finitamente, mentre la semantica non ha questo vincolo.
babou,

2

Nel capitolo quattro sembra che gli ordinamenti siano per la sintassi e i tipi per la semantica.

Il diagramma di sintassi di esempio a pagina 40 tratta gli ordinamenti nella lingua L {num str}. Apparentemente le specie sono categorie nella sintassi della lingua.

In particolare, "più" ha una specie, che è la categoria sintattica del suo risultato. Il tipo di operatore "più" si chiama "Exp". Ciò rappresenta il fatto che sintatticamente, un'invocazione dell'operatore "più" è un'espressione. Un'invocazione dell'operatore "più" può riempire una posizione in un albero di sintassi astratto in cui è consentita un'espressione. Ecco che tipo di costruzione è un "plus". Ecco come si adatta alla struttura di un testo che rappresenta un programma.

Il sistema dei tipi a pagina 41 tratta i tipi nella lingua L {num str}. Il tipo di operatore "più", dato che i suoi operandi hanno il tipo "num", è "num". Questa sentenza è una descrizione parziale della semantica dell'operatore "più". Cioè, parte del significato dell'operatore "più" è la combinazione di due numeri per produrre un numero. Questo significato distingue "più" dalle altre espressioni.

Inoltre, esiste un ordinamento denominato "Typ" che contiene i due tipi, "num" e "str".


1
Bene, lo usa in questo concetto, ma non lo definisce chiaramente. Ho trovato il termine "Molteplici logiche" che mi sembra che tipi e tipi siano concetti correlati realmente chiusi. Volevo solo conoscere una definizione chiara per entrambi.
rslima,

Ha a che fare con "sistemi di tipo puro". Ho il sospetto che potremmo considerare convenzionale la presentazione in " Lambda Calculi with Types ". Ma non è conciso. Non ho ancora trovato un riferimento che fornisca definizioni chiare e concise di termine, tipo, tipo e ordinamento.
minopret,

Che dire delle teste di produzione in un parser? Molte volte finisci per classificare le grammatiche con nomi simili come Expression o Type.
CMCDragonkai,

1

All'inizio del capitolo 1, Harper dà un suggerimento su cosa intende con la parola sort :

La sintassi di una lingua specifica i mezzi con cui vari tipi di frasi (espressioni, comandi, dichiarazioni e così via) possono essere combinati per formare programmi.

Definisce la frase come un albero di sintassi astratto, di cui discute.


Mi sembra che "sorta" sia stato usato qui con il suo solito significato inglese, sinonimo di "specie".
Raffaello

@Raphael Sì, ma sembra che il significato sia coerente con quest'ultimo uso formale, non sei d'accordo?
jcora,

Non proprio. La frase "questo tipo di X" può apparire spesso nel libro; questa frase non segnala in alcun modo che qualcosa viene definito. (Inoltre, questo passaggio non corrisponde al modo in cui capisco il termine "ordinamento").
Raffaello

@Raphael OK, ti prego di spiegare come questo particolare utilizzo sia incoerente, mi informerebbe sicuramente, perché è così che attualmente lo capisco.
jcora,

La nozione di "ordinamento" che conosco è associata a singoli nodi dell'AST, non a un intero albero (che è ciò che dici "frase" significa nella tua fonte).
Raffaello
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.