Quelle est la différence entre la syntaxe et la sémantique dans les langages de programmation?


121

Quelle est la différence entre la syntaxe et la sémantique dans les langages de programmation (comme C, C ++)?


2
Je voudrais voter mais aucun effort de recherche n'est évident.
nul

Réponses:


202

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:

  • instructions séparées avec un point-virgule
  • mettre l'expression conditionnelle d'une instruction IF entre parenthèses
  • regrouper plusieurs instructions en une seule instruction en les mettant entre accolades
  • les types de données et les variables doivent être déclarés avant la première instruction exécutable (cette fonctionnalité a été supprimée dans C99. C99 et ces dernières autorisent les déclarations de type mixte.)

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?

  • Si x est un type de données flottant, cette instruction n'a aucune signification (selon les règles du langage C) et il s'agit donc d'une erreur même si l'instruction est syntaxiquement correcte.
  • Si x est un pointeur vers un type de données , la signification de l'instruction est "d'ajouter sizeof (un certain type de données ) à la valeur à l'adresse x et de stocker le résultat dans l'emplacement à l'adresse x".
  • Si x est un scalaire, la signification de l'instruction est "ajouter un à la valeur à l'adresse x et stocker le résultat dans l'emplacement à l'adresse x".

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.


D'ACCORD. Si xest à la valeur maximale pour ses données et y 1est ajouté, il en résulte une sortie étrange ( 0), n'est-ce pas une erreur sémantique?
haccks le

Considérez un compteur kilométrique dans un véhicule - il a une série de roues interdépendantes avec les chiffres 0 à 9 imprimés sur chacune. La roue la plus à droite tourne le plus rapidement; lorsqu'elle revient de 9 à zéro, la roue vers sa gauche avance de un. Lorsque cette roue avance de 9 à 0, celle à sa gauche avance, et ainsi de suite.
Jeff N

Un type de données est comme la roue d'un odomètre: il ne peut contenir qu'une certaine valeur. Lorsque la valeur maximale est atteinte, la prochaine avance fait revenir la roue à zéro. Qu'il s'agisse ou non d'une erreur sémantique dépend des règles de langage. Dans ce cas, vous devez vous référer au standard du langage C. Je ne sais pas exactement ce que dit la norme du langage C, mais voici quelques options. Le débordement est: -pas une erreur; le résultat est nul. -une erreur; le compilateur DOIT générer une exception de débordement. -UNDEFINED; le compilateur est libre de faire ce qu'il veut.
Jeff N

2
Au cas où quelqu'un se soucierait de l'exemple spécifique, le débordement non signé est défini comme l'arithmétique modulaire (donc 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ù Nest INT_MAXn'est pas infini en fonction de l'optimisation; voir blog.llvm.org/2011/05/what-every-c-programmer-should-know. html ).
Daniel H

"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" - j'aime la façon dont cela a un parallèle avec les langages naturels. Vous ne pouvez pas connaître la signification de certaines phrases sans contexte. Par exemple, dans l'expression «il aime les bananes», le sens de «il» dépend du contexte.
ymln

22

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.


@Talespin_Kit signifie plutôt que structure: la logique est plus une abstraction par exemple P => Q, etc ou !! P = P, mais quand vous ajoutez de la sémantique, les choses peuvent avoir de la subtilité, si P est "heureux", alors !! P est "I 'm not un-happy "! =" I'm happy "
doctorlove

6
+1 pour "Un compilateur ou un interpréteur pourrait se plaindre d'erreurs de syntaxe. Vos collègues se plaindront de la sémantique."
GeekyJ

11

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 ( ifdevenir si, dodevenir faire, elsedevenir sinonetc 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!


9

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.


Est-ce une conversation entre différentes personnes? Ou est-ce juste un message? Je ne comprends pas. Par exemple: "Aucune idée de ce que signifie ce qui suit. Cela ne pourrait pas être plus faux".
doubleOrt

6
  • Vous avez besoin d'une syntaxe correcte pour compiler.
  • Vous avez besoin d'une sémantique correcte pour que cela fonctionne.

5

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.


1

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.


1

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.


1

Comprendre comment le compilateur voit le code

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.

Le comprendre de manière moins technique

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.


Compilateurs Ce lien peut être utile pour en savoir plus
Vedant Panchal
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.