Définition rigoureuse du sucre syntaxique? [fermé]

9

Il semble que dans les guerres sacrées de langue, les gens dénigrent constamment toute caractéristique qu'ils ne trouvent pas particulièrement utile comme étant "juste du sucre syntaxique". La frontière entre les «caractéristiques réelles» et le «sucre syntaxique» a tendance à s'estomper dans ces débats. Selon vous, quelle est une définition raisonnable et sans ambiguïté du sucre syntaxique qui évite qu'il soit défini comme une fonctionnalité que le locuteur / écrivain ne trouve pas utile?

dsimcha
la source

Réponses:

19

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 letsté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.

Hoa Long Tam
la source
7

À mon humble avis, je ne pense pas que vous puissiez avoir une définition du sucre syntaxique, car l'expression est BS et est susceptible d'être utilisée par des gens qui parlent de "vrais programmeurs" utilisant de "vrais outils" sur de "vrais systèmes d'exploitation"

Son BS parce que l'idée de "fonctionnalités réelles" ou de "sucre syntaxique" est comme l' erreur No true Scotsman . En ce sens, les phrases sont "des tentatives ponctuelles de conserver une affirmation déraisonnable". L'affirmation ici est qu'une fonctionnalité ici est triviale car vous pouvez utiliser une "vraie fonctionnalité" à la place.

Son BS parce que certains soutiennent que l'utilisation du sucre devrait être évitée car vous pouvez écrire un bogue, mais vous devez vous y tenir car il est plus difficile d'écrire des bogues. N'est-ce pas génial. La même phrase conduit à des conclusions exactement opposées utilisant la même logique.

Son BS parce que personne ne cite des études d'utilisabilité ou des études de comptage des défauts, pour sauvegarder leur lisibilité ou maintenabilité ou les arguments de défauts probables.

Son BS parce que les gens ont souvent tort ou se trompent sur l'équivalence. Par exemple, cette question affirme qu'une chaîne C # est le sucre d'un tableau de caractères. Ils ne le sont pas .

Cependant, si vous voulez dire que deux choses sont du sucre si elles sont sémantiquement équivalentes, cela vous aide à le définir comme vous le souhaitez.

Si vous voulez mépriser quelqu'un, vous pouvez également utiliser l'expression.

Conrad Frix
la source
2
"Si vous voulez être méprisant envers quelqu'un, vous pouvez également utiliser l'expression." - Comme dans: "Avez-vous déjà rencontré Barbara? Elle est notre sucre syntaxique."?
molf du
@molf. C'est assez drôle. Je suppose que je voulais dire les idées ou le travail ou les outils de quelqu'un. Comme: "Avez-vous déjà rencontré Barbara, elle pense qu'elle est un vrai codeur mais elle utilise trop de sucre." Ou "Barbra est un expert en Bar ++ v8.0, mais 8.0 c'est vraiment juste 7.0 avec beaucoup de sucre."
Conrad Frix
7

Voici une définition très rigoureuse d'un concept apparenté: l' expressivité , par
Matthias Felleisen:

Sur la puissance expressive des langages de programmation [Postscript était le seul formulaire gratuit que j'ai pu trouver.]

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 letforme 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.

Macneil
la source
5
+1: le sucre syntaxique est important. La notation algébrique moderne n'est qu'un sucre syntaxique pour la prose latine qu'elle a remplacée, mais elle fait une grande différence dans notre capacité à raisonner mathématiquement.
kevin cline le
3

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 sumqui 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 sumavec 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->fieldest 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->fieldne 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.

Giorgio
la source
0

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é.

Lorenzo Stella
la source
0

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é?

dsimcha
la source
3
La surcharge de l'opérateur n'est pas du sucre syntaxique. C'est ce qui permet à C ++ d'avoir des modèles qui fonctionnent à la fois pour les types fondamentaux (par exemple int) et mes propres classes.
Kate Gregory
@KateGregory: Si l'on accepte que la surcharge de fonction n'est pas du sucre syntaxique, la surcharge d'opérateur peut être considérée comme du sucre syntaxique pour simplement appeler des fonctions surchargeables sur les valeurs indiquées.
supercat
0

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:

  1. Pas de véritable approche écossaise. Les choses que j'aime sont de la vraie programmation et les choses que je n'aime pas sont le sucre syntaxique.
  2. Après MIPS, tout était du sucre syntaxique, et même certaines de ces instructions ne sont probablement pas nécessaires.
  3. Tout ce qui rend la programmation plus facile pour quelqu'un quelque part est utile et non pas du sucre syntaxique. Puisqu'une fonctionnalité n'aurait pas été ajoutée si personne ne l'a trouvée utile en aucune circonstance, il s'ensuit que chaque fonctionnalité existante n'est pas du sucre syntaxique. Les caractéristiques hypothétiques peuvent être du sucre syntaxique, jusqu'à ce que quelqu'un décide que cette fonctionnalité leur est utile.
Patrick87
la source
-3

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».

cwchambers
la source