Penso che il termine zucchero sintattico indichi una sintassi alternativa per esprimere la stessa semantica sottostante.
Prendiamo ad esempio un linguaggio di programmazione A che ha un'operazione sum
che può sommare un elenco di numeri interi di lunghezza arbitraria. In questa lingua possiamo scrivere le espressioni
sum []
sum [3, 4, 5, 1]
sum [2, 7]
i cui risultati sono 0, 13 e 9, rispettivamente.
Supponiamo ora di renderci conto che il 90% delle volte che usiamo sum
con due argomenti e quindi introduciamo, per comodità, la nuova notazione
2 + 7
che è solo zucchero sintattico per sum [2, 7]
.
Ora prendi una seconda lingua B che non ha alcuna operazione di aggiunta. Potremmo avere operatori come <
, =
che ci permettono di confrontare i numeri, ma non c'è modo di aggiungere numeri. Nella versione 2 del linguaggio B, introduciamo una nuova operazione di aggiunta con la sintassi
2 + 7
che aggiunge numeri come al solito.
Nel contesto del linguaggio A, la +
notazione è zucchero sintattico (è una notazione alternativa, semplificata e ad hoc che può essere utilizzata al posto della sum [...]
notazione). Allo stesso modo, come è stato sottolineato nella risposta di Hoa Long Tam, in C la notazione p->field
è zucchero sintattico per (*p).field
.
Nel contesto del linguaggio B, la +
notazione non è zucchero sintattico (è l'unica sintassi valida utilizzata per l'operazione di somma). Allo stesso modo, se C potesse accedere ai membri di struct solo tramite puntatori e se non avesse la notazione (*p).field
, allora la notazione p->field
non sarebbe zucchero sintattico.
A mio avviso, ci sono alcuni malintesi sullo zucchero sintattico che possono essere ricondotti a una confusione riguardo alla semantica del linguaggio di programmazione. Il ragionamento va così:
- La semantica di un programma è ciò che calcola un programma.
- Il potere espressivo di un linguaggio di programmazione è rappresentato dai calcoli che possono essere descritti in quel linguaggio.
- Due linguaggi di programmazione in grado di descrivere tutte le funzioni calcolabili (come definite utilizzando le macchine di Turing) hanno lo stesso potere espressivo ...
- ... e quindi differiscono solo nella sintassi.
- Corollario: qualsiasi estensione di una lingua completa di Turing è solo sintassi (zucchero sintattico) perché non si modifica il potere espressivo della lingua.
La suddetta linea di ragionamento porta a affermazioni generiche come "lo zucchero sintattico non può essere definito correttamente", è una "questione di gusti" o "ogni caratteristica del linguaggio di programmazione è, dopotutto, solo zucchero sintattico".
Penso che il problema principale nell'argomento precedente sia che la semantica non riguarda solo ciò che può essere calcolato da un programma, ma anche il modo in cui viene calcolato , ovvero quali costrutti primitivi vengono utilizzati e come vengono combinati.
Quindi, ad esempio, gli oggetti non sono zucchero sintattico per le configurazioni e trasformazioni di bit sottostanti, sono un costrutto che consente di modellare dati e operazioni e di descrivere calcoli. Il calcolo con oggetti, metodi, chiamate di metodo non è uguale al calcolo con byte, registri del processore, indirizzi di memoria (anche se i due calcoli hanno lo stesso risultato e anche se il secondo calcolo viene utilizzato per implementare il primo).
Ho reso questa descrizione un po 'lunga ma penso che sia un aspetto importante che non ho visto affrontato in altre risposte.
In conclusione: lo zucchero sintattico è una sintassi alternativa (forse più conveniente) per un costrutto che è già in una lingua e ha già una sintassi e una semantica ben definite. La nuova sintassi (zucchero sintattico) differisce da quella esistente ma ha la stessa semantica . Se si introduce un nuovo costrutto in una lingua e una nuova sintassi, non si ha zucchero sintattico.