Réponses:
La syntaxe concerne la structure ou la grammaire de la langue. Il répond à la question: comment construire une phrase valide? Toutes les langues, même l'anglais et les autres langues humaines (aka "naturelles") ont des grammaires, c'est-à-dire des règles qui définissent si la phrase est correctement construite ou non.
Voici quelques règles de syntaxe du langage C:
La sémantique concerne le sens de la phrase. Il répond aux questions: cette phrase est-elle valide? Si oui, que signifie cette phrase? Par exemple:
x++; // increment
foo(xyz, --b, &qrs); // call foo
sont des instructions C syntaxiquement valides. Mais que veulent-ils dire? Est-il même valable de tenter de transformer ces instructions en une séquence exécutable d'instructions? Ces questions sont au cœur de la sémantique.
Considérez l'opérateur ++ dans la première instruction. Tout d'abord, est-il même valable d'essayer cela?
Enfin, notez que certaines sémantiques ne peuvent pas être déterminées au moment de la compilation et doivent donc être évaluées au moment de l'exécution. Dans l'exemple de l'opérateur ++, si x est déjà à la valeur maximale pour son type de données, que se passe-t-il lorsque vous essayez de lui ajouter 1? Autre exemple: que se passe-t-il si votre programme tente de déréférencer un pointeur dont la valeur est NULL?
En résumé, la syntaxe est le concept qui ne concerne que la validité ou non de la phrase pour la grammaire de la langue. La sémantique consiste à savoir si la phrase a ou non un sens valide.
x
est à la valeur maximale pour ses données et y 1
est ajouté, il en résulte une sortie étrange ( 0
), n'est-ce pas une erreur sémantique?
UINT_MAX + 1 == 0
). Le débordement signé n'est pas défini. Les compilateurs modernes l' ont généralementINT_MAX + 1 == INT_MIN
, mais il y a des cas sur for (i = 0; i <= N; ++i) { ... }
lesquels vous ne pouvez pas compter (par exemple, où N
est INT_MAX
n'est pas infini en fonction de l'optimisation; voir blog.llvm.org/2011/05/what-every-c-programmer-should-know. html ).
La syntaxe fait référence à la structure d'une langue, traçant son étymologie à la façon dont les choses sont assemblées.
Par exemple, vous pourriez exiger que le code soit assemblé en déclarant un type puis un nom et ensuite un point-virgule, pour être syntaxiquement correct.
Type token;
D'autre part, la sémantique concerne le sens. Un compilateur ou un interpréteur pourrait se plaindre d'erreurs de syntaxe. Vos collègues se plaindront de la sémantique.
Wikipedia a la réponse. Lire les wikipages de syntaxe (langages de programmation) et de sémantique (informatique) .
Ou pensez au travail de n'importe quel compilateur ou interpréteur . La première étape est l'analyse lexicale où les jetons sont générés en divisant la chaîne en lexèmes puis en analysant , qui construisent un arbre de syntaxe abstraite (qui est une représentation de la syntaxe). Les prochaines étapes consistent à transformer ou à évaluer ces AST (sémantique).
Notez également que si vous définissiez une variante de C où chaque mot-clé était transformé en son équivalent français ( if
devenir si
, do
devenir faire
, else
devenir sinon
etc etc ...) vous changeriez certainement la syntaxe de votre langage, mais vous ne changerez pas grand-chose la sémantique: programmer dans ce français-C ne sera pas plus facile!
La sémantique est ce que votre code signifie - ce que vous pourriez décrire en pseudo-code. La syntaxe est la structure réelle - tout, des noms de variables aux points-virgules.
La syntaxe est la structure ou la forme des expressions, des instructions et des unités de programme, mais la sémantique est la signification de ces expressions, instructions et unités de programme. La sémantique découle directement de la syntaxe . La syntaxe fait référence à la structure / forme du code spécifiée par un langage de programmation spécifique, mais la sémantique traite de la signification attribuée aux symboles, caractères et mots.
La syntaxe d'un langage de programmation est la forme de ses expressions, instructions et unités de programme. Sa sémantique est la signification de ces expressions, instructions et unités de programme. Par exemple, la syntaxe d'une instruction Java while est
while (boolean_expr) statement
La sémantique de cette forme d'instruction est que lorsque la valeur actuelle de l'expression booléenne est vraie, l'instruction incorporée est exécutée. Puis le contrôle revient implicitement à l'expression booléenne pour répéter le processus. Si l'expression booléenne est fausse, le contrôle passe à l'instruction suivant la construction while.
Syntaxe: Il fait référence à la structure grammaticale du langage. Si vous écrivez le langage c. Vous devez faire très attention à l'utilisation des types de données, des jetons [cela peut être littéral ou un symbole comme "printf ()". Il a 3 jetons, "printf, (,)"]. De la même manière, vous devez faire très attention à la façon dont vous utilisez la fonction, la syntaxe de la fonction, la déclaration de fonction, la définition, l'initialisation et l'appel de celle-ci.
Bien que la sémantique, elle concerne la logique ou le concept de phrase ou d'énoncés. Si vous dites ou écrivez quelque chose hors du concept ou de la logique, vous vous trompez sémantiquement.
Généralement, l'analyse syntaxique et sémantique du code est effectuée dans la partie «frontend» du compilateur.
Syntaxe: Le compilateur génère des jetons pour chaque mot-clé et symboles: le jeton contient le type d'information du mot-clé et son emplacement dans le code. En utilisant ces jetons, un AST (abréviation de Abstract Syntax Tree) est créé et analysé. Ce que le compilateur vérifie réellement ici, c'est si le code est lexicalement significatif, c'est-à-dire que la «séquence de mots-clés» est conforme aux règles du langage? Comme suggéré dans les réponses précédentes, vous pouvez le voir comme la grammaire de la langue (pas le sens / la signification du code). Remarque: les erreurs de syntaxe sont signalées dans cette phase. (Renvoie les jetons avec le type d'erreur au système)
Sémantique: Maintenant, le compilateur vérifiera si vos opérations de code «ont du sens». Par exemple, si le langage prend en charge l'inférence de type, une erreur sématique sera signalée si vous essayez d'attribuer une chaîne à un flottant. OU déclarer deux fois la même variable. Ce sont des erreurs «grammaticalement» / syntaxiquement correctes, mais qui n'ont aucun sens pendant l'opération. Note latérale: Pour vérifier si la même variable est déclarée deux fois, le compilateur gère une table de symboles
Ainsi, la sortie de ces 2 phases frontales est un AST annoté (avec des types de données) et une table de symboles.
Compte tenu du langage normal que nous utilisons; ici, en anglais:
par exemple, il va à l'école. - Grammaire / syntaxe incorrecte, bien qu'il ait voulu transmettre un sens / sémantique correct.
par exemple, il va au froid. - cold est un adjectif. En anglais, nous pourrions dire que cela n'est pas conforme à la grammaire, mais c'est en fait l'exemple le plus proche d'une sémantique incorrecte avec une syntaxe correcte que je pourrais penser.