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

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

Quelques exemples:

Boucle itérative par défaut réintégrant java

Observations sur le sucre syntaxique dans la compilation.

Le sucre , en programmation, fait généralement référence à ces ajouts doux , principalement des raccourcis, qui facilitent la saisie et la lecture de certains concepts (ce qui, en pratique, est le plus important pendant le cycle de vie de votre programme).

Wikipedia a une définition du sucre syntaxique, mais vous devez noter que tous les sucres ne sont pas, par essence, syntaxiques (tous les ajouts récents ne sont que des modifications du compilateur).

Voici quelques exemples :

  • les opérateurs d’incrémentation postfix et prefix ( i++ et ++i ). Leur seul but est d’éviter d’écrire une déclaration supplémentaire. C’est du sucre pur.
  • += , |= , &= , etc. sont fabriqués avec le même type de sucre.
  • La conversion implicite entre les types primitifs et les objects est aussi du sucre.
  • L’inférence de type est le sucre aussi.
  • L’expression lambda, venant 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, surtout par rapport aux langages modernes. C’est pourquoi les ajouts qui facilitent la lecture du code sont les bienvenus.

Pour finir, je voudrais juste noter que si un manque de sucre peut faire grossir votre programme, un excès de sucre, menant à de nombreuses façons différentes d’écrire les mêmes choses, peut rendre votre langage difficile et votre programme moins cohérent et difficile à maintenir. . Un autre type de sucre, le sucre API, est le plus souvent un fléau qui rend l’API plus difficile à saisir, en particulier lorsqu’il est composé d’ajouts (surcharge par exemple).

Ceci étant dit, le désuétude désigne 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 déclaration sucrée (cela peut par exemple impliquer une inférence de type)

“Désuivre” 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 “Traduction des expressions lambda” semble avoir les vrais détails de ce qui se passe si vous êtes intéressé par les détails.

Une phrase clé du document:

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

En général, le “désuber” dans 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 grandes modifications au format de fichier de classe. Pour cette raison également, le back-end du compilateur est plus stable que le serveur frontal. Cela ne signifie pas que chaque nouvelle fonctionnalité de langage est simplement du sucre syntaxique, ce qui n’est certainement pas le cas des références de méthode et de lambda. Il y a plus d’exemples de “désuétude” dans le compilateur:

  • pour chaque boucle sont “desugared” au style C pour les boucles
  • les assertions sont “désabusées” à 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 Ssortingng, tapez effacement, …