Je pense que le terme sucre syntaxique indique une syntaxe alternative pour exprimer la même sémantique sous-jacente.
Prenons par exemple un langage de programmation A qui a une opération sum
qui peut additionner une liste d'entiers de longueur arbitraire. Dans cette langue, nous pouvons écrire les expressions
sum []
sum [3, 4, 5, 1]
sum [2, 7]
dont les résultats sont respectivement 0, 13 et 9.
Supposons maintenant que nous réalisons que 90% des fois que nous utilisons sum
avec deux arguments, et donc nous introduisons, pour plus de commodité, la nouvelle notation
2 + 7
qui est juste du sucre syntaxique pour sum [2, 7]
.
Prenons maintenant une deuxième langue B qui n'a aucune opération d'addition. Nous pouvons avoir des opérateurs comme <
, =
, ce qui nous permet de comparer les chiffres, mais aucun moyen d' ajouter des numéros. Dans la version 2 du langage B, nous introduisons une nouvelle opération d' addition avec syntaxe
2 + 7
qui ajoute des chiffres comme d'habitude.
Dans le contexte du langage A, la +
notation est du sucre syntaxique (c'est une notation alternative, simplifiée et ad hoc qui peut être utilisée à la place de la sum [...]
notation). De même, comme cela a été souligné dans la réponse de Hoa Long Tam, en C la notation p->field
est du sucre syntaxique pour (*p).field
.
Dans le contexte du langage B, la +
notation n'est pas du sucre syntaxique (c'est la seule syntaxe valide utilisée pour l'opération de somme). De même, si C ne pouvait accéder aux membres de la structure que par des pointeurs et s'il n'avait pas la notation (*p).field
, alors la notation p->field
ne serait pas du sucre syntaxique.
À mon avis, il existe des malentendus sur le sucre syntaxique qui peuvent être attribués à une confusion concernant la sémantique du langage de programmation. Le raisonnement va comme ceci:
- La sémantique d'un programme est ce qu'un programme calcule.
- La puissance expressive d'un langage de programmation est représentée par les calculs qui peuvent être décrits dans ce langage.
- Deux langages de programmation qui peuvent décrire toutes les fonctions calculables (telles que définies à l'aide des machines de Turing) ont la même puissance expressive ...
- ... et ne diffèrent donc que par la syntaxe.
- Corollaire: toute extension d'un langage complet de Turing n'est que syntaxe (sucre syntaxique) car vous ne modifiez pas le pouvoir expressif du langage.
Le raisonnement ci-dessus conduit à des assertions génériques comme «le sucre syntaxique ne peut pas être défini correctement», c'est une «question de goût», ou «chaque fonctionnalité du langage de programmation n'est, après tout, que du sucre syntaxique».
Je pense que le principal problème de l'argument ci-dessus est que la sémantique ne concerne pas seulement ce qui peut être calculé par un programme, mais aussi comment il est calculé , c'est-à-dire quelles constructions primitives sont utilisées et comment elles sont combinées.
Ainsi, par exemple, les objets ne sont pas du sucre syntaxique pour les configurations et transformations binaires sous-jacentes, ils sont une construction qui permet de modéliser des données et des opérations et de décrire des calculs. Le calcul avec des objets, des méthodes, des appels de méthode, n'est pas la même chose que le calcul avec des octets, des registres de processeur, des adresses de mémoire (même si les deux calculs ont le même résultat, et même si le deuxième calcul est utilisé pour implémenter le premier).
J'ai fait cette description un peu longue mais je pense que c'est un aspect important que je n'ai pas vu abordé dans d'autres réponses.
Conclusion: le sucre syntaxique est une syntaxe alternative (peut-être plus pratique) pour une construction qui est déjà dans un langage et qui a déjà une syntaxe et une sémantique bien définies. La nouvelle syntaxe (sucre syntaxique) diffère de la syntaxe existante mais a la même sémantique . Si vous introduisez une nouvelle construction dans une langue et une nouvelle syntaxe pour celle-ci, vous n'avez pas de sucre syntaxique.