¿Qué son los términos "azúcar", "desazúcar" en el contexto de Java 8?

107

Escuché sobre 'azucarar' y 'desazucarar' con más frecuencia en Java 8, ¿qué significan estos términos? son conceptuales o sintácticos.

Algún ejemplo:

Bucle iterado predeterminado resugaring a java

Observaciones sobre el azúcar sintáctico en compilación.

Xelian
fuente

Respuestas:

136

Sugar , en programación, generalmente se refiere a esas adiciones dulces , en su mayoría accesos directos, que hacen que algunas construcciones sean más fáciles de escribir y leer (siendo estas últimas, en la práctica, las más importantes durante el ciclo de vida de su programa).

Wikipedia tiene una definición de azúcar sintáctico, pero debe tener en cuenta que no todo el azúcar es, en esencia, sintáctico (no todas las adiciones dulces recientes fueron solo cambios del compilador).

Aquí están algunos ejemplos :

  • los operadores de incremento de sufijo y prefijo ( i++y ++i). Su único propósito es evitar escribir una declaración adicional. Son pura azúcar.
  • +=, |=, &=, Etc., están hechos del mismo tipo de azúcar.
  • La conversión implícita entre tipos primitivos y objetos también es azúcar.
  • la inferencia de tipo también es azúcar.
  • La expresión lambda, que viene con Java 8, es algún otro tipo de azúcar (este no es solo sintáctico )

En general, se considera que Java no es lo suficientemente conciso, especialmente en comparación con los lenguajes modernos. Es por eso que esas adiciones que ayudan a que el código sea más rápido de leer son bienvenidos.

Para terminar, solo señalaré que, si bien la falta de azúcar puede hacer que su programa sea más pesado, un exceso de azúcar, que lleva a muchas formas diferentes de escribir las mismas cosas, puede hacer que su lenguaje sea mareado y su programa sea menos coherente y más difícil de mantener. . Otro tipo de azúcar, el azúcar API, suele ser una plaga que hace que la API sea más difícil de comprender, especialmente cuando está hecha de adiciones (sobrecarga, por ejemplo).

Dicho esto, desugaring se refiere a

  • el proceso mediante el cual elimina todo lo que es redundante en un idioma
  • el proceso mediante el cual un procesador de código descubre qué hay detrás de una declaración azucarada (esto puede, por ejemplo, implicar la inferencia de tipos)
Denys Séguret
fuente
6
+1 ¡También puede mencionar la parte desugar, ya que completaría la respuesta que OP ha pedido! :)
Rahul Tripathi
6
@justhalf Piense en cuánto más delgados serán sus programas cuando pueda eliminar todas las interfaces que cree solo para poder pasar una función.
Denys Séguret
42
"El azúcar sintáctico causa cáncer de punto y coma". - Alan Perlis
Stuart Marks
12
En los primeros días de C, los operadores de sufijo y prefijo no eran azúcar sintáctico. Los primeros compiladores eran tontos, según los estándares actuales, y esos operadores podían implementarse con una instrucción de código de máquina, pero la declaración de asignación equivalente no. Entonces permitieron escribir programas más eficientes.
Raedwald
3
@justhalf Esta pregunta recibió mucha atención. No es raro en esos casos que los administradores eliminen comentarios que no parecen constructivos. No creo que tu comentario deba ser eliminado, pero no aportó mucho.
Denys Séguret
17

"Desugaring" parece tener un significado muy específico en Java 8. Parece ser un término general para expresar las diversas formas en que una expresión lambda puede vincularse a una llamada real a un método concreto.

Este documento sobre "Traducción de expresiones Lambda" parece tener los detalles reales de lo que está sucediendo si está interesado en detalles específicos.

Una frase clave del documento:

El primer paso para traducir lambdas en código de bytes es convertir el cuerpo lambda en un método.

Esquilado
fuente
6

En general, "desugaring" en javac permite representar algunas características del lenguaje con otras preexistentes. Esto permite representarlos en el código de bytes sin realizar grandes cambios en el formato del archivo de clase. También por esta razón el back-end del compilador es más estable que el front-end. Esto no significa que cada nueva característica del lenguaje sea simplemente azúcar sintáctica, como definitivamente no es el caso de las lambdas y las referencias a métodos. Hay más ejemplos de "desugaring" en el compilador:

  • para cada bucle "desazucarado" al estilo C para los bucles
  • las afirmaciones se "desagradan" a una oración if
  • las clases internas se representan como una clase independiente

También puede investigar qué sucede con el cambio de cadena, borrado de tipo, ...

Vicente Romero
fuente