Qu'en est-il de ceci: "le sucre syntaxique est un raccourci pratique pour certaines fonctionnalités qui n'introduisent aucune couche d'abstraction significative."
Prenez a->b
, qui, comme vous le faites remarquer, équivaut à (*a).b
. Cette notation vous permet-elle de considérer le code qu'il est utile, sinon caché? Non, c'est donc du sucre syntaxique.
Considérez maintenant a[i] == *(a + i)
. Pensez à tout programme C qui utilise des tableaux de manière substantielle. Pouvez-vous imaginer essayer de le comprendre sans la []
notation? Avec des tableaux multidimensionnels? Il est important de considérer les tableaux comme des unités entières, et non comme une référence au début d'un bloc de mémoire contigu. Bien que cela aide à savoir comment les tableaux fonctionnent en C si vous prévoyez de faire des choses compliquées avec eux, il est improductif de toujours penser "J'ai besoin de stocker les deux bits de mémoire 2 * i octets à droite de la emplacement mémoire référencé par a
. " L'intérêt d'un tableau est la possibilité d'abstraire le processus de stockage d'une séquence en tant qu'unité cohérente. La []
notation facilite cette abstraction. Ce n'est pas du sucre syntaxique.
Cela ne veut pas dire que le sucre syntaxique est toujours une mauvaise chose. Comme de nombreuses allitérations, il est devenu une épithète et opposé aux «caractéristiques réelles». Mais LISP et Scheme, par exemple, seraient illisibles sans la let
sténographie (et d'autres).
L'opérateur ternaire,, <pred> ? <cnsq> : <alt>
est un autre exemple. Le sucre syntaxique peut aider à organiser les programmes et à supprimer le code redondant, ce qui peut économiser de la maintenance sur toute la ligne. Le sucre syntaxique peut parfois être préférable à empiler sur de «vraies fonctionnalités» s'il aide à éliminer les barrières syntaxiques à la programmation.
Pour citer R ^ 5RS , "les langages de programmation doivent être conçus non pas en empilant des fonctionnalités au-dessus des fonctionnalités, mais en supprimant les faiblesses et les restrictions qui rendent nécessaires des fonctionnalités supplémentaires." À mon humble avis, la syntaxe peut être considérée comme une faiblesse et une restriction et permettre aux programmeurs de s'éloigner de la syntaxe peut augmenter l'expressivité d'un langage.
Voici une définition très rigoureuse d'un concept apparenté: l' expressivité , par
Matthias Felleisen:
Voir également cette entrée sur le langage Java et les fermetures .
En effet, quelque chose est du sucre syntaxique s'il peut être changé en une forme sans la syntaxe en ne faisant que des changements locaux. Si, par exemple, sans la forme syntaxique, vous devez modifier plusieurs emplacements de code différents ou déplacer des fragments vers d'autres emplacements, ce n'est pas du sucre.
Cela dit, le sucre syntaxique est très bien lorsqu'il est utilisé de manière appropriée. Je pense que tout programmeur de Scheme préférerait qu'il y ait une
let
forme spéciale plutôt que d'avoir à créer une nouvelle fonction anonyme puis à l'appliquer, ce qui ferait la même chose. Le but est de rendre le code plus clair.la source
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 expressionsdont 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 notationqui 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 syntaxequi 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 lasum [...]
notation). De même, comme cela a été souligné dans la réponse de Hoa Long Tam, en C la notationp->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 notationp->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:
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.
la source
le sucre syntaxique est une caractéristique qui ne prolonge pas l'expressivité du langage lui-même, donc redondant et parfois un abus de notation, mais qui à la fois simplifie la vie de l'écrivain et donne au lecteur plus de perspicacité.
la source
Pour répondre à ma propre question, une caractéristique est le sucre syntaxique si et seulement s'il a été inclus principalement pour améliorer l'esthétique et la lisibilité et peut être traduit de manière triviale d'une manière à peu près individuelle dans la version dé-sucrée. (Par grosso modo, j'entends des choses triviales modulo comme l'ordre des opérations commutatives, les noms des variables et les espaces.)
Toute fonctionnalité qui ne peut être supprimée qu'avec une quantité importante de discipline de programmeur n'est pas du sucre syntaxique. En tant que sous-ensemble de cela, toute fonctionnalité qui augmente la sécurité des types n'est pas du sucre syntaxique, car l'application manuelle de la sécurité des types via la discipline du programmeur est très simple. Par exemple, le système d'objets de C ++ est plus que du sucre syntaxique au-dessus du polymorphisme de fonte de pointeur C.
Toute fonctionnalité qui nécessiterait une duplication de code importante ou une refonte majeure si elle était supprimée n'est pas du sucre syntaxique, car ni l'une ni l'autre n'est une entreprise triviale. Par exemple, les modèles ne sont pas seulement du sucre syntaxique car obtenir les fonctionnalités équivalentes sans eux nécessiterait des tonnes de clones et de modifications.
Exemple de choses qui sont du sucre syntaxique:
a[i]
au lieu de*(a + i)
a -> b
au lieu de(*a).b
foreach
syntaxe au lieu de taper manuellement la syntaxe de l'itérateur.Toute surcharge d'opérateur est du sucre syntaxique pur.
Cela ressemble-t-il à une définition juste et sans ambiguïté?
la source
Le "sucre syntaxique" n'est pas un terme défini de manière rigoureuse. Selon qui vous demandez, vous obtiendrez très probablement l'une des sortes de définitions suivantes:
la source
Je ne suis pas sûr dans les domaines de l'informatique, mais avec le domaine de la logique, les concepts de conservativité et d'élimination des définitions [ 1 ] semblent être dans la même veine.
En appliquant la correspondance Curry-Howard, on pourrait peut-être trouver un concept parallèle concernant le «sucre syntaxique».
la source