Creo que el término azúcar sintáctico indica una sintaxis alternativa para expresar la misma semántica subyacente.
Tomemos, por ejemplo, un lenguaje de programación A que tiene una operación sumque puede sumar una lista de enteros de longitud arbitraria. En este lenguaje podemos escribir las expresiones
sum []
sum [3, 4, 5, 1]
sum [2, 7]
cuyos resultados son 0, 13 y 9, respectivamente.
Ahora, supongamos que nos damos cuenta de que el 90% de las veces lo usamos sumcon dos argumentos y, por lo tanto, presentamos, por conveniencia, la nueva notación
2 + 7
que es sólo azúcar sintáctico para sum [2, 7].
Ahora tome un segundo idioma B que no tenga ninguna operación de suma. Es posible que tengamos operadores como <, =lo que nos permite comparar números, pero no hay forma de agregar números. En la versión 2 del lenguaje B, presentamos una nueva operación de adición con sintaxis
2 + 7
que agrega números como de costumbre.
En el contexto del lenguaje A, la +notación es azúcar sintáctica (es una notación alternativa, simplificada y ad-hoc que se puede usar en lugar de la sum [...]notación). De manera similar, como se ha señalado en la respuesta de Hoa Long Tam, en C la notación p->fieldes azúcar sintáctica para (*p).field.
En el contexto del lenguaje B, la +notación no es azúcar sintáctica (es la única sintaxis válida utilizada para la operación de suma). De manera similar, si C solo pudiera acceder a los miembros de la estructura a través de punteros y si no tuviera la notación (*p).field, entonces la notación p->fieldno sería azúcar sintáctica.
En mi opinión, hay algunos malentendidos sobre el azúcar sintáctico que se remontan a una confusión con respecto a la semántica del lenguaje de programación. El razonamiento es así:
- La semántica de un programa es lo que un programa calcula.
- El poder expresivo de un lenguaje de programación está representado por los cálculos que se pueden describir en ese lenguaje.
- Dos lenguajes de programación que pueden describir todas las funciones computables (como se define usando las máquinas de Turing) tienen el mismo poder expresivo ...
- ... y, por lo tanto, solo difieren en la sintaxis.
- Corolario: cualquier extensión de un lenguaje completo de Turing es solo sintaxis (azúcar sintáctico) porque no cambia el poder expresivo del lenguaje.
La línea de razonamiento anterior conduce a afirmaciones genéricas como "el azúcar sintáctico no se puede definir correctamente", es una "cuestión de gustos" o "después de todo, cada característica del lenguaje de programación es solo azúcar sintáctico".
Creo que el principal problema en el argumento anterior es que la semántica no solo se trata de lo que un programa puede calcular , sino también de cómo se calcula , es decir, qué construcciones primitivas se usan y cómo se combinan.
Entonces, por ejemplo, los objetos no son azúcar sintáctica para las configuraciones de bits subyacentes y las transformaciones de bits, son una construcción que permite modelar datos y operaciones y describir cálculos. Calcular con objetos, métodos, llamadas a métodos no es lo mismo que calcular con bytes, registros de procesador, direcciones de memoria (incluso si los dos cálculos tienen el mismo resultado, e incluso si el segundo cálculo se usa para implementar el primero).
Hice esta descripción un poco larga, pero creo que es un aspecto importante que no he visto en otras respuestas.
En pocas palabras: el azúcar sintáctico es una sintaxis alternativa (posiblemente más conveniente) para una construcción que ya está en un lenguaje y que ya tiene una sintaxis y una semántica bien definidas. La nueva sintaxis (azúcar sintáctica) difiere de la existente, pero tiene la misma semántica . Si introduce una nueva construcción en un lenguaje y una nueva sintaxis para él, entonces no tiene azúcar sintáctico.