web-dev-qa-db-fra.com

Quels sont les termes "sucre", "desugar" dans le contexte de Java 8?

J'entends parler de "sucrage" et de "désucrage" plus souvent dans Java 8, que signifient ces termes? Sont-ils conceptuels ou syntaxiques?.

Un exemple:

Boucle itérative par défaut se réémettant en Java

Observations sur le sucre syntaxique dans la compilation.

97
Xelian

sugar, en programmation, fait généralement référence à ces ajouts sweet, principalement des raccourcis, qui facilitent la saisie et la lecture de certaines constructions (cette dernière étant en pratique , le plus important pendant le cycle de vie de votre programme).

Wikipedia a une définition de sucre syntaxique mais vous devez noter que tous les sucres ne sont pas, par essence, syntaxiques (tous les ajouts sucrés récents ne sont que des modifications du 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 type de sucre.
  • La conversion implicite entre les types primitifs et les objets est également du sucre.
  • l'inférence de type est également le sucre.
  • L'expression lambda, accompagnée de Java 8, est un autre type de sucre (celui-ci pas seulement syntaxique )

Java est largement considéré comme n'étant pas assez concis, surtout 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 même si un manque de sucre peut rendre votre programme plus gras, un excès de sucre, conduisant à de nombreuses façons différentes d'écrire les mêmes choses, peut rendre votre langage nauséeux 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 à saisir, surtout lorsqu'il est composé d'additions (surcharge par exemple).

Cela étant dit, desugaring se réfère 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)
118
Denys Séguret

"Désugaring" semble avoir une signification très spécifique dans Java 8. Il semble que ce soit un terme fourre-tout pour exprimer les différentes façons dont une expression lambda peut être liée à un appel de méthode concret réel.

Ce document sur "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 conversion des lambdas en bytecode consiste à désugarer le corps lambda en une méthode.

15
Shorn

En général, le "désuchage" en javac permet de représenter certaines fonctionnalités du langage avec celles préexistantes. Cela permet de les représenter dans le bytecode sans apporter de grandes modifications au format de fichier de classe. C'est également pour cette raison que le back-end du compilateur est plus stable que le frontal. 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ésuchage" dans le compilateur:

  • pour chaque boucles sont "désucrées" au style C pour les boucles
  • les affirmations sont "désuètes" pour une phrase if
  • les classes internes sont représentées comme une classe autonome

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

5
Vicente Romero