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 1viene 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_MAXnon è 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 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!
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.