Ho sempre pensato che fare riferimento alla sintassi di una lingua fosse lo stesso che fare riferimento alla semantica di una lingua. Ma sono stato informato che apparentemente non è così. Qual è la differenza?
Ho sempre pensato che fare riferimento alla sintassi di una lingua fosse lo stesso che fare riferimento alla semantica di una lingua. Ma sono stato informato che apparentemente non è così. Qual è la differenza?
Risposte:
Semantica ~ Significato
Sintassi ~ Rappresentazione simbolica
Quindi due programmi scritti in lingue diverse potrebbero fare la stessa cosa (semantica) ma i simboli usati per scrivere il programma sarebbero diversi (sintassi).
Un compilatore verificherà la sintassi (errori di compilazione) e trarrà la semantica dalle regole del linguaggio (mappando la sintassi alle istruzioni della macchina), ma non troverà tutti gli errori semantici (errori di runtime, ad es. Calcolo il risultato sbagliato perché il codice dice aggiungi 1 invece di aggiungere 2).
x + y
cui non esiste un +
operatore appropriato per quegli operandi). Aggiungere 1 anziché 2 è ciò che definirei un errore logico .
In realtà non ci sono due livelli ma tre:
i
e f
produce if
)if
, (
, 42
, ==
, answer
e )
produce un'istruzione condizionale)ValidIdentifier
terminale, che potrebbe essere definito come qualcosa di simile ![AnyKeyword] [Identifier]
(sto usando la notazione simile a PEG qui). Non hai bisogno di un pass per lexing separato per una tale lingua. Vedere, ad esempio, parser C ++ basati su GLR.
La semantica descrive le entità logiche di un linguaggio di programmazione e le loro interazioni. La sintassi definisce come questi sono espressi in caratteri.
Ad esempio, il concetto di aritmetica del puntatore fa parte della semantica di C; il modo in cui gli operatori +
e -
possono essere utilizzati per esprimere le operazioni del puntatore fanno parte della sua sintassi.
A volte, due lingue condividono parte della loro semantica, ma la sintassi differisce notevolmente (ad es. C # e VB.NET - entrambi usano tipi di valore e tipi di riferimento, ma i caratteri digitati per definirli sono diversi); in altri casi, due lingue sono sintatticamente simili, ma la semantica non coincide (considera Java vs JavaScript, dove le somiglianze spesso confondono i principianti).
La sintassi è il modo in cui organizzi i token di una lingua. La semantica è ciò che significano quei token (di solito, cosa significa una particolare disposizione di token).
Non hai specificato se ti riferisci solo ai linguaggi di programmazione o ai linguaggi generali utilizzati nella programmazione, quindi la mia risposta riguarda i linguaggi di dati (come XML, RDF, sistemi di tipi di dati ecc.):
Brian L. Meek nelle sue sette regole d'oro per la produzione di standard indipendenti dalla lingua (1995) scrive che "la sintassi di una lingua può essere la semantica di un'altra" . Fa riferimento alle parole "sintassi" e "semantico" usate nella descrizione dei dati: quindi se inciampate su queste parole in una specifica di un formato di dati, dovreste sostituire meglio entrambe le parole con "Potrzebie" per chiarire che dovete allenarvi il significato per te stesso.
La relazione tra sintassi e semantica, almeno in dati esattamente specificati, può essere meglio descritta con il termine "codifica" . Semantic è codificato in sintassi. Poiché le registrazioni possono essere nidificate, la sintassi di una lingua è la semantica di un'altra. Se si va oltre il regno dei dati, questo annidamento può essere praticamente infinito, come descritto da Umberto Eco come "semiosi illimitata".
Per fare un esempio:
Le persone di solito si fermano a un certo livello e lo prendono come semantico, ma alla fine non esiste un semantico finale a meno che un essere umano non interpreti i dati nella sua mente. Non appena si tenta di esprimere la semantica in forma di dati, diventa sintassi.
Se può essere descritto in BNF (Backus-Naur Form) o qualcosa di simile, è sintassi. Se non può, non lo è.
La semantica, d'altra parte, riguarda il significato di un programma (o altro pezzo di codice sorgente).
E a volte la linea tra i due può essere sfocata.
Un modo per capire la distinzione è esaminare i tipi di errori che si verificano quando la sintassi o la semantica del programma non sono corrette.
Un errore di sintassi è un errore del codice sorgente per abbinare la grammatica della lingua, ad esempio, non avere un punto e virgola dove è richiesto.
Un errore semantico è un fallimento nel soddisfare altri requisiti linguistici (ciò che C, ad esempio, chiama "vincoli"); un esempio potrebbe essere quello di scrivere x + y
dove x
e y
sono tipi incompatibili. La grammatica della lingua indica che appare un'aggiunta something + something
, ma non è abbastanza potente per esprimere i requisiti sui tipi di operandi sinistro e destro.
(Gli errori logici, come l'utilizzo di 1 dove 2 sarebbe corretto, non sono generalmente rilevabili dal compilatore, anche se in alcuni casi un compilatore può avvisare del codice discutibile.)
La sintassi è ciò che dicono i simboli (lessicali). Semantica è ciò che significano.
Tener conto di:
C #: condition ? true_value : false_value
VB.NET: If(condition, true_value, false_value)
- Sintassi diversa, stessa semantica.
C #: left_value / right_value
VB.NET: left_value / right_value
- Stessa sintassi, semantica diversa (per numeri interi).
La sintassi è la disposizione grammaticale delle parole in una frase, cioè l'ordine delle parole.
(Inglese) ' cat dog boy ' e (programmazione) ' hi.5 ' non sono sintatticamente corretti.
(Inglese) ' cat hugs boy ' e (programmazione) '* 3.2 * 5 *' è sintatticamente valido.
La semantica statica è se le affermazioni sintatticamente valide hanno qualche significato.
(Inglese) ' I are big ' (programmazione) (python) ' 3 +' hi ' ' è sintatticamente corretto ma presenta un errore semantico statico.
Semantica è il significato associato a una stringa di simboli sintatticamente corretta senza alcun errore semantico statico, ovvero la frase è sintatticamente e semanticamente corretta, ma il suo significato potrebbe non essere quello che era previsto.
(Inglese) " Gli aerei in volo possono essere pericolosi " può avere due significati, vale a dire volare in aereo può essere pericoloso o gli aerei in volo possono essere pericolosi.
(Programmazione) 'il computer non genererà alcun messaggio di errore, ma non farà ciò che gli hai detto di fare; farà qualcos'altro. '
Fonte : MIT 6.00.1
La sintassi si riferisce a regole formali che governano la costruzione di dichiarazioni valide in una lingua. La semantica si riferisce all'insieme di regole che danno il significato di un'affermazione.
Gli errori dovuti alla sintassi si verificano in un programma quando i ruels del linguaggio di programmazione vengono violati o utilizzati in modo improprio. Gli errori dovuti alla semantica si verificano in un programma quando le istruzioni non sono significative.
L'ordine delle parole è il principio base della sintassi, coloro che cercano di capire ciò che è scritto usano i segnali sintattici dell'ordine delle parole per aiutare a dare alla struttura e al significato della frase. La semantica è una propria interpretazione del significato di una "frase" basata sulla sua conoscenza precedente. Pertanto una frase che apparentemente non ha senso sintattico, può avere un significato quando si usano segnali semantici.
La sintassi riguarda solo ciò che è linguisticamente e grammaticalmente corretto. La semantica richiede a tutti una conoscenza preliminare che, ed è molto al di là di qualsiasi cosa sia specifica della lingua.
La frase "Bevande a base di latte per bambini" non ha un significato sintattico, ma attraverso la semantica la maggior parte delle persone lo interpreterebbe come "Bevande a base di latte per bambini" poiché la nostra conoscenza precedente ci dice che un bambino beve latte, e quindi possiamo trovare un significato dalla parole chiave.
La sintassi e la semantica sono come strategia e tattica o sinistra e destra .
Non sono concetti universali realmente indipendenti, ma una coppia di parole correlate che, quando ci si trova in un contesto particolare, indicano direzioni opposte. Ma la stessa cosa che è la strategia su una scala è la tattica su un'altra.
Quindi, se stai scrivendo codice in una lingua, la sintassi è la lingua che stai usando e il comportamento desiderato è la semantica. Ma se stai implementando, o discutendo, il compilatore per quella lingua, allora la sintassi è la grammatica e forse il sistema di tipo e la semantica tutto ciò che è costruito su di essa. E così via.
La sintassi è ciò che il computer capisce, la semantica è ciò che l'umano capisce.
Un compilatore / interprete non si preoccupa affatto del tuo progetto e in qualsiasi codice compilato a livello di macchina ti sarebbe difficile dedurre il progetto. Gli sviluppatori si preoccupano del design perché un buon design riguarda la riduzione della complessità mediante l'astrazione di comportamenti e interazioni complesse e diversi tipi di problemi si prestano a diverse semantiche. La scelta della lingua dipende in gran parte dalla facilità e dall'efficienza con cui la semantica che si desidera utilizzare può essere espressa nella sua sintassi.
Esempio molto breve con "plain c":
void main()
{
int a = 10;
int x = a - 1;
int y = - 1;
printf("x = %i", x);
printf("y = %i", y);
getch();
}
In questo esempio, la sintassi per il token "-" è la stessa, ma ha un significato diverso ("semantico), a seconda di dove viene utilizzato.
Nell'assegnazione "x", "-" indica l'operazione "sottrazione", Nell'assegnazione "y", "-" indica l'operazione "segno negativo".
-
operatori hanno lo stesso token , ma sono sintatticamente diversi, poiché vengono utilizzati in contesti diversi. 0 - 1
corrisponde alla regola di sintassi additive-expression: additive-expression - multiplicative-expression
, mentre - 1
corrisponde alla regola di sintassi unary-expression: unary-operator cast-expression
(riferimento: standard C99).
-
oeprator è sintattica, non solo semantica (anche se hanno anche una semantica diversa). La sintassi è definita dalla grammatica della lingua e i due operatori sono specificati in diverse sezioni della grammatica. Vedere la bozza N1570 , sezione 6.5.3 per operatori unari e 6.5.6 per operatori additivi. (A proposito, se hai intenzione di usare un esempio in C, probabilmente dovrebbe essere corretto; void main()
dovrebbe essere int main(void)
, e ti manca #include <stdio.h>
e qualunque intestazione dichiarigetch