Contexte
La page Wikipedia sur Sucre syntaxique dit:
En informatique, le sucre syntaxique est la syntaxe d'un langage de programmation conçu pour faciliter la lecture ou l'expression. Cela rend le langage "plus doux" pour les humains: les choses peuvent être exprimées plus clairement, de manière plus concise ou dans un style alternatif que certains préfèrent.
Je ne comprends pas vraiment quelle est la différence entre le sucre syntaxique et la syntaxe.
J'apprécie le fait que la version sucrée puisse être plus claire, plus concise, peut-être faire bouillir du plasma. Mais j’estime qu’à un certain niveau, toute la syntaxe consiste essentiellement à le faire pour former une abstraction sur laquelle le code est compilé.
De la même page Wikipedia:
Les processeurs de langage, y compris les compilateurs, les analyseurs statiques, etc., développent souvent des constructions sucrées en constructions plus fondamentales avant traitement, un processus parfois appelé "désuculation".
En tant qu’exercice de réflexion, si je prends souvent le mot «souvent» dans cette déclaration, cela signifie «toujours»: du compilateur sait (ou fait attention) quelle est la syntaxe de Sugar'd ou non?
Une question très liée sur ce site "Définition rigoureuse du sucre syntaxique?" a une réponse qui commence:
IMHO 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" en utilisant de "vrais outils" sur des "systèmes d'exploitation réels"
Ce qui pourrait m'indiquer qu'il n'y a peut-être pas de différence énorme entre le codeur utilisant la langue? Peut-être que la différence n'est perceptible que par l'auteur du compilateur? Même s’il peut y avoir des cas où il est utile que le codeur utilisant la langue sache ce qui se cache sous le capot du Sucre syntaxique? (Mais peut-être qu'en réalité, tout discours sur le sujet tend à utiliser le terme d'appât à la flamme?)
Le coeur de la question
Alors ... la version courte de la question:
- Existe-t-il une réelle différence entre la syntaxe et le sucre syntaxique?
- Qui est-ce important?
Extra nourriture pour la pensée
Bonus sur la contradiction de sujet:
Sur la page Wikipedia, un exemple est donné:
Par exemple, en langage C, la
a[i]
notation est un sucre syntaxique pour*(a + i)
Attendu qu'une autre réponse à la question liée ci-dessus parle du même exemple:
Considérons maintenant
a[i] == *(a + i)
. Pensez à tout programme C qui utilise des tableaux de manière significative.
Et résume que:
La
[]
notation facilite cette abstraction. Ce n'est pas du sucre syntaxique.
La conclusion opposée pour le même exemple!
la source
Réponses:
La principale différence est que la syntaxe est la grammaire définie dans un langage pour vous permettre d'exposer certaines fonctionnalités. Dès que vous pouvez accéder à cette fonctionnalité, toute autre syntaxe qui vous permet de faire la même chose est considérée comme du sucre. Cela se heurte bien entendu à des scénarios étranges sur la syntaxe choisie pour l’une des deux syntaxes, d’autant plus que la première place n’est pas toujours claire.
En pratique, le sucre syntaxique n’est utilisé que pour décrire la syntaxe ajoutée à une langue afin de faciliter son utilisation, comme pour infixer la
lhs + rhs
mappelhs.Add(rhs)
. Je considérerais que l'indexation sur les tableaux de C est un sucre syntaxique.Cela importe surtout parce que les designs élégants ont tendance à limiter le nombre de duplications. Avoir (ou du moins vouloir) du sucre syntaxique est perçu par certains comme un signe d'échec.
la source
if (a) return blah; ...
par oppositionresult_type res; if (a) res = blah; else {...}; return res;
. Vous devez assumer des langages spécifiques et faire preuve d’une extrême rigueur linguistique (souvent jusqu’à une sémantique opérationnelle modeste) pour trouver la différence entre ces programmes.La syntaxe est ce qu'un processeur de langage utilise pour comprendre la signification des constructions d'un langage. Les constructions considérées comme du sucre syntaxique doivent également être interprétées par le processeur de langage et font donc partie de la syntaxe d'un langage.
Ce qui distingue le sucre syntaxique du reste de la syntaxe d'une langue, c'est qu'il serait possible de supprimer le sucre syntaxique de la langue sans affecter les programmes pouvant être écrits dans cette langue.
Pour donner une définition plus formaliste, je dirais
Cela n’a aucunement pour but de dénigrer le sucre syntaxique, ou les langages qui en contiennent, car l’utilisation du sucre syntaxique conduit souvent à des programmes dont l’intention est plus compréhensible.
la source
->
opérateur de C et je ne vois pas en quoi cet opérateur est moins général que les autres.Les autres réponses n'ont pas mentionné un concept clé: la syntaxe abstraite ; sans cela, le terme "sucre syntaxique" n'a pas de sens.
La syntaxe abstraite définit les éléments et la structure des langues et explique comment combiner des expressions de cette langue pour créer des expressions plus volumineuses. La syntaxe abstraite est indépendante de la syntaxe concrète. Le terme "sucre syntaxique", si je comprends bien, désigne une syntaxe concrète.
En général, lors de la conception d'une langue, vous souhaiterez créer une syntaxe concrète pour chaque terme de votre syntaxe abstraite, afin que les utilisateurs puissent écrire du code dans votre langue en utilisant du texte brut.
Maintenant, supposons que vous créez une syntaxe concrète délicate pour foo . Les utilisateurs se plaignent et vous implémentez une nouvelle syntaxe concrète pour représenter la même syntaxe abstraite . Le résultat est que votre syntaxe abstraite et votre sémantique n'ont pas changé, mais que vous avez maintenant deux syntaxes concrètes pour le même terme de syntaxe abstraite.
Je pense que c'est ce que les gens veulent dire quand ils parlent de "sucre syntaxique" - des changements qui n'affectent que la syntaxe concrète, mais qui n'affectent pas la syntaxe abstraite ni la sémantique.
Ainsi, la différence entre "sucre syntaxique" et "syntaxe concrète" est maintenant claire. Pour moi. :)
Cette interprétation aide également à expliquer ce qu'Alan Perlis aurait pu vouloir dire quand il a dit "le sucre syntaxique cause le cancer du point-virgule": tout le sucre syntaxique concret dans le monde ne peut pas réparer la syntaxe abstraite faible, et tous les efforts que vous déployez en ajoutant que le sucre est effort que vous ne dépensez pas pour traiter le vrai problème - la syntaxe abstraite.
Je devrais également noter que ceci est uniquement mon opinion; Je n'y crois que parce que c'est la seule interprétation à laquelle je puisse penser qui a du sens pour moi.
la source
p
vers une structure contenant un champx
, faire les expressions(*p).x
etp->x
la même syntaxe abstraite? Mais je pense que ce serait bien si tout se résumait à une syntaxe abstraite ou concrète..
à la racine. Le sous-noeud gauche de la racine est a*
et son enfant estp
. Le sous-noeud de droite de la racine estx
. Pour la deuxième expression, l'arbre de syntaxe abstraite a un->
à la racine et la racine a deux enfantsp
etx
. J'essaie de comprendre s'il est logique d'analyser les deux expressions différemment afin qu'elles aient le même arbre de syntaxe abstraite, mais je ne vois pas comment pour le moment.x
)(
ou;
) pour produire un arbre qui reflète la structure réelle d'un programme (voir en.wikipedia.org/wiki/Abstract_syntax_tree ). Cependant, dans la syntaxe abstraite, rien n’est dit (encore) sur la sémantique du programme.Le sucre syntaxique est un sous-ensemble de la syntaxe des langages. L'idée de base est qu'il y a plus d'une façon de dire la même chose.
Ce qui rend difficile de dire quelles pièces sont du sucre syntaxique et quelles pièces sont de la "syntaxe pure" sont des énoncés du type "il est difficile de dire quelle forme est apparue en premier" ou "il est difficile de savoir de quelle manière l'auteur du langage est destiné" ou "c'est quelque peu arbitraire de décider quelle forme est la plus simple ".
Ce qui permet de choisir facilement les éléments purs ou sucrés, c’est de poser la question dans le cadre d’un compilateur ou d’un interprète spécifique. La syntaxe pure correspond aux éléments qu'un compilateur convertit directement en code machine ou auxquels l'interpréteur répond directement. Le sucre est ce qui a d’abord été transformé en quelque chose de syntaxe avant que ces choses directes ne se produisent. Selon l’implémentation, il peut s’agir ou non de ce que l’auteur avait l'intention de faire ou même de ce que prétend la langue.
En pratique, c’est ainsi que la réalité de la question est décidée.
la source
Vraiment, votre première citation de Wikipedia dit tout: "... rend les choses plus faciles à lire ...", ".... plus doux pour les humains à utiliser ....".
En écriture, les formes abrégées telles que "ne pas" ou "ne pas" pourraient être considérées comme du sucre syntaxique.
la source
Généralement, le sucre de syntaxe est la partie du langage qui peut être exprimée par une partie existante du langage (syntaxe) sans perte de généralité, mais avec éventuellement une perte de clarté. Parfois, les compilateurs ont une étape de desugaring explicite qui transforme l'AST créé par le code source et applique des étapes simples pour supprimer les nœuds correspondant au sucre.
Par exemple, Haskell a un sucre de syntaxe pour les monades avec les règles suivantes appliquées de manière récursive
Pour le moment, peu importe ce que cela signifie exactement - cependant, vous pouvez voir que la syntaxe spéciale sur LHS peut être transformée en quelque chose de plus fondamental sur RHS (à savoir les applications de fonction, lambdas et
let
s). Cette étape permet de garder le meilleur des deux mondes:De même, en C, vous pouvez imaginer une règle de réécriture dérisoire (en raison de la surcharge des opérateurs, etc., ce n'est pas vrai pour C ++):
Vous pouvez imaginer écrire tous les programmes sans utiliser
->
ou[]
en C qui utilisent cette construction aujourd'hui. Cependant, il serait plus difficile pour les programmeurs de l'utiliser, d'où le sucre syntaxique (je suppose que dans les années 70, cela pourrait aussi simplifier le travail des compilateurs). C'est peut-être moins clair car vous pouvez techniquement ajouter la règle de réécriture suivante, parfaitement valide:La syntaxe est-elle mauvaise? Pas nécessairement - il y a le danger qu'il soit utilisé comme culte de la cargaison sans comprendre un sens plus profond. Par exemple, les fonctions suivantes sont équivalentes dans Haskell, mais beaucoup de débutants écriraient le premier formulaire sans comprendre qu'ils utilisaient trop de sucre dans la syntaxe:
De plus, la syntaxe sucre peut compliquer excessivement le langage ou être trop étroite pour permettre un code idiomatique généralisé. Cela peut également signifier que le langage n'est pas assez puissant pour faire certaines choses facilement - cela peut être dû à la conception (ne donnez pas aux développeurs des outils pointus ou un langage de niche très spécifique qui ajouterait une construction plus puissante nuirait à d'autres objectifs) ou par omission - ce dernier la forme donnait à la syntaxe sugar le mauvais nom. Si le langage est suffisamment puissant pour utiliser d'autres constructions sans ajouter de sucre de syntaxe, il est considéré comme plus élégant de les utiliser.
la source
Je pense que l'exemple le plus évident serait la syntaxe "+ =" en C.
et
faites exactement la même chose et compilez exactement le même ensemble d'instructions machine. La seconde forme enregistre quelques caractères en tapant, mais, plus important encore, il est très clair que vous modifiez une valeur en fonction de sa valeur actuelle.
J'allais citer l'opérateur "++" post / prefix comme exemple canonique, mais j'ai réalisé qu'il s'agissait de plus que du sucre syntaxique. Il n'y a aucun moyen d'exprimer la différence entre ++ i et i ++ dans une seule expression à l'aide de la
i = i + 1
syntaxe.la source
a[f(x)] += 1
.Quelle que soit la signification originale de cette expression, il s’agit aujourd’hui essentiellement d’un sucre péjoratif, presque toujours qualifié de sucre syntaxique "juste" ou "uniquement". Cela ne concerne quasiment que les programmeurs qui aiment faire les choses de façon illisible et veulent une façon concise de justifier cela auprès de leurs collègues. Une définition de ceux qui utilisent principalement le terme aujourd'hui, de leur point de vue, serait quelque chose comme:
C'est pourquoi vous obtenez deux conclusions opposées pour le même élément syntaxique. Votre premier exemple de notation en tableau utilise la signification originale du terme, quelque chose de similaire à la réponse de Bart. Votre deuxième exemple consiste à défendre la notation de tableau contre l’accusation de sucre syntaxique au sens péjoratif. En d'autres termes, il soutient que la syntaxe est une abstraction utile plutôt qu'une béquille.
la source
Premièrement, je vais aborder certaines des autres réponses avec un exemple concret. La boucle for basée sur la plage C ++ 11 (un peu comme les boucles foreach dans divers autres langages)
est exactement équivalent à (c.-à-d. une version sucrée de)
Maintenant, malgré l’ajout de nouvelle syntaxe abstraite ou sémantique au langage, celui-ci a un réel utilité.
La première version rend l'intention explicite (visiter chaque élément d'un conteneur). Elle interdit également les comportements inhabituels, tels que la modification du conteneur pendant la traversée, l'avancée ultérieure
iterator
dans le corps de la boucle ou l'obtention de conditions de boucle légèrement fausses. Cela évite les sources possibles de bogues et, ce faisant, réduit les difficultés de lecture et de raisonnement concernant le code.Par exemple, une erreur d’un caractère dans la deuxième version:
donne une erreur d'un passé et un comportement indéfini.
Ainsi, la version sucrée est utile précisément parce qu'elle est plus restrictive et donc plus simple à faire confiance et à comprendre.
Deuxièmement, à la question initiale:
Non, "sucre syntaxique" est une syntaxe de langage (concrète), considérée comme "sucre" car elle ne prolonge pas la syntaxe abstraite ou les fonctionnalités essentielles du langage. J'aime la réponse de Matt Fenwick à ce sujet.
Il importe aux utilisateurs de la langue, autant que toute autre syntaxe, et le sucre est fourni pour soutenir (et dans un certain sens, bénir) des idiomes spécifiques.
Enfin, sur la question bonus
cela ressemble beaucoup à la définition du sucre syntaxique: il prend en charge (et fournit la bénédiction des auteurs), en utilisant des pointeurs en tant que tableaux. La
p[i]
forme n’est pas vraiment plus restrictive que la précédente*(p+i)
, de sorte que la seule différence est la communication claire de l’intention (et un léger gain de lisibilité).la source