Que sont les termes «sucre», «désucre» dans le contexte de Java 8?

107

J'entends parler plus souvent de «sucre» et «désucre» dans Java 8, que signifient ces termes? sont-ils conceptuels ou syntaxiques.

Quelques exemples:

Boucle itérée par défaut resugaring à java

Observations sur le sucre syntaxique en compilation.

Xelian
la source

Réponses:

136

le sucre , dans la programmation, fait généralement référence à ces sucrés ajouts , principalement des raccourcis, qui facilitent la saisie et la lecture de certaines constructions (ces dernières étant, en pratique, les plus importantes au cours du cycle de vie de votre programme).

Wikipedia a une définition du sucre syntaxique, mais vous devriez noter que tout le sucre n'est pas, par essence, syntaxique (tous les ajouts sucrés récents n'étaient pas que des changements de compilateur).

Voici quelques exemples :

  • les opérateurs d'incrémentation de suffixe et de préfixe ( i++et++i ). Leur seul but est d'éviter d'écrire une déclaration supplémentaire. Ce sont du sucre pur.
  • +=, |=,&= , Etc. sont faits du même genre de sucre.
  • La conversion implicite entre les types primitifs et les objets est également du sucre.
  • l'inférence de type est aussi du sucre.
  • L'expression Lambda, fournie avec Java 8, est un autre type de sucre (celui-ci n'est pas seulement syntaxique )

Java est largement considéré comme n'étant pas assez concis, en particulier par rapport aux langages modernes. C'est pourquoi ces ajouts qui aident à rendre le code plus rapide à lire sont les bienvenus.

Pour terminer, je voudrais juste noter que si un manque de sucre peut rendre votre programme gras, un excès de sucre, conduisant à de nombreuses façons différentes d'écrire les mêmes choses, peut rendre votre langue mal à l'aise et votre programme moins cohérent et plus difficile à maintenir. . Un autre type de sucre, le sucre API, est le plus souvent un fléau qui rend l'API plus difficile à appréhender, surtout lorsqu'elle est faite d'ajouts (surcharge par exemple).

Cela étant dit, le désucrement fait référence soit à

  • le processus par lequel vous supprimez tout ce qui est redondant dans une langue
  • le processus par lequel un processeur de code découvre ce qui se cache derrière une instruction sucrée (cela peut par exemple impliquer une inférence de type)
Denys Séguret
la source
6
+1 Vous pouvez également mentionner la partie desugar car cela compléterait la réponse que OP a demandé! :)
Rahul Tripathi
6
@justhalf Pensez à la finesse de vos programmes lorsque vous pourrez supprimer toutes ces interfaces que vous créez juste pour pouvoir passer une fonction.
Denys Séguret
42
"Le sucre syntaxique provoque le cancer du point-virgule." - Alan Perlis
Stuart marque le
12
Les opérateurs de postfixe et de préfixe n'étaient autrefois, aux premiers jours du C, pas du sucre syntaxique. Les premiers compilateurs étaient stupides, selon les normes d'aujourd'hui, et ces opérateurs pouvaient être implémentés avec une instruction de code machine, mais l'instruction d'assignation équivalente ne le pouvait pas. Ils ont donc permis d'écrire des programmes plus efficaces.
Raedwald
3
@justhalf Cette question a retenu beaucoup d'attention. Il n'est pas rare dans ces cas que les administrateurs suppriment les commentaires qui ne semblent pas constructifs. Je ne pense pas que votre commentaire ait dû être supprimé mais cela n'a pas apporté beaucoup.
Denys Séguret
17

"Desugaring" semble avoir une signification très spécifique en Java 8. Il semble être un terme fourre-tout pour exprimer les différentes manières dont une expression lambda peut être liée à un appel de méthode concret.

Ce document sur la "Traduction des expressions Lambda" semble avoir les vrais détails de ce qui se passe si vous êtes intéressé par des détails.

Une phrase clé du document:

La première étape de la traduction de lambdas en bytecode consiste à désugarer le corps lambda en une méthode.

Dépouillé
la source
6

En général, "désugarer" en javac permet de représenter certaines fonctionnalités du langage avec des fonctionnalités préexistantes. Cela permet de les représenter dans le bytecode sans apporter de gros changements au format de fichier de classe. Aussi pour cette raison, le back-end du compilateur est plus stable que le front-end. Cela ne signifie pas que chaque nouvelle fonctionnalité de langage n'est que du sucre syntaxique, comme ce n'est certainement pas le cas des lambdas et des références de méthode. Il y a plus d'exemples de "désuétude" dans le compilateur:

  • pour chaque boucle sont "désugarés" en style C pour les boucles
  • les assertions sont "désucrées" en une phrase si
  • les classes internes sont représentées comme une classe autonome

Vous pouvez également étudier ce qui se passe avec le commutateur String, l'effacement de type, ...

Vicente Romero
la source