Quelle est la différence entre syntaxe et sémantique?

87

J'ai toujours pensé que se référer à la syntaxe d'un langage était la même chose qu'à la sémantique d'un langage. Mais on m'a informé qu'apparemment ce n'est pas le cas. Quelle est la différence?

Gsingh2011
la source
6
"Les idées vertes et incolores dorment furieusement" est correct du point de vue de la syntaxe mais n'a pas de sens sémantique. Voir en.wikipedia.org/wiki/Colorless_green_ideas_sleep_furiously
CesarGon
+1 pour poser cette question. Je me demandais la même chose, j'étais trop paresseux pour chercher cela sur Internet et, évidemment, jamais demandé.
KK.
Plus ou moins, je dirais ... La sémantique est le type d'instances, leurs relations avec d'autres instances et les garanties qui existent entre elles. La syntaxe est le moyen de déclarer ces choses à travers des chaînes de caractères. Plus ou moins.
Dehbop

Réponses:

106

Sémantique ~ Signification

Syntaxe ~ Représentation symbolique

Donc, deux programmes écrits dans des langages différents pourraient faire la même chose (sémantique) mais les symboles utilisés pour écrire le programme seraient différents (syntaxe).

Un compilateur vérifiera votre syntaxe pour vous (erreurs de compilation), et déduira la sémantique des règles de langage (mappant la syntaxe sur des instructions machine), mais ne trouvera pas toutes les erreurs sémantiques (erreurs d’exécution, par exemple résultat erroné car le code dit ajouter 1 au lieu d'ajouter 2).

Chris Card
la source
2
La vérification d'erreur n'est pas un critère pour distinguer la syntaxe et la sémantique. Un compilateur peut et doit diagnostiquer à la fois des erreurs de syntaxe (comme un point-virgule manquant) et des erreurs sémantiques (comme x + ys'il n'y avait pas d' +opérateur approprié pour ces opérandes). Ajouter 1 plutôt que 2 est ce que j'appellerais une erreur logique .
Keith Thompson
3
@ Keith - mais la logique (comme dans "erreur logique") est une sémantique. Certaines vérifications sémantiques peuvent être effectuées par le compilateur - en particulier la vérification de type -, donc je conviens que les compilateurs ne recherchent pas seulement les erreurs de syntaxe, mais Chris dit seulement " ne trouvera pas toutes les erreurs sémantiques", ce qui n'implique pas "ne peut pas trouver tout ".
Steve314
1
@ Steve314: D'accord. Mais si vous voulez faire une distinction nette entre les erreurs qu'un compilateur doit détecter et les erreurs qu'il n'a pas besoin de détecter, alors je pense que "sémantique" et "logique" sont un bon moyen d'exprimer cette distinction.
Keith Thompson
4
@KeithThompson En réalité, en théorie, un compilateur ou un interprète d'une langue ayant un système de types suffisamment fort et puissant (c'est-à-dire dépendant ) peut vérifier toute propriété arbitraire de votre code (modulo le problème Halting, le cas échéant), afin de décomposer les erreurs sémantiques en "vérifiable" et "non contrôlable" n'a pas vraiment de sens en général.
La flamme de Ptharien le
@Ptharien'sFlame Je vais simplement retirer cette discussion des nuages ​​une seconde en soulignant la partie "en théorie" de votre déclaration. En pratique, l’application de la sémantique dans le code nécessite une syntaxe supplémentaire pour donner aux compilateurs des indications sur la fonctionnalité. Une vérification sémantique supplémentaire a un coût (complexité / lisibilité). Dire qu'un langage peut être assez puissant pour vérifier toutes les erreurs sémantiques revient à dire qu'un système juridique peut être assez parfait pour prévenir tout crime. Personnellement, je préfère la liberté à la sécurité, mais c’est ce qui fait de ce sujet un sujet «religieux».
Evan Plaice
35

En réalité, il n'y a pas deux niveaux mais trois:

  • niveau lexical: comment les caractères sont combinés pour produire des éléments de langage ( iet fproduire if)
  • niveau syntactique: comment les éléments de langage sont combinés pour produire des expressions linguistiques ( if, (, 42, ==, answeret )produit une instruction conditionnelle)
  • niveau sémantique: comment les expressions de langage sont converties en instructions de la CPU afin de donner un sens (une instruction conditionnelle permet d'exécuter une branche ou une autre en fonction du résultat de l'expression booléenne)
mouviciel
la source
10
Une séparation entre lexer et analyser les étapes est entièrement artificielle, ce n'est rien de plus qu'une optimisation. Et il y a certaines langues où aucun ensemble plat et fini de lexèmes n'est défini - mais néanmoins, il existe une syntaxe clairement définie. Donc, je préférerais définir le lexème dans le cadre d’une syntaxe, ce n’est pas une entité séparée.
SK-logic
@ SK-logic: Dans de nombreuses langues, la liste des lexèmes autorisés ou interdits formant un nom de variable est spécifiée. Donc, la séparation a du sens.
mouviciel
5
@mouviciel, cela n'a de sens que comme optimisation - sinon, vous aurez juste un ValidIdentifierterminal, qui pourrait être défini comme quelque chose comme ![AnyKeyword] [Identifier](j'utilise la notation de type PEG ici). Vous n'avez pas besoin d'un laissez-passer séparé pour un tel langage. Voir, par exemple, les analyseurs C ++ basés sur GLR.
SK-logic
2
@EvanPlaice, de quoi parlez-vous? Mon point est que lexer n'est pas nécessaire (et limite réellement votre langue), pas l' analyse .
SK-logic
1
@ SK-logic Je suppose que j'ai lu votre commentaire pour dire le contraire de ce que vous vouliez. Je pensais que vous parliez de cas où seul un lexer est nécessaire - comme dans des langues purement «normales» ou «sans contexte». Dans les langages de niveau supérieur, un lexer n'est peut-être pas nécessaire, mais il fournit un moyen rapide d'exécuter une validation de syntaxe en un seul passage. Je suis tout à fait d’accord pour dire qu’il est souvent utile d’éteindre ou d’éliminer complètement le lexer.
Evan Plaice
18

Je vais vous expliquer avec un exemple simple dans la langue ENGLISH:

The glass drank Ben

Est une déclaration syntaxiquement correcte. Il a un nom, un verbe, etc.

Mais, sémantiquement, c'est faux, car cette déclaration n'a pas de sens concevable ou correct.

IcyFlame
la source
15

La sémantique décrit les entités logiques d'un langage de programmation et leurs interactions. La syntaxe définit leur expression en caractères.

Par exemple, le concept d'arithmétique de pointeur fait partie de la sémantique de C; la manière dont les opérateurs +et -peuvent être utilisés pour exprimer des opérations de pointeur fait partie de sa syntaxe.

Parfois, deux langages partagent une partie de leur sémantique, mais la syntaxe diffère énormément (par exemple, C # et VB.NET - utilisent tous deux des types valeur et des types référence, mais les caractères que vous tapez pour les définir sont différents); dans d'autres cas, deux langages sont syntaxiquement similaires, mais la sémantique ne correspond pas (considérons Java et JavaScript, où les similitudes confondent souvent les débutants).

tdammers
la source
Alors, les "paradigmes" sont liés à la sémantique? Je veux dire un paradigme est un ensemble de sémantique interdépendante?
Gulshan
1
@Gulshan, le paradigme est un concept beaucoup plus large qu'une chose aussi formalisée que la sémantique. Le paradigme peut inclure la sémantique, mais il s’agit plus d’une méthodologie, voire d’une philosophie.
SK-logic
6

La syntaxe est la façon dont vous organisez les jetons d'une langue. La sémantique est ce que signifient ces jetons (généralement, ce que signifie un arrangement particulier de jetons).

Mike Sherrill 'Rappel de chat'
la source
5

Vous ne précisez pas si vous vous référez uniquement aux langages de programmation ou aux langages généraux utilisés en programmation; ma réponse concerne donc les langages de données (tels que XML, RDF, systèmes de type de données, etc.):

Brian L. Meek, dans ses sept règles d'or pour la production de normes indépendantes du langage (1995) écrit que "la syntaxe d'un langage peut être la sémantique d'un autre" . Il fait référence aux mots "syntaxe" et "sémantique" utilisés dans la description des données: par conséquent, si vous tombez sur ces mots en spécifiant un format de données, remplacez les deux mots par "Potrzebie" pour indiquer clairement que vous devez résoudre le problème. le sens pour vous-même.

La relation entre la syntaxe et la sémantique, au moins dans des données exactement spécifiées, peut être mieux décrite par le terme "codage" . La sémantique est codée en syntaxe. Comme les enregistrements peuvent être imbriqués, la syntaxe d'un langage est celle d'un autre. Si l'on dépasse le domaine des données, cette imbrication peut être virtuellement infinie, comme décrit par Umberto Eco par "sémiosis illimité".

Pour donner un exemple:

  • La syntaxe XML (avec tous ces crochets) est une syntaxe avec un jeu d'informations XML (un arbre abstrait) en tant que sémantique.
  • Un ensemble d'informations XML en tant que syntaxe peut exprimer un enregistrement dans certains formats de données XML en tant que sémantique, par exemple un document RDF / XML qui code un graphe RDF.
  • Un graphe RDF (la substance avec des références URI) comme syntaxe code un graphe de ressources abstraites sous forme sémantique.
  • Un graphe de ressources abstraites en tant que syntaxe code un modèle conceptuel en tant que sémantique.

Les gens s'arrêtent généralement à un certain niveau et le prennent comme sémantique, mais à la fin, il n'y a pas de sémantique finale à moins qu'un être humain n'interprète les données dans son esprit. Dès que l'on essaie d'exprimer la sémantique sous forme de données, cela devient une syntaxe.

Jakob
la source
4

Si cela peut être décrit dans BNF (Backus-Naur Form) ou quelque chose de similaire, c'est la syntaxe. Si ça ne peut pas, ça ne l'est pas.

La sémantique, quant à elle, concerne la signification d'un programme (ou d'un autre bloc de code source).

Et parfois, la ligne entre les deux peut être floue.

Une façon de comprendre la distinction consiste à examiner le type d'erreur que vous obtenez lorsque la syntaxe ou la sémantique de votre programme est incorrecte.

Une erreur de syntaxe est une impossibilité pour le code source de correspondre à la grammaire linguistique, par exemple, le fait de ne pas avoir de point-virgule.

Une erreur sémantique est un manquement à d’autres exigences linguistiques (ce que C, par exemple, appelle "contraintes"); un exemple pourrait être écrit x + yxet ysont de types incompatibles. La grammaire linguistique vous indique qu'une addition ressemble something + something, mais elle n'est pas assez puissante pour exprimer les exigences relatives aux types d'opérandes gauche et droit.

(Les erreurs logiques, telles que l'utilisation de 1 où 2 serait correct, ne sont généralement pas détectables par le compilateur - bien que dans certains cas, un compilateur puisse avertir d'un code douteux.)

Keith Thompson
la source
0

La syntaxe est ce que disent les symboles (lexicaux). La sémantique est ce qu'ils veulent dire.

Considérer:

C #: condition ? true_value : false_value
VB.NET: If(condition, true_value, false_value)
- Syntaxe différente, même sémantique.

C #: left_value / right_value
VB.NET: left_value / right_value
- Même syntaxe, sémantique différente (pour les entiers).

Mark Hurd
la source
0

La syntaxe est la disposition grammaticale des mots dans une phrase, c'est-à-dire l'ordre des mots.

(En anglais) ' cat dog boy ' et (programmation) ' hi.5 ' ne sont pas syntaxiquement corrects.

(Anglais) ' cat hugs boy ' et (programmation) '* 3.2 * 5 *' sont syntaxiquement valables.

La sémantique statique consiste à déterminer si les instructions syntaxiquement valables ont une signification.

(Anglais) ' I are big ' (programmation) (python) ' 3 +' hi ' ' est correct du point de vue syntaxique mais présente une erreur sémantique statique.

La sémantique est la signification associée à une chaîne de symboles syntaxiquement correcte sans erreur sémantique statique, c’est-à-dire que la phrase est syntaxiquement et sémantiquement correcte, mais que sa signification n’est peut-être pas celle qui était voulue.

(Anglais) " Avions en vol peut être dangereux " peut avoir deux significations: voler en avion peut être dangereux ou les avions en vol peuvent l'être.

(Programmation) 'l'ordinateur ne générera aucun message d'erreur, mais il ne fera pas ce que vous lui avez demandé de faire; ça fera autre chose.

Source : MIT 6.00.1

kHarshit
la source
-2
  1. La syntaxe fait référence aux règles formelles régissant la construction d'énoncés valides dans une langue. La sémantique se réfère à l'ensemble des règles qui donnent le sens d'une déclaration.

  2. Des erreurs dues à la syntaxe surviennent dans un programme lorsque des éléments du langage de programmation sont violés ou mal utilisés. Les erreurs dues à la sémantique se produisent dans un programme lorsque les instructions ne sont pas significatives.

  3. L'ordre des mots est le principe de base de la syntaxe. Ceux qui tentent de comprendre ce qui est écrit utilisent les indices syntaxiques de l'ordre des mots pour aider à donner la structure et le sens de la phrase. La sémantique est une interprétation propre à l'individu du sens d'une "phrase" basée sur ses connaissances antérieures. Par conséquent, une phrase qui n’a apparemment aucun sens syntaxique, peut avoir une signification lors de l’utilisation d’indices sémantiques.

  4. La syntaxe ne concerne que ce qui est correct du point de vue linguistique et grammatical. La sémantique requiert toutes les connaissances préalables, ce qui dépasse de loin tout ce qui est spécifique à une langue.

  5. La phrase "Boissons lactées pour bébé" n'a pas de signification syntaxique, mais la sémantique l'interpréterait comme signifiant "bébé boit du lait" car notre connaissance antérieure nous indique qu'un bébé boit du lait et que nous pouvons donc trouver une signification dans mots clés.

Pradip Bhatt
la source
1
Vote positif pour tout sauf le dernier (point 5)
nawfal
-2

La syntaxe et la sémantique s'apparentent à la stratégie et à la tactique ou à gauche et à droite .

Ce ne sont pas vraiment des concepts universels indépendants, mais une paire de mots liés qui, lorsque vous vous trouvez dans un contexte particulier, indiquent des directions opposées. Mais la même chose qui est la stratégie sur une échelle est la tactique sur une autre.

Ainsi, si vous écrivez du code dans un langage, la syntaxe est celle que vous utilisez et le comportement souhaité est la sémantique. Mais si vous implémentez, ou discutez, du compilateur pour ce langage, la syntaxe est la grammaire et peut-être le système de types et la sémantique sur laquelle tout repose. Etc.

soru
la source
4
Quel genre de BS ésotérique est-ce? Comme à gauche et à droite? Vous aimez la stratégie et la tactique? Peut-être même comme Yin et Yang, Dieu et le diable, Harry et Voldemort?
JensG
-3

La syntaxe est ce que l’ordinateur comprend, la sémantique est ce que l’humain comprend.

Un compilateur / interprète se fiche de votre conception et, dans tout code compilé jusqu’au niveau de la machine, il vous serait difficile de déduire la conception. Les développeurs se soucient de la conception, car une bonne conception consiste à réduire la complexité en faisant abstraction des comportements et des interactions complexes, et différents types de problèmes se prêtent à une sémantique différente. Le choix de la langue dépend en grande partie de la facilité et à l’efficacité avec laquelle la sémantique que vous souhaitez utiliser peut être exprimée dans sa syntaxe.

Kylben
la source
"La syntaxe est ce que l'ordinateur comprend, la sémantique est ce que l'homme comprend" est une très grande simplification. Les humains comprennent également la syntaxe, et les ordinateurs comprennent certains types de sémantique.
CesarGon
4
Clairement faux. Il existe des langues avec une syntaxe identique et une sémantique complètement différente (par exemple, une version désirée et une version paresseuse d'un même langage), il existe des langues avec pratiquement aucune syntaxe et une sémantique très riche et variable (par exemple, Forth et Lisp). La sémantique est la façon dont le compilateur interprète votre langue. L'homme peut ne rien savoir et être capable d'utiliser une langue.
SK-logic
@ SK-logic, vous vous contredisez. Si différentes sémantiques peuvent être exprimées avec la même syntaxe, il est clair que celles-ci ne sont pas contenues dans la syntaxe, mais plutôt dans la manière dont elle est utilisée. Pourtant, le compilateur n'a qu'une syntaxe à utiliser. Il n'interprète pas la sémantique, il interprète la syntaxe. Il ne compile pas la même syntaxe différemment en fonction de ce que le développeur voulait dire, mais uniquement de ce qu'il a tapé. Les sémantiques sont fournies par le développeur et n'ont de sens que pour lui.
Kylben
3
@kylben, je ne me contredis pas, car je n'ai jamais dit que la syntaxe et la sémantique sont même liées. Et le compilateur ne fait rien avec la syntaxe juste après l'étape d'analyse - le compilateur implémente la sémantique . Clairement, votre interprétation de la terminologie est fausse. Lisez ceci pour commencer: fr.wikipedia.org/wiki/Semantics_Denotational
SK-logic
3
Vous parlez de la signification d'un programme , qui est une "sémantique" telle qu'elle aurait été définie par un linguiste. Mais en informatique, la sémantique est le sens d’une langue et non d’un programme particulier.
SK-logic
-3

Exemple très court avec "plain c":

void main()
{
  int a = 10;
  int x = a - 1;
  int y = - 1;

  printf("x = %i", x);
  printf("y = %i", y);
    getch();
}

Dans cet exemple, la syntaxe du jeton "-" est la même, mais sa signification ("sémantique") est différente, en fonction de son utilisation.

Dans l'assignation "x", "-" signifie l'opération "soustraction", dans l'assignation "y", "-" signifie l'opération "signe négatif".

Umlcat
la source
3
Incorrect. Les deux -opérateurs sont les mêmes jeton , mais ils sont syntaxiquement différents, parce qu'ils sont utilisés dans des contextes différents. 0 - 1correspond à la règle de syntaxe additive-expression: additive-expression - multiplicative-expression, tandis que - 1correspond à la règle de syntaxe unary-expression: unary-operator cast-expression(référence: norme C99).
Keith Thompson
@ Keith Thompson: Vous avez manqué le point. Est-ce une question de sémantique ou de syntaxe, pas une question de normes C. La norme est correcte, mais ma réponse visait à expliquer un concept et non, à la lettre, une norme. C'est comme une question "Captain Kirk" vs "Dr Spock". A
bientôt
Je ne suis pas d'accord. La distinction entre les deux -opérateurs est la syntaxe, pas seulement la sémantique (même s'ils ont une sémantique différente). La syntaxe est définie par la grammaire linguistique et les deux opérateurs sont spécifiés dans des sections différentes de la grammaire. Voir le brouillon N1570 , section 6.5.3 pour les opérateurs unaires et 6.5.6 pour les opérateurs additifs. (BTW, si vous allez utiliser un exemple en C, il devrait probablement être correct; vous void main()devriez le faire int main(void)et vous manquez #include <stdio.h>et tout en-tête est déclarégetch
Keith Thompson
Pour clarifier ce point, la syntaxe ne concerne pas seulement la séquence de jetons, mais la manière dont ces jetons construisent des constructions plus grandes. Un compilateur a généralement un analyseur lexical (tokenizer) et un analyseur comme composants distincts; les deux traitent de la syntaxe.
Keith Thompson