Qual è la differenza tra sintassi e semantica nei linguaggi di programmazione?


120

Qual è la differenza tra sintassi e semantica nei linguaggi di programmazione (come C, C ++)?


2
Vorrei votare a favore ma nessuno sforzo di ricerca è evidente.
null

Risposte:


201

La sintassi riguarda la struttura o la grammatica della lingua. Risponde alla domanda: come costruisco una frase valida? Tutte le lingue, anche l'inglese e altre lingue umane (note anche come "naturali") hanno grammatiche, cioè regole che definiscono se la frase è costruita correttamente o meno.

Ecco alcune regole di sintassi del linguaggio C:

  • istruzioni separate con un punto e virgola
  • racchiudere tra parentesi l'espressione condizionale di un'istruzione IF
  • raggruppa più istruzioni in una singola istruzione racchiudendole tra parentesi graffe
  • i tipi di dati e le variabili devono essere dichiarati prima della prima istruzione eseguibile (questa funzionalità è stata eliminata in C99. C99 e le ultime consentono dichiarazioni di tipo misto).

La semantica riguarda il significato della frase. Risponde alle domande: questa frase è valida? In caso affermativo, cosa significa la frase? Per esempio:

x++;                  // increment
foo(xyz, --b, &qrs);  // call foo

sono istruzioni C sintatticamente valide. Ma cosa significano? È persino valido tentare di trasformare queste istruzioni in una sequenza eseguibile di istruzioni? Queste domande sono al centro della semantica.

Considera l'operatore ++ nella prima istruzione. Prima di tutto, è anche valido tentare questo?

  • Se x è un tipo di dati float, questa istruzione non ha significato (secondo le regole del linguaggio C) e quindi è un errore anche se l'affermazione è sintatticamente corretta.
  • Se x è un puntatore a un tipo di dati , il significato dell'istruzione è "aggiungere sizeof ( alcuni tipi di dati ) al valore all'indirizzo x e memorizzare il risultato nella posizione all'indirizzo x".
  • Se x è uno scalare, il significato dell'istruzione è "aggiungi uno al valore all'indirizzo x e memorizza il risultato nella posizione all'indirizzo x".

Infine, si noti che alcune semantiche non possono essere determinate in fase di compilazione e devono quindi essere valutate in fase di esecuzione. Nell'esempio dell'operatore ++, se x è già al valore massimo per il suo tipo di dati, cosa succede quando provi ad aggiungere 1? Un altro esempio: cosa succede se il tuo programma tenta di dereferenziare un puntatore il cui valore è NULL?

In sintesi, la sintassi è il concetto che riguarda solo se la frase è valida o meno per la grammatica della lingua. La semantica riguarda se la frase ha o meno un significato valido.


OK. Se xè al valore massimo per i suoi dati e 1viene aggiunto ad esso, il risultato è uno strano output ( 0), non è un errore semantico?
haccks

Considera un contachilometri in un veicolo: ha una serie di ruote correlate con le cifre da 0 a 9 stampate su ciascuna di esse. La ruota più a destra gira più velocemente; quando torna da 9 a zero, la ruota alla sua immediata sinistra avanza di uno. Quando questa ruota avanza da 9 a 0, quella alla sua sinistra avanza e così via.
Jeff N

Un tipo di dati è come la ruota di un contachilometri: può reggere solo fino a un certo valore. Quando viene raggiunto il valore massimo, il successivo avanzamento fa tornare la ruota a zero. Che si tratti o meno di un errore semantico dipende dalle regole del linguaggio. In questo caso, è necessario fare riferimento allo standard del linguaggio C. Non so esattamente cosa dice lo standard del linguaggio C, ma ecco alcune delle opzioni. L'overflow è: -non è un errore; il risultato è zero. -un errore; il compilatore DEVE generare un'eccezione di overflow. -UNDEFINED; il compilatore è libero di fare quello che vuole.
Jeff N

2
Nel caso in cui qualcuno si preoccupi dell'esempio specifico, l'overflow senza segno è definito come aritmetica modulare (quindi UINT_MAX + 1 == 0). L'overflow firmato non è definito. Compilatori moderni di solito hanno INT_MAX + 1 == INT_MIN, ma ci sono casi non si può contare su questo (ad esempio, for (i = 0; i <= N; ++i) { ... }in cui Nè INT_MAXnon è infinita a seconda ottimizzazione; vedere blog.llvm.org/2011/05/what-every-c-programmer-should-know. html ).
Daniel H

"nota che alcune semantiche non possono essere determinate in fase di compilazione e devono quindi essere valutate in fase di esecuzione" - Mi piace come questo abbia un parallelo con i linguaggi naturali. Non puoi conoscere il significato di alcune frasi senza contesto. Ad esempio, nella frase "Gli piacciono le banane" il significato di "lui" dipende dal contesto.
ymln

21

La sintassi si riferisce alla struttura di una lingua, tracciando la sua etimologia a come le cose sono messe insieme.
Ad esempio, potresti richiedere che il codice venga assemblato dichiarando un tipo, un nome e quindi un punto e virgola, per essere sintatticamente corretto.

Type token;

D'altra parte, la semantica riguarda il significato. Un compilatore o un interprete potrebbe lamentarsi di errori di sintassi. I tuoi colleghi si lamenteranno della semantica.


@Talespin_Kit significa piuttosto che struttura: la logica è più un'astrazione ad esempio P => Q, ecc. O !! P = P, ma quando aggiungi la semantica le cose possono avere sottigliezza, se P è "felice", allora !! P è "I 'm not un-happy "! =" I'm happy "
doctorlove

5
+1 per "Un compilatore o un interprete potrebbe lamentarsi di errori di sintassi. I tuoi colleghi si lamenteranno della semantica."
GeekyJ

11

Wikipedia ha la risposta. Leggi le wikipage della sintassi (linguaggi di programmazione) e della semantica (informatica) .

Oppure pensa al lavoro di qualsiasi compilatore o interprete . Il primo passo è l'analisi lessicale in cui i token vengono generati dividendo la stringa in lessemi e poi analizzando , che costruiscono un albero di sintassi astratto (che è una rappresentazione della sintassi). I passaggi successivi prevedono la trasformazione o la valutazione di questi AST (semantica).

Inoltre, osserva che se definissi una variante di C in cui ogni parola chiave fosse trasformata nel suo equivalente francese (quindi ifdiventare si, dodiventare faire, elsediventare sinonecc ecc ...) cambieresti sicuramente la sintassi della tua lingua, ma non cambierai molto la semantica: programmare in quel francese-C non sarà più facile!


8

La semantica è ciò che significa il tuo codice: ciò che potresti descrivere in pseudo-codice. La sintassi è la struttura effettiva: tutto, dai nomi delle variabili ai punti e virgola.


È una conversazione tra persone diverse? O è solo un post? Non lo capisco. Ad esempio "Non ho idea di cosa significhi quanto segue. Non potrebbe essere più sbagliato".
doubleOrt

5

La sintassi è la struttura o la forma di espressioni, istruzioni e unità di programma, ma la semantica è il significato di tali espressioni, istruzioni e unità di programma. La semantica segue direttamente dalla sintassi . La sintassi si riferisce alla struttura / forma del codice che un linguaggio di programmazione specifico specifica, ma la semantica si occupa del significato assegnato ai simboli, caratteri e parole.


5
  • È necessaria la sintassi corretta per la compilazione.
  • Hai bisogno di una semantica corretta per farlo funzionare.

1

La sintassi di un linguaggio di programmazione è la forma delle sue espressioni, istruzioni e unità di programma. La sua semantica è il significato di quelle espressioni, istruzioni e unità di programma. Ad esempio, la sintassi di un'istruzione while Java è

while (boolean_expr) statement

La semantica di questo modulo di istruzione è che quando il valore corrente dell'espressione booleana è vero, viene eseguita l'istruzione incorporata. Quindi il controllo ritorna implicitamente all'espressione booleana per ripetere il processo. Se l'espressione booleana è falsa, il controllo viene trasferito all'istruzione che segue il costrutto while.


1

Sintassi: si riferisce alla struttura grammaticale della lingua .. Se stai scrivendo la lingua c. Devi prestare molta attenzione all'uso di tipi di dati, token [può essere letterale o simbolo come "printf ()". Ha 3 tokes, "printf, (,)"]. Allo stesso modo, devi stare molto attento a come usi la funzione, la sintassi della funzione, la dichiarazione della funzione, la definizione, l'inizializzazione e la chiamata di essa.

Mentre la semantica, riguarda la logica o il concetto di frase o affermazioni. Se dici o scrivi qualcosa fuori dal concetto o dalla logica, allora sei semanticamente sbagliato.


1

Capire come il compilatore vede il codice

Di solito, l'analisi della sintassi e della semantica del codice viene eseguita nella parte "frontend" del compilatore.

  • Sintassi: il compilatore genera token per ogni parola chiave e simboli: il token contiene il tipo di informazione della parola chiave e la sua posizione nel codice. Utilizzando questi token, viene creato e analizzato un AST (abbreviazione di Abstract Syntax Tree). Ciò che il compilatore controlla effettivamente qui è se il codice ha un significato lessicale, cioè la "sequenza di parole chiave" è conforme alle regole del linguaggio? Come suggerito nelle risposte precedenti, puoi vederlo come la grammatica della lingua (non il senso / significato del codice). Nota a margine: in questa fase vengono segnalati errori di sintassi (restituisce al sistema i token con il tipo di errore)

  • Semantica: ora, il compilatore controllerà se le operazioni sul codice "hanno senso". Ad esempio, se il linguaggio supporta l'inferenza del tipo, verrà segnalato un errore sematico se si tenta di assegnare una stringa a un float. O dichiarando la stessa variabile due volte. Questi sono errori che sono corretti "grammaticalmente" / sintassicamente, ma non hanno senso durante l'operazione. Nota a margine: per verificare se la stessa variabile viene dichiarata due volte, il compilatore gestisce una tabella dei simboli

Quindi, l'output di queste 2 fasi di frontend è un AST annotato (con tipi di dati) e una tabella dei simboli.

Comprenderlo in modo meno tecnico

Considerando il linguaggio normale che usiamo; qui, inglese:

ad esempio, va a scuola. - Grammatica / sintassi errata, sebbene volesse trasmettere un senso / semantico corretto.

ad esempio, va al freddo. - freddo è un aggettivo. In inglese, potremmo dire che questo non è conforme alla grammatica, ma in realtà è l'esempio più vicino a semantica errata con sintassi corretta a cui potrei pensare.


Compilatori Questo collegamento potrebbe essere utile per saperne di più
Vedant Panchal
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.