Quelle est la différence entre syntaxe y sémantique dans les langages de programmation (comme C, C++) ?
Réponses
Trop de publicités?J'arrive tard dans la soirée, mais pour moi, les réponses semblent correctes mais incomplètes.
De manière pragmatique, je distinguerais trois niveaux :
- Syntaxe
- Sémantique de bas niveau
- Sémantique de haut niveau
1. SYNTHÈSE
La syntaxe est la grammaire formelle du langage, qui spécifie une déclaration bien formée que le compilateur reconnaîtra.
Ainsi, en C, la syntaxe de l'initialisation des variables est :
data_type variable_name = value_expression;
Exemple :
int volume = 66 * 22 * 55;
Alors que dans Go, qui offre l'inférence de type, une forme d'initialisation est :
variable_name := value_expression
Exemple :
volume := 66 * 22 * 55
En clair, un compilateur Go ne reconnaîtra pas la syntaxe C, et vice versa.
2. SÉMANTIQUE DE BAS NIVEAU
Alors que la syntaxe s'intéresse à la forme, la sémantique s'intéresse au sens.
Dans les langues naturelles, une phrase peut être syntaxiquement correcte mais sans signification sémantique. Par exemple :
The man bought the infinity from the store.
La phrase est grammaticalement correcte mais n'a pas de sens dans le monde réel.
Au niveau le plus bas, la sémantique de la programmation consiste à déterminer si une déclaration dont la syntaxe est correcte est également conforme aux règles sémantiques exprimées par le développeur à l'aide du système de types du langage.
Par exemple, il s'agit d'une instruction d'assignation syntaxiquement correcte en Java, mais sémantiquement, c'est une erreur car elle tente d'assigner une valeur de int
à un String
String firstName = 23;
Les systèmes de types sont donc destinés à protéger le développeur contre les dérapages involontaires de sens au bas niveau.
Les langages faiblement typés comme JavaScript ou Python offrent très peu de protection sémantique, tandis que les langages comme Haskell ou F#, dotés de systèmes de types expressifs, offrent au développeur expérimenté un niveau de protection beaucoup plus élevé.
Par exemple, en F#, votre type ShoppingCart peut spécifier que le panier doit être dans l'un des trois états suivants :
type ShoppingCart =
| EmptyCart // no data
| ActiveCart of ActiveCartData
| PaidCart of PaidCartData
Maintenant, le compilateur peut vérifier que votre code n'a pas essayé de mettre le chariot dans un état illégal.
En Python, vous devriez écrire votre propre code pour vérifier la validité de l'état.
3. SÉMANTIQUE DE HAUT NIVEAU
Enfin, à un niveau supérieur, la sémantique s'intéresse à ce que le code est censé réaliser - la raison pour laquelle le programme est écrit.
Cela peut être exprimé sous forme de pseudo-code qui pourrait être mis en œuvre dans n'importe quel langage complet. Par exemple :
// Check for an open trade for EURUSD
// For any open trade, close if the profit target is reached
// If there is no open trade for EURUSD, check for an entry signal
// For an entry signal, use risk settings to calculate trade size
// Submit the order.
Dans ce scénario (héroïquement simplifié), vous commettez une erreur sémantique de haut niveau si votre système saisit deux transactions à la fois pour EURUSD, saisit une transaction dans la mauvaise direction, calcule mal la taille de la transaction, etc.
TL ; DR
Si vous vous trompez dans la syntaxe ou la sémantique de bas niveau, votre compilateur se plaindra.
Si vous vous trompez dans la sémantique de haut niveau, votre programme n'est pas adapté et votre client se plaindra.
Syntaxe est la structure ou la forme des expressions, des déclarations et des unités de programme mais Sémantique est la signification de ces expressions, déclarations et unités de programme. Sémantique découlent directement de syntaxe . Syntaxe fait référence à la structure/forme du code qu'un langage de programmation spécifique spécifie mais Sémantique traitent de la signification attribuée aux symboles, aux caractères et aux mots.
Comprendre comment le compilateur voit le code
En général, l'analyse syntaxique et sémantique du code est effectuée dans la partie "frontale" du compilateur.
-
Syntaxe : Le compilateur génère des jetons pour chaque mot clé et chaque symbole : le jeton contient des informations sur le type de 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 en fait ici, c'est si le code a un sens lexical, c'est-à-dire si 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 du langage (et non le sens du code). Remarque : les erreurs de syntaxe sont signalées dans cette phase (renvoie les tokens avec le type d'erreur au système).
-
Sémantique : Maintenant, le compilateur va vérifier si les opérations de votre code ont un sens. Par exemple, si le langage supporte l'inférence de type, une erreur sémantique sera signalée si vous essayez d'assigner une chaîne à un flottant. OU si vous déclarez deux fois la même variable. Ce sont des erreurs qui sont "grammaticalement"/syntaxiquement correctes, mais qui n'ont aucun sens pendant l'opération. Remarque : Pour vérifier si la même variable est déclarée deux fois, le compilateur gère une fonction table des symboles
Ainsi, le résultat de ces deux phases frontales est un AST annoté (avec les types de données) et une table de symboles.
Comprendre d'une manière moins technique
En considérant la langue normale que nous utilisons ; ici, l'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. - froid est un adjectif. En anglais, on pourrait 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 auquel je puisse penser.
Syntaxe : Il s'agit de la structure grammaticale de la langue Si vous écrivez le langage c . Vous devez faire très attention à l'utilisation des types de données, des jetons [ il peut s'agir de littéral ou de symbole comme "printf()". Il a 3 tokes, "printf, (, )" ]. De la même manière, vous devez faire très attention à la façon dont vous utilisez les fonctions, la syntaxe des fonctions, la déclaration des fonctions, leur définition, leur initialisation et leur appel.
Alors que la sémantique, elle concerne la logique ou le concept de la phrase ou des déclarations. Si vous dites ou écrivez quelque chose sans concept ou logique, alors vous êtes sémantiquement mauvais.