Penso que o termo açúcar sintático indica uma sintaxe alternativa para expressar a mesma semântica subjacente.
Tomemos, por exemplo, uma linguagem de programação A que possui uma operação sum
que pode adicionar uma lista de números inteiros de comprimento arbitrário. Nesta linguagem, podemos escrever as expressões
sum []
sum [3, 4, 5, 1]
sum [2, 7]
cujos resultados são 0, 13 e 9, respectivamente.
Agora, suponha que percebemos que 90% das vezes usamos sum
com dois argumentos e, portanto, introduzimos, por conveniência, a nova notação
2 + 7
que é apenas açúcar sintático para sum [2, 7]
.
Agora pegue um segundo idioma B que não tenha nenhuma operação adicional. Podemos ter operadores como <
, =
nos permitindo comparar números, mas não há como adicionar números. No release 2 do idioma B, introduzimos uma nova operação de adição com sintaxe
2 + 7
que adiciona números como de costume.
No contexto da linguagem A, a +
notação é açúcar sintático (é uma notação alternativa, simplificada e ad-hoc que pode ser usada no lugar da sum [...]
notação). Da mesma forma, como foi apontado na resposta de Hoa Long Tam, em C a notação p->field
é para açúcar sintático (*p).field
.
No contexto da linguagem B, a +
notação não é um açúcar sintático (é a única sintaxe válida usada para a operação de soma). Da mesma forma, se C pudesse acessar apenas os membros da estrutura por meio de ponteiros e se não tivesse a notação (*p).field
, a notação p->field
não seria açúcar sintático.
Na minha opinião, existem alguns mal-entendidos sobre o açúcar sintático que podem ser rastreados até uma confusão em relação à semântica da linguagem de programação. O raciocínio é assim:
- A semântica de um programa é o que um programa calcula.
- O poder expressivo de uma linguagem de programação é representado pelos cálculos que podem ser descritos nessa linguagem.
- Duas linguagens de programação que podem descrever todas as funções computáveis (conforme definidas usando máquinas de Turing) têm a mesma potência expressiva ...
- ... e, portanto, diferem apenas na sintaxe.
- Corolário: qualquer extensão de um idioma completo de Turing é apenas sintaxe (açúcar sintático) porque você não altera o poder expressivo do idioma.
A linha de raciocínio acima leva a afirmações genéricas como "o açúcar sintático não pode ser definido adequadamente", é uma "questão de gosto" ou "todo recurso de linguagem de programação é, afinal, apenas açúcar sintático".
Eu acho que o principal problema no argumento acima é que a semântica não é apenas sobre o que pode ser calculado por um programa, mas também sobre como ele é calculado , ou seja, quais construções primitivas são usadas e como elas são combinadas.
Assim, por exemplo, os objetos não são um açúcar sintático para as configurações e transformações de bits subjacentes, são uma construção que permite modelar dados e operações e descrever cálculos. Computar com objetos, métodos, chamadas de método não é o mesmo que computar com bytes, registradores de processador, endereços de memória (mesmo que os dois cálculos tenham o mesmo resultado e mesmo que o segundo cálculo seja usado para implementar o primeiro).
Fiz essa descrição um pouco longo, mas acho que é um aspecto importante que não vi abordado em outras respostas.
Conclusão: o açúcar sintático é uma sintaxe alternativa (possivelmente mais conveniente) para uma construção que já está em um idioma e que já possui uma sintaxe e semântica bem definidas. A nova sintaxe (açúcar sintático) difere da existente, mas tem a mesma semântica . Se você introduzir uma nova construção em um idioma e uma nova sintaxe para ele, não terá açúcar sintático.