J'ai toujours pensé que se référer à la syntaxe d'une langue était la même chose que se référer à la sémantique d'une langue. Mais j'ai été informé que ce n'est apparemment pas le cas. Quelle est la différence?
Sémantique ~ Signification
Syntaxe ~ Représentation symbolique
Ainsi, deux programmes écrits dans des langues différentes 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érivera la sémantique des règles de langage (mappant la syntaxe sur les instructions de la machine, par exemple), mais ne trouvera pas toutes les erreurs sémantiques (erreurs d'exécution, par exemple en calculant le mauvais résultat car le code dit ajouter 1 au lieu d'ajouter 2).
En fait, il n'y a pas deux niveaux mais trois:
i
et f
produit if
)if
, (
, 42
, ==
, answer
et )
produit une instruction conditionnelle)Je vais vous l'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 affirmation n'a pas de sens concevable ou correct.
Sémantique décrire les entités logiques d'un langage de programmation et leurs interactions. Syntaxe définit comment ceux-ci sont exprimés en caractères.
Par exemple, le concept d'arithmétique des pointeurs fait partie de la sémantique de C; la façon dont le +
et -
les opérateurs peuvent être utilisés pour exprimer les opérations de pointeur font 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 - les deux utilisent des types de valeur et des types de 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érez Java vs JavaScript, où les similitudes confondent souvent les débutants).
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).
Vous n'avez pas précisé si vous vous référez uniquement aux langages de programmation ou aux langages généraux utilisés dans la programmation, donc ma réponse concerne 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 produire des normes indépendantes de la langue (1995) écrit que "une langue la syntaxe peut être la sémantique d'une autre ". Il se réfère aux mots "syntaxe" et "sémantique" utilisés dans la description des données: donc si vous tombez sur ces mots dans une spécification d'un certain format de données, vous devriez mieux remplacer les deux mots par "Potrzebie " pour indiquer clairement que vous devez trouver le sens par 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'une langue est la sémantique d'une autre. Si l'on va au-delà du domaine des données, cette imbrication peut être pratiquement infinie, comme décrit par Umberto Eco comme "sémiosis illimitée".
Pour donner un exemple:
Les gens s'arrêtent généralement à un certain niveau et le considèrent comme sémantique, mais à la fin il n'y a pas de sémantique finale à moins qu'un être humain interprète les données dans son esprit. Dès que l'on essaie d'exprimer la sémantique sous forme de données, elle devient syntaxe.
Si cela peut être décrit dans BNF (forme Backus-Naur) ou quelque chose de similaire, c'est la syntaxe. Si ce n'est pas le cas, ce n'est pas le cas.
La sémantique, d'autre part, concerne la signification d'un programme (ou autre morceau de code source).
Et parfois, la frontière entre les deux peut être floue.
Une façon de comprendre la distinction consiste à examiner les types d'erreurs que vous obtenez lorsque la syntaxe ou la sémantique de votre programme est incorrecte.
Une erreur de syntaxe est un échec du code source pour faire correspondre la grammaire de la langue, par exemple, n'ayant pas de point-virgule là où un est requis.
Une erreur sémantique est un échec à satisfaire d'autres exigences de langage (ce que C, par exemple, appelle des "contraintes"); un exemple pourrait être d'écrire x + y
où x
et y
sont de types incompatibles. La grammaire de la langue vous indique qu'un ajout ressemble à something + something
, mais il n'est pas assez puissant pour exprimer les exigences relatives aux types des 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 discutable.)
La syntaxe est ce que disent les symboles (lexicaux). La sémantique est ce qu'ils signifient.
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).
Syntaxe est l'arrangement grammatical des mots dans une phrase, c'est-à-dire l'ordre des mots.
(Anglais) ' chat chien garçon ' et (programmation) ' hi.5 'n'est pas syntaxiquement correct.
(Anglais) ‘ cat hugs boy ’ et (programmation) ‘* 3.2 * 5 *’ est syntaxiquement valide.
Sémantique statique est de savoir si les instructions syntaxiquement valides ont une signification.
(Anglais) ' Je suis grand ' (programmation) (python) ' 3 +' salut ' 'est syntaxiquement correct mais a une erreur sémantique statique.
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 sa signification peut ne pas être celle voulue.
(Français) ‘ Les avions volants peuvent être dangereux ’ peuvent avoir deux significations: voler des avions peut être dangereux ou les avions qui volent peuvent être dangereux.
(Programmation) "l'ordinateur ne générera aucun message d'erreur, mais il ne fera pas ce que vous lui avez demandé de faire; il fera autre chose. "
Source : MIT 6.00.1