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?
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?
Réponses:
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).
x + y
s'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 .
En réalité, il n'y a pas deux niveaux mais trois:
i
et f
produire if
)if
, (
, 42
, ==
, answer
et )
produit une instruction conditionnelle)ValidIdentifier
terminal, 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.
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).
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 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:
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.
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 + y
où x
et y
sont 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.)
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).
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
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.
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.
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.
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.
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.
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.
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.
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".
-
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 - 1
correspond à la règle de syntaxe additive-expression: additive-expression - multiplicative-expression
, tandis que - 1
correspond à la règle de syntaxe unary-expression: unary-operator cast-expression
(référence: norme C99).
-
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