O que são termos “sugar”, “desugar” no contexto do Java 8?

107

Eu ouço falar sobre 'sugaring' e 'desugaring' com mais frequência no Java 8, o que esses termos significam? são conceituais ou sintáticos.

Alguns exemplos:

Repetição de loop iterado padrão para java

Observações sobre açúcar sintático na compilação.

Xelian
fonte

Respostas:

136

açúcar , na programação, geralmente se refere àquelas adições doces , principalmente atalhos, que tornam alguns constructos mais fáceis de digitar e ler (sendo este último, na prática, o mais importante durante o ciclo de vida de seu programa).

A Wikipedia tem uma definição de açúcar sintático, mas você deve notar que nem todo açúcar é, em essência, sintático (nem todas as adições recentes de doces foram apenas alterações do compilador).

Aqui estão alguns exemplos :

  • os operadores de incremento postfix e prefix ( i++e ++i). Seu único propósito é evitar escrever uma declaração adicional. Eles são açúcar puro.
  • +=, |=, &=, Etc, são feitos do mesmo tipo de açúcar.
  • A conversão implícita entre tipos e objetos primitivos também é um açúcar.
  • a inferência de tipo também é açúcar.
  • A expressão lambda, que vem com o Java 8, é algum outro tipo de açúcar (este não é apenas sintático )

Java é amplamente visto como não sendo conciso o suficiente, especialmente em comparação com as linguagens modernas. É por isso que essas adições que ajudam a tornar o código mais rápido de ler são bem-vindas.

Para terminar, eu apenas observaria que, embora a falta de açúcar possa tornar seu programa gordo, um excesso de açúcar, levando a muitas maneiras diferentes de escrever as mesmas coisas, pode tornar sua linguagem enjoativa e seu programa menos coerente e mais difícil de manter . Outro tipo de açúcar, o açúcar API, é geralmente uma praga que torna o API mais difícil de entender, especialmente quando é feito de adições (sobrecarga, por exemplo).

Dito isto, desugaring refere-se a

  • o processo pelo qual você remove tudo o que é redundante em um idioma
  • o processo pelo qual um processador de código descobre o que está por trás de uma instrução açucarada (isso pode, por exemplo, envolver inferência de tipo)
Denys Séguret
fonte
6
+1 Você também pode mencionar sobre a parte desugar, pois isso completaria a resposta que a OP pediu! :)
Rahul Tripathi
6
@justhalf Pense no quanto seus programas ficarão mais finos quando você puder remover todas as interfaces que criou apenas para poder passar uma função.
Denys Séguret
42
"O açúcar sintático causa câncer do ponto e vírgula." - Alan Perlis
Stuart Marks
12
Os operadores pós-fixados e prefixados já foram, nos primeiros dias do C, não açúcar sintático. Os primeiros compiladores eram burros, para os padrões atuais, e esses operadores podiam ser implementados com uma instrução de código de máquina, mas a instrução de atribuição equivalente não. Assim, eles permitiram escrever programas mais eficientes.
Raedwald
3
@justhalf Esta questão chamou muita atenção. Não é raro nesses casos os administradores deletar comentários que não parecem construtivos. Não acho que seu comentário teve que ser excluído, mas não trouxe muito.
Denys Séguret
17

"Desugaring" parece ter um significado muito específico em Java 8. Parece ser um termo abrangente para expressar as várias maneiras pelas quais uma expressão lambda pode ser associada a uma chamada de método concreto real.

Este documento sobre "Tradução de expressões lambda" parece ter os detalhes reais do que está acontecendo se você estiver interessado em detalhes.

Uma frase-chave do documento:

O primeiro passo para traduzir lambdas em bytecode é transformar o corpo lambda em um método.

Tosado
fonte
6

Em geral, "desugaring" em javac permite representar algumas características da linguagem com outras pré-existentes. Isso permite representá-los no bytecode sem fazer grandes mudanças no formato do arquivo de classe. Também por esta razão o back-end do compilador é mais estável do que o front-end. Isso não significa que cada novo recurso de linguagem seja apenas um açúcar sintático, como definitivamente não é o caso de lambdas e referências de método. Existem mais exemplos de "desugaring" no compilador:

  • para cada loops são "dessugared" ao estilo C para os loops
  • asserções são "dessugar" a uma frase if
  • classes internas são representadas como uma classe independente

Você também pode investigar o que acontece com a opção String, digite erasure, ...

Vicente Romero
fonte