Risposte:
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:
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?
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.
x
è al valore massimo per i suoi dati e 1
viene aggiunto ad esso, il risultato è uno strano output ( 0
), non è un errore semantico?
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_MAX
non è infinita a seconda ottimizzazione; vedere blog.llvm.org/2011/05/what-every-c-programmer-should-know. html ).
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.
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 if
diventare si
, do
diventare faire
, else
diventare sinon
ecc ecc ...) cambieresti sicuramente la sintassi della tua lingua, ma non cambierai molto la semantica: programmare in quel francese-C non sarà più facile!
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.
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.
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.
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.
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.
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.