Myślę, że termin cukier składniowy wskazuje na alternatywną składnię wyrażającą tę samą podstawową semantykę.
Weźmy na przykład język programowania A, który ma operację, sum
która może dodać listę liczb całkowitych o dowolnej długości. W tym języku możemy pisać wyrażenia
sum []
sum [3, 4, 5, 1]
sum [2, 7]
których wyniki wynoszą odpowiednio 0, 13 i 9.
Załóżmy teraz, że zdajemy sobie sprawę, że 90% razy używamy sum
z dwoma argumentami i dlatego wprowadzamy dla wygody nową notację
2 + 7
który jest po prostu cukier syntaktyczny dla sum [2, 7]
.
Teraz weź drugi język B, który nie ma żadnej operacji dodawania. Możemy mieć operatorów takich jak <
, =
co pozwala nam porównywać liczby, ale nie ma możliwości dodawania liczb. W wersji 2 języka B wprowadzamy nową operację dodawania ze składnią
2 + 7
co dodaje liczby jak zwykle.
W kontekście języka A +
notacja jest cukrem syntaktycznym (jest to alternatywna, uproszczona i ad hoc notacja, której można użyć zamiast sum [...]
notacji). Podobnie, jak wskazano w odpowiedzi Hoa Long Tam, w C notacja p->field
jest cukrem syntaktycznym (*p).field
.
W kontekście języka B +
notacja nie jest cukrem składniowym (jest to jedyna poprawna składnia używana do operacji sumowania). Podobnie, gdyby C mógł uzyskać dostęp do elementów strukturalnych tylko za pomocą wskaźników i gdyby nie miał notacji (*p).field
, notacja p->field
nie byłaby cukrem syntaktycznym.
Moim zdaniem istnieją pewne nieporozumienia dotyczące cukru syntaktycznego, które można prześledzić w zamieszaniu dotyczącym semantyki języka programowania. Rozumowanie wygląda następująco:
- Semantyka programu jest tym, co program oblicza.
- Moc ekspresyjna języka programowania jest reprezentowana przez obliczenia, które można opisać w tym języku.
- Dwa języki programowania, które mogą opisywać wszystkie funkcje obliczeniowe (zdefiniowane za pomocą maszyn Turinga) mają tę samą moc ekspresji ...
- ... i dlatego różnią się tylko składnią.
- Następstwo: każde rozszerzenie języka pełnego Turinga jest tylko składnią (cukier składniowy), ponieważ nie zmieniasz mocy ekspresyjnej języka.
Powyższa linia rozumowania prowadzi do ogólnych stwierdzeń, takich jak: „cukier syntaktyczny nie może być właściwie zdefiniowany”, jest to „kwestia gustu” lub „każda cecha języka programowania jest przecież tylko cukrem syntaktycznym”.
Myślę, że głównym problemem w powyższym argumencie jest to, że semantyka dotyczy nie tylko tego, co może być obliczone przez program, ale także tego, w jaki sposób jest on obliczany , tj. Jakie prymitywne konstrukcje są używane i jak są łączone.
Na przykład obiekty nie są cukrem syntaktycznym dla podstawowych konfiguracji bitów i transformacji bitów, są konstrukcją, która pozwala modelować dane i operacje oraz opisywać obliczenia. Obliczanie za pomocą obiektów, metod, wywołań metod nie jest tym samym, co obliczanie za pomocą bajtów, rejestrów procesora, adresów pamięci (nawet jeśli dwa obliczenia mają ten sam wynik, a nawet jeśli drugie obliczenie jest używane do implementacji pierwszego).
Uczyniłem ten opis nieco długim, ale myślę, że jest to ważny aspekt, którego nie widziałem w innych odpowiedziach.
Konkluzja: cukier składniowy jest alternatywną (być może wygodniejszą) składnią dla konstruktu, który jest już w języku i ma już dobrze zdefiniowaną składnię i semantykę. Nowa składnia (cukier składniowy) różni się od istniejącej, ale ma tę samą semantykę . Jeśli wprowadzisz nowy konstrukt w języku i nową składnię, nie będziesz miał cukru syntaktycznego.