Ho sempre pensato che riferirsi alla sintassi di una lingua fosse lo stesso che fare riferimento alla semantica di una lingua. Ma sono stato informato che apparentemente non è il caso. Qual è la differenza?
Ho sempre pensato che riferirsi alla sintassi di una lingua fosse lo stesso che fare riferimento alla semantica di una lingua. Ma sono stato informato che apparentemente non è il caso. Qual è la differenza?
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 controllerà la sintassi per te (errori in fase di compilazione) e ricaverà la semantica dalle regole del linguaggio (mappando la sintassi alle istruzioni della macchina), ma non troverà tutti gli errori semantici (errori di run-time ad esempio, calcolando il risultato errato perché il codice dice add 1 invece di add 2).
In realtà non ci sono due livelli, ma tre:
i
e f
produce if
) if
, (
, 42
, ==
, answer
e )
produce un'istruzione condizionale) Te lo spiegherò con un semplice esempio nella lingua ENGLISH
:
The glass drank Ben
È un'affermazione sintatticamente corretta. Ha un nome, un verbo, ecc.
Ma semanticamente è sbagliato, perché questa affermazione non ha un significato concepibile o corretto.
Semantica descrive le entità logiche di un linguaggio di programmazione e le loro interazioni. Sintassi definisce come sono espressi in caratteri.
Ad esempio, il concetto di aritmetica 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 in modo selvaggio (ad esempio C # e VB.NET - entrambi usano tipi di valore e tipi di riferimento, ma i caratteri che digiti per definirli sono diversi); in altri casi, due lingue sono sintatticamente simili, ma la semantica non coincide (si consideri Java vs JavaScript, dove le similitudini 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 alle lingue generali utilizzate nella programmazione, quindi la mia risposta riguarda le lingue dei 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 altro" . Si riferisce alle parole "sintassi" e "semantica" usate nella descrizione dei dati: quindi se incappate in queste parole in una specifica di alcuni formati di dati, è meglio sostituire entrambe le parole con "Potrzebie" a chiarire che è necessario elaborare il significato per te stesso.
La relazione tra sintassi e semantica, almeno nei dati esattamente specificati, può essere meglio descritta con il termine "codifica" . Semantic è codificato in sintassi. Poiché le registrazioni possono essere annidate, la sintassi di una lingua è la semantica di un altro. Se si va oltre il regno dei dati, questo annidamento può essere virtualmente infinito, come descritto da Umberto Eco come "semiosi illimitata".
Per dare un esempio:
La gente di solito si ferma a un certo livello e la considera semantica, ma alla fine non c'è una semantica finale a meno che qualche essere umano 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 altra porzione di codice sorgente).
E a volte la linea tra i due può essere sfocata.
Un modo per capire la distinzione consiste nell'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 che corrisponde alla grammatica della lingua, per esempio, non avendo un punto e virgola dove è richiesto.
Un errore semantico è un fallimento nel soddisfare altri requisiti linguistici (cosa C, per esempio, chiama "constraints"); un esempio potrebbe scrivere x + y
dove x
e y
sono di tipi incompatibili. La grammatica della lingua ti dice che un'aggiunta somiglia a something + something
, ma non è abbastanza potente per esprimere i requisiti sui tipi di operandi sinistro e destro.
(Gli errori logici, come l'uso di 1 dove 2 sarebbe corretto, non sono generalmente rilevabili dal compilatore, anche se in alcuni casi un compilatore può avvisare sul codice discutibile.)
La sintassi è ciò che dicono i simboli (lessicali). La semantica è ciò che intendono.
Considera:
C #: condition ? true_value : false_value
VB.NET: If(condition, true_value, false_value)
- Diverse sintassi, stessa semantica.
C #: left_value / right_value
VB.NET: left_value / right_value
- Stessa sintassi, semantica diversa (per numeri interi).
Sintassi è la disposizione grammaticale delle parole in una frase, ad esempio l'ordine delle parole.
(inglese) ' cat dog boy ' e (programmazione) ' hi.5 ' è non sintatticamente corretto.
(inglese) ' cat hugs boy ' e (programmazione) '* 3.2 * 5 *' è sintatticamente valido.
Semantica Statica è se le affermazioni sintatticamente valide hanno un significato.
(inglese) ' I are big ' (programmazione) (python) ' 3 +' hi '' è sintatticamente corretto ma ha un errore semantico statico.
Semantica è il significato associato alla stringa sintatticamente corretta dei simboli senza errore semantico statico, cioè la frase è sintatticamente e semanticamente corretta, ma il suo significato potrebbe non essere quello che era inteso.
(inglese) ' Gli aerei volanti possono essere pericolosi ' possono avere due significati, ad esempio il volo di aerei può essere pericoloso o gli aerei che stanno volando 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. '
Sorgente : MIT 6.00.1
La sintassi si riferisce a regole formali che governano la costruzione di affermazioni valide in una lingua. La semantica si riferisce all'insieme di regole che danno il significato di una dichiarazione.
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 affermazioni non sono significative.
L'ordine delle parole è il principio di base della sintassi, quelli che cercano di farlo capire ciò che è scritto usa i riferimenti sintattici dell'ordine delle parole a aiuta a dare la struttura della frase e il significato. La semantica è una interpretazione personale del significato di a "frase" in base alla loro conoscenza precedente. Quindi una frase che apparentemente non ha senso sintattico, può avere un significato quando si usa spunti semantici.
La sintassi riguarda solo ciò che è corretto dal punto di vista linguistico e grammaticale. La semantica richiede tutte quelle conoscenze pregresse che, ed è molto al di là di tutto ciò che è specifico della lingua.
La frase "Baby milk drinks" non ha un significato sintattico, ma attraverso la semantica la maggior parte delle persone lo interpreterebbe come "Baby beve latte", come la nostra conoscenza precedente ci dice che un bambino beve latte, e quindi noi può trovare un significato dalle parole chiave.
Sintassi e semantica sono come strategia e tattiche o sinistra e destra .
Non sono concetti universali realmente indipendenti, ma un paio di parole correlate che, quando sei in un particolare contesto, indicano direzioni opposte. Ma la stessa cosa che è la strategia su una scala è tattica su un'altra.
Quindi se stai scrivendo il 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 quel linguaggio, allora la sintassi è la grammatica e forse digiti il sistema e la semantica su ciò che è costruito. E così via.
La sintassi è ciò che il computer capisce, la semantica è ciò che l'umano comprende.
Un compilatore / interprete non si preoccupa del tuo design, e in qualsiasi codice compilato a livello di macchina ti sarà difficile dedurre il design. Gli sviluppatori si preoccupano del design perché un buon design consiste nel ridurre la complessità attraverso l'astrazione di comportamenti e interazioni complesse, e diversi tipi di problemi si prestano a semantica diversa. La scelta del linguaggio riguarda in gran parte la facilità e l'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 è stato utilizzato.
Nell'assegnazione "x", "-" significa operazione di "sottrazione", Nell'assegnazione "y", "-" indica l'operazione "segno negativo".