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 una lista 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.
Ora, supponiamo che realizziamo che il 90% delle volte 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 abbia l'operazione di aggiunta no di sorta. Potremmo avere operatori come <
, =
, che ci consente di confrontare i numeri, ma non c'è modo di aggiungere numeri. Nella versione 2 della lingua B, introduciamo una nuova operazione aggiunta con sintassi
2 + 7
che aggiunge i 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 notazione sum [...]
). 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 somma). Allo stesso modo, se C potesse accedere solo ai membri della struct attraverso i puntatori e se non avesse la notazione (*p).field
, la notazione p->field
non sarebbe zucchero sintattico.
Secondo me, ci sono alcuni equivoci sullo zucchero sintattico che possono essere ricondotti a una confusione riguardante la semantica del linguaggio di programmazione. Il ragionamento va così:
- La semantica di un programma è ciò che un programma calcola.
- Il potere espressivo di un linguaggio di programmazione è rappresentato dai calcoli che possono essere descritti in quella lingua.
- Due linguaggi di programmazione in grado di descrivere tutte le funzioni computabili (come definite utilizzando le macchine di Turing) hanno la stessa potenza espressiva ...
- ... e quindi differiscono solo per la sintassi.
- Corollario: qualsiasi estensione di una lingua completa di Turing è solo sintassi (zucchero sintattico) perché non si modifica la potenza espressiva della lingua.
La suddetta linea di ragionamento porta a affermazioni generiche come "lo zucchero sintattico non può essere definito correttamente", è una "questione di gusto", o "ogni caratteristica del linguaggio di programmazione è, dopo tutto, solo zucchero sintattico".
Penso che il problema principale nell'argomento sopra sia che la semantica non riguarda solo ciò che può essere calcolato da un programma, ma anche come è calcolato , cioè quali costrutti primitivi sono usati e come sono combinati.
Quindi, ad esempio, oggetti non sono zucchero sintattico per le configurazioni di bit 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 equivale 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 indirizzato in altre risposte.
Bottom line: lo zucchero sintattico è una sintassi alternativa (possibilmente 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 per esso, allora non si dispone di zucchero sintattico.