Jaka jest różnica między „Syntax” a „Syntactic Sugar”

45

tło

Strona Wikipedii na temat cukru syntaktycznego zawiera :

W informatyce cukier syntaktyczny jest składnią w języku programowania, który ma na celu ułatwienie czytania lub wyrażania. Dzięki temu język jest „słodszy” dla ludzi: rzeczy można wyrazić jaśniej, bardziej zwięźle lub w alternatywnym stylu, który niektórzy mogą preferować.

Naprawdę nie rozumiem, jaka jest różnica między Syntactic Sugar a Syntax.

Doceniam fakt, że wersja słodka może być jaśniejsza, bardziej zwięzła, być może sprowadzona z jakiegoś bojlera. Ale wydaje mi się, że na pewnym poziomie cała składnia zasadniczo robi to, aby stworzyć abstrakcję tego, do czego kod zostaje skompilowany.

Z tej samej strony w Wikipedii:

Procesory językowe, w tym kompilatory, analizatory statyczne i tym podobne, często przetwarzają konstrukcje cukrowe w bardziej podstawowe konstrukcje przed przetwarzaniem, proces czasami nazywany „desugowaniem”.

Jako ćwiczenie myślowe, jeśli „często” w tym stwierdzeniu oznacza „zawsze”: Jeśli różnica polega tylko na tym, czy kompilator „odsyła” składnię przed przejściem do następnego etapu, w jaki sposób programista, który nie zna wewnętrznych kompilatora wie (lub obchodzi), co to jest Sugar'd Składnia, czy nie?

Bardzo powiązane pytanie na tej stronie „Rygorystyczna definicja cukru syntaktycznego?” ma odpowiedź, która rozpoczyna się:

IMHO Nie wydaje mi się, aby można było zdefiniować cukier syntaktyczny, ponieważ wyrażenie to jest BS i prawdopodobnie będzie używane przez osoby, które mówią o „prawdziwych programistach” używających „prawdziwych narzędzi” w „prawdziwych systemach operacyjnych”

Co może mi wskazywać, że być może programista używający języka nie ma dużej różnicy? Być może różnica jest zauważalna tylko dla autora kompilatora? Chociaż mogą zdarzyć się sytuacje, w których programista korzystający z języka może wiedzieć, co kryje się pod maską cukru syntaktycznego? (Ale może w rzeczywistości w jakimkolwiek dyskursie na ten temat używa się tego terminu jako przynęty na płomienie?)

Sedno pytania

Więc ... krótka wersja pytania:

  • Czy istnieje prawdziwa różnica między składnią a cukrem syntaktycznym?
  • Dla kogo to ma znaczenie?

Dodatkowe jedzenie do przemyślenia

Premia za sprzeczność tematu:

Na stronie Wikipedii podano przykład:

Na przykład w języku C a[i]notacja oznacza cukier składniowy*(a + i)

Podczas gdy inna odpowiedź na powyższe powiązane pytanie mówi o tym samym przykładzie:

Teraz zastanów się a[i] == *(a + i). Pomyśl o dowolnym programie C, który używa tablic w jakikolwiek istotny sposób.

I podsumowuje, że:

[]Notacja ułatwia tę abstrakcję. To nie jest cukier składniowy.

Przeciwny wniosek dla tego samego przykładu!

Don Vince
źródło
9
W mojej odpowiedzi na cytowane pytanie wyjaśniam, że cukier składniowy jest składnią alternatywną (do jakiejś składni, która już istnieje w języku), która ułatwia wyrażanie niektórych typowych idiomów, ale nie wprowadza nowej semantyki. W tym sensie cukier składniowy zależy od kontekstu (od języka, w którym jest używany): ta sama notacja może być normalną składnią w jednym języku, a cukier składniowy w innym języku. Czy to wyjaśnienie ci pomaga?
Giorgio
7
Jednym z problemów jest to, że niektórzy ludzie uważają, że „cukier syntaktyczny” jest nieprzyzwoitym słowem, kiedy tak nie jest. Każdą funkcję lub klasę dodaną do systemu można uznać za „cukier syntaktyczny”, ponieważ ułatwiają wyrażanie pomysłów, które były już wyraźnie wyrażone w języku nieco (lub dużo).
Joris Timmermans
Najwyraźniej ma to dla ciebie znaczenie.
SShaheen,
11
Ostatecznie wszystko to tylko cukier syntetyczny zamiast elektryczności.
Anthony Pegram,

Odpowiedzi:

34

Główną różnicą jest to, że składnia to gramatyka zdefiniowana w języku, aby umożliwić ujawnienie niektórych funkcji. Gdy tylko uzyskasz dostęp do tej funkcji, każda inna składnia, która pozwala ci robić to samo, jest uważana za cukier. To oczywiście prowadzi do nieparzystych scenariuszy dotyczących tego, która z dwóch składni jest cukrem, zwłaszcza że nie zawsze jest jasne, co było pierwsze.

W praktyce cukier syntaktyczny jest używany tylko do opisania składni dodanej do języka w celu ułatwienia korzystania z niego, na przykład tworzenia lhs + rhsmapy infix lhs.Add(rhs). Uważam, że indeksowanie tablicy C jest cukrem syntaktycznym.

Ma to znaczenie przede wszystkim dlatego, że eleganckie wzory zwykle ograniczają ilość powielania. Potrzebujący (a przynajmniej chcący) cukier składniowy jest przez niektórych postrzegany jako oznaka niepowodzenia projektu.

Telastyn
źródło
„Gdy tylko uzyskasz dostęp do tej funkcji, każda inna składnia, która pozwala ci robić to samo, jest uważana za cukier.”: Nie wystarczy mieć cukier syntaktyczny, ponieważ wówczas każdy inny program, który oblicza tę samą funkcję, byłby cukrem syntaktycznym . Program słodzony i program bez cukru muszą mieć tę samą semantykę .
Giorgio
3
@Giorgio W jaki sposób „te dwa programy obliczają tę samą funkcję” różne od „te dwa programy mają tę samą semantykę”? Poza tym skupiasz się na programach, a nie na elementach składniowych. Całe programy nie mogą być cukrem składniowym. Operator, rodzaj stwierdzenia itp. Może być cukrem syntaktycznym.
@Giorgio - Rzeczywiście, rozważam podobną funkcjonalność z inną semantyką jako inną funkcjonalność. I tak, może być skakanie do obręczy, jak pisanie własnego kompilatora, który ma taką samą semantykę i nazywanie tego „cukrem”. Szczerze mówiąc, nie będzie formalnej definicji tak nieformalnej koncepcji.
Telastyn
1
@Giorgio Znowu moja wołowina nie jest zgodna z twoim podejściem do równoważności, ale próbujesz zastosować koncepcję cukru syntaktycznego w programach. Termin nie dotyczy całych programów! W zależności od twojej definicji są to albo atomowe bloki budulcowe, albo tylko krótkie fragmenty programu (pierwszy wydaje się obejmować> 80%, ale nie jestem pewien, czy obejmuje wszystko, co powszechnie uważa się za cukier syntaktyczny).
3
@Giorgio Na przykład całe programy ;-) Lub coś wystarczająco dużego, aby oba sformułowania zawierały kilka niepowiązanych słów kluczowych w języku. Coś, co nigdy nie byłem traktowany jak cukier składniowej jest if (a) return blah; ...kontra result_type res; if (a) res = blah; else {...}; return res;. Musiałbyś założyć określone języki i uzyskać niezwykle prawnika językowego (często do niewielkiej semantyki operacyjnej), aby znaleźć różnicę między tymi programami.
10

Składnia jest tym, czego używa procesor języka, aby zrozumieć, co oznaczają konstrukcje języka. Konstrukty uważane za cukier syntaktyczny również muszą być interpretowane przez procesor językowy, a zatem są częścią składni językowej.

To, co odróżnia cukier syntaktyczny od reszty składni języka, polega na tym, że możliwe byłoby usunięcie cukru syntaktycznego z języka bez wpływu na programy, które można pisać w tym języku.

Chciałbym powiedzieć, że aby podać bardziej formalistyczną definicję

Cukier syntaktyczny to te części składni języka, których efekty są zdefiniowane przez inne konstrukcje składniowe w języku.

Nie ma to w żaden sposób na celu oczerniania cukru syntaktycznego ani języków, które go mają, ponieważ użycie cukru syntaktycznego często prowadzi do programów, których intencje są bardziej zrozumiałe.

Bart van Ingen Schenau
źródło
„Nie ma sposobu, aby definitywnie powiedzieć„ to jest cukier składniowy i to jest składnia ”, ponieważ cukier składniowy jest częścią składni języka.”: False. Jest to projektant języka, który wprowadza pewną składnię jako cukier syntaktyczny dla jakiegoś konstruktu, który jest już w języku i ma składnię. Cukier syntaktyczny jest zwykle ad-hoc (mniej ogólny), ale bardziej czytelny / wygodny w użyciu.
Giorgio
@Giorgio: Przeredagowałem mój pierwszy akapit, ponieważ był on nieco niezręczny. Ale nie zgadzam się, że cukier syntaktyczny zwykle dodaje się ad hoc. Najbardziej znanym kawałkiem cukru syntaktycznego jest prawdopodobnie ->operator C i nie rozumiem, jak ten operator jest mniej ogólny niż jakikolwiek inny.
Bart van Ingen Schenau,
1
@Giorgio: W takim przypadku wszystko, co nie jest mapowane bezpośrednio do pojedynczej instrukcji asemblera, powinno być traktowane jako cukier składniowy, ponieważ zawsze można je podzielić na prostsze części (w tym funkcje). Nie sądzę, że wielu ludzi podziela ten pogląd.
Bart van Ingen Schenau,
1
„Ad-hoc” oznacza, że ​​jest używany w specjalnej, ograniczonej sytuacji. Termin ten nie ma ogólnie negatywnej konotacji. Termin rozwiązanie ad-hoc ma negatywną konotację, ponieważ zwykle chce się rozwiązań ogólnych, a nie konkretnych (aby uniknąć wielokrotnego rozwiązywania podobnych problemów).
Giorgio
1
Ponieważ „rozwiązania ad-hoc” są często złe, może się wydawać, że samo „ad-hoc” oznacza złe. Ale jest też „polimorfizm ad-hoc” przeciążający funkcję AKA ( en.wikipedia.org/wiki/Ad_hoc_polymorphism ), co nie jest złe. Przynajmniej w języku włoskim (moim języku ojczystym) użycie łacińskiego słowa „ad-hoc” samo w sobie nie jest negatywne. Jeśli ma to negatywne znaczenie w języku angielskim, to wybacz moją ignorancję.
Giorgio
6

Inne odpowiedzi nie wspominały o kluczowej koncepcji: abstrakcyjna składnia ; bez niego termin „cukier syntaktyczny” nie ma żadnego sensu.

Składnia abstrakcyjna określa elementy i strukturę języków oraz sposób łączenia fraz tego języka w celu tworzenia większych fraz. Składnia abstrakcyjna jest niezależna od konkretnej. Termin „cukier syntaktyczny”, jak rozumiem, odnosi się do konkretnej składni.

Ogólnie rzecz biorąc, projektując język, będziesz chciał stworzyć konkretną składnię dla każdego terminu składni abstrakcyjnej, aby ludzie mogli pisać kod w twoim języku za pomocą zwykłego tekstu.

Powiedzmy teraz, że tworzysz niezręczną konkretną składnię dla foo . Użytkownicy narzekają, a Ty wdrażasz nową konkretną składnię, która reprezentuje tę samą abstrakcyjną składnię . W rezultacie twoja abstrakcyjna składnia i semantyka się nie zmieniły, ale teraz masz dwie konkretne składnie dla tego samego terminu składni abstrakcyjnej.

Wierzę, że to właśnie ludzie mają na myśli, mówiąc „cukier składniowy” - zmiany, które wpływają tylko na konkretną składnię, ale które nie wpływają na składnię abstrakcyjną ani semantykę.

Różnica między „cukrem syntaktycznym” a „konkretną składnią” jest teraz wyraźna. Dla mnie. :)

Ta interpretacja pomaga również wyjaśnić, co mógł oznaczać Alan Perlis, gdy powiedział: „cukier syntaktyczny powoduje raka średnika”: cały konkretny cukier syntaktyczny na świecie nie może naprawić słabej abstrakcyjnej składni, a cały wysiłek włożony w dodanie cukru wysiłek, którego nie spędzasz, zajmując się prawdziwym problemem - abstrakcyjną składnią.


Powinienem również zauważyć, że to wyłącznie moja opinia; Wierzę w to tylko dlatego, że jest to jedyna taka interpretacja, która ma dla mnie sens.


źródło
1
Myślałem również o porównaniu abstrakcyjnym z konkretną składnią, ale nie jestem pewien, czy to zawsze wyjaśnia cukier składniowy. Np w C, biorąc pod uwagę wskaźnik pdo struktury zawierającej pola x, czy wyrażenia (*p).xi p->xmają taką samą składnię abstrakcyjne? Myślę jednak, że byłoby wspaniale, gdyby wszystko sprowadzało się do abstrakcji kontra konkretnej składni.
Giorgio
@Giorgio niestety nie znam wystarczającej ilości C, aby śmiało stwierdzić, czy któryś z nich jest cukrem syntaktycznym dla drugiego, lub jak wyglądałyby ich abstrakcyjne drzewa składniowe. Lub nawet jeśli specyfikacja C faktycznie definiuje abstrakcyjną składnię. :(
1
Pierwsze wyrażenie można przeanalizować jako drzewo z .rdzeniem. Lewym podwęzłem katalogu głównego jest a *, a jego dzieckiem jest p. Prawym podwęzłem katalogu głównego jest x. W przypadku drugiego wyrażenia abstrakcyjne drzewo składniowe ma ->katalog główny, a katalog główny ma dwoje dzieci pi x. Próbuję dowiedzieć się, czy sensowne jest parsowanie obu wyrażeń inaczej, aby miały to samo abstrakcyjne drzewo składniowe, ale nie widzę tego w tej chwili.
Giorgio
3
Nie sądzę, aby to drzewo parsowania, choć często opisywane jako AST, było takie samo, jak abstrakcyjna składnia, o której mówi Matt. Oba wyrażenia mają identyczną akcję ( przekonwertuj typ wskaźnika na typ referencyjny, a następnie uzyskaj referencję do elementu członkowskiegox )
Bezużyteczne
1
„Oba wyrażenia mają identyczną akcję (przekonwertuj typ wskaźnika na typ referencyjny, a następnie uzyskaj referencję do elementu x)”: To jest semantyka, a nie abstrakcyjna składnia. Składnia abstrakcyjna odnosi się do pomijania niepotrzebnych szczegółów konkretnej składni (jak (lub ;) w celu stworzenia drzewa, które odzwierciedla faktyczną strukturę programu (patrz en.wikipedia.org/wiki/Abstract_syntax_tree ). Jednak w abstrakcyjnej składni nic nie mówi się (jeszcze) o semantyce programu.
Giorgio
4

Cukier syntaktyczny jest podzbiorem składni języków. Podstawową ideą jest to, że istnieje więcej niż jeden sposób, aby powiedzieć to samo.

Co sprawia, że trudno powiedzieć, które elementy są cukier syntaktyczny i które kawałki są „czyste składnia” to stwierdzenia jak „trudno powiedzieć, która forma przyszedł pierwszy” lub „trudno jest wiedzieć, w którą stronę ma autor języka” lub „to nieco arbitralne, aby zdecydować, która forma jest prostsza ".

To, co ułatwia wybór, które utwory są czyste lub słodkie, polega na zadaniu pytania w ramach konkretnego kompilatora lub tłumacza. Czysta składnia to rzeczy, które kompilator konwertuje bezpośrednio na kod maszynowy lub na które interpreter bezpośrednio odpowiada. Cukier jest materiałem, który najpierw zamienia się w kilka innych składni zanim te bezpośrednie rzeczy się zdarzą. W zależności od implementacji może to być lub nie takie samo, jak zamierzenie autora, a nawet to, co twierdzi specyfikacja językowa.

W praktyce decyduje się w ten sposób o rzeczywistości.

Jeff Wolski
źródło
Ta odpowiedź błędnie łączy implementację składni z tym, czy jest to cukier, czy nie. Nigdy nie widziałem argumentów = o tym, czy elementem języka jest „cukier”, czy nie, to dotyczy samego sposobu implementacji tego elementu. Chodzi tylko o to, czy pod względem składniowym powiela inny, brzydszy element.
GreenAsJade
3

Naprawdę, twój pierwszy cytat z Wikipedii mówi, że wszystko „… ułatwia czytanie…”, „… słodsze dla ludzi w użyciu…”.

Na piśmie skrócone formy, takie jak „nie” lub „nie”, można uznać za cukier składniowy.

ozz
źródło
Zastanów się (1) „Powinienem iść teraz” kontra (2) „Powinienem iść teraz”: Czy (1) cukier syntaktyczny dla (2)?
Giorgio
1
@Giorgio powiedziałbym, że nie.
ozz
Ze względu na czytelność („powinien” nie jest bardziej czytelny niż „powinien”) lub ze względu na znaczenie („powinien” i „powinien” mieć inne znaczenie).
Giorgio
@Giorgio fair fair :)
ozz
1
Ach, rozumiem :) wydaje mi się, że mam wrażenie z jelit, chyba nie jeden jest bardziej czytelny niż drugi w tym przykładzie
ozz
3

Zwykle cukier składniowy jest częścią języka, którą można wyrazić przez istniejącą część języka (składnię) bez utraty ogólności, ale z możliwą utratą jasności. Czasami kompilatory mają wyraźny krok usuwania, który przekształca AST utworzony przez kod źródłowy i stosują proste kroki, aby usunąć węzły odpowiadające cukrowi.

Na przykład Haskell ma cukier składniowy dla monad z rekurencyjnie stosowanymi zasadami

do { f }            ~> f
do { g; h }         ~> g >> do h
do { x <- f; h }    ~> f >>= \x -> do h
do { let x = f; h } ~> let x = f in do h

W tej chwili nie ma znaczenia, co to dokładnie znaczy - jednak można zauważyć, że specjalna składnia w LHS może zostać przekształcona w coś bardziej podstawowego w RHS (mianowicie aplikacje funkcyjne, lambda i lets). Te kroki pozwalają zachować najlepsze cechy obu światów:

  1. Składnia na LHS jest łatwiejsza dla programisty (cukier składniowy) wyrażania istniejących pomysłów w bardziej przejrzysty sposób
  2. Ponieważ jednak obsługa kompilatora dla konstruktów RHS istnieje już w kompilatorze, nie trzeba go traktować jako czegoś specjalnego poza parserem i desagnerem (z wyjątkiem raportowania błędów).

Podobnie w C można sobie wyobrazić wyłączenie reguły przepisywania (z powodu przeciążenia operatora itp. Nie jest to prawdą w przypadku C ++):

f->h ~> (*f).h
f[h] ~> *(f + h)

Można sobie wyobrazić pisanie wszystkich programów bez użycia ->lub []w C, które używają dziś tej konstrukcji. Jednak programiści byliby trudniej go używać, dlatego podali cukier składniowy (wydaje mi się, że w latach 70. może to uprościć także pracę kompilatorów). Jest to prawdopodobnie mniej jasne, ponieważ można technicznie dodać następującą, całkowicie poprawną regułę przepisywania:

*f ~> f[0] -- * and [] have the same expressiveness 

Czy cukier składniowy jest zły? Niekoniecznie - istnieje niebezpieczeństwo, że zostanie on wykorzystany jako kult ładunku bez głębszego zrozumienia. Na przykład następujące funkcje są równoważne w Haskell, ale wielu początkujących napisałoby pierwszą formę, nie rozumiejąc, że nadużywają cukru składniowego:

f1 = do x <- doSomething
        return x
f2 = doSomething

Ponadto cukier składniowy może nadmiernie komplikować język lub być zbyt wąski, aby umożliwić uogólniony kod idiomatyczny. Może to również oznaczać, że język nie jest wystarczająco potężny, aby łatwo wykonywać określone czynności - może być zaprojektowany (nie dawaj programistom ostrych narzędzi lub bardzo specyficznego języka niszowego, że dodanie bardziej rozbudowanej konstrukcji zaszkodziłoby innym celom) lub przez pominięcie - ten drugi forma nadała cukierowi składniemu złą nazwę. Jeśli język jest wystarczająco potężny, aby używać innych konstrukcji bez dodawania cukru składniowego, uważa się, że bardziej eleganckie jest ich stosowanie.

Maciej Piechotka
źródło
3

Myślę, że najbardziej oczywistym przykładem byłaby składnia „+ =” w C.

i = i + 1;

i

 i +=  1;

wykonaj dokładnie to samo i skompiluj dokładnie do tego samego zestawu instrukcji maszynowych. Druga forma pozwala zaoszczędzić na wpisywaniu kilku znaków, ale co ważniejsze, bardzo wyraźnie widać, że modyfikujesz wartość na podstawie jej bieżącej wartości.

Jako przykład kanoniczny zamierzałem zacytować operatora post / prefiksu „++”, ale zdałem sobie sprawę, że to coś więcej niż cukier syntaktyczny. Nie ma możliwości wyrażenia różnicy między ++ i i ++ w jednym wyrażeniu przy użyciu i = i + 1składni.

James Anderson
źródło
+ = może się przydać w takich przypadkach a[f(x)] += 1.
Florian F
1

Najpierw zajmę się niektórymi innymi odpowiedziami konkretnym przykładem. Oparty na zakresie C ++ 11 for for loop (podobnie jak foreach loop w różnych innych językach)

for (auto value : container) {
    do_something_with(value);
}

jest dokładnie równoważny (tj. wersja cukrowa)

for (auto iterator = begin(container); iterator != end(container); ++iterator) {
    do_something_with(*iterator);
}

Teraz, mimo że nie dodaje żadnej nowej abstrakcyjnej składni ani semantyki do języka, ma on prawdziwą użyteczność.

Pierwsza wersja wyraźnie określa cel (odwiedzenie każdego elementu w kontenerze). Zapobiega to również nietypowym zachowaniom, takim jak modyfikowanie pojemnika podczas przechodzenia, dalsze przemieszczanie się iteratorw korpusie pętli lub subtelne nieprawidłowe warunki pętli. Pozwala to uniknąć możliwych źródeł błędów, a tym samym zmniejsza trudność czytania i rozumowania na temat kodu.

Na przykład błąd jednoznakowy w drugiej wersji:

for (auto iterator = begin(container); iterator <= end(container); ++iterator) {
    do_something_with(*iterator);
}

powoduje błąd „jeden po drugim” i niezdefiniowane zachowanie.

Tak więc wersja słodzona jest przydatna właśnie dlatego, że jest bardziej restrykcyjna, a zatem łatwiejsza do zaufania i zrozumienia.


Po drugie, do pierwotnego pytania:

Czy istnieje prawdziwa różnica między składnią a cukrem syntaktycznym?

Nie, „cukier syntaktyczny” to (konkretna) składnia języka, uważana za „cukier”, ponieważ nie rozszerza składni abstrakcyjnej ani podstawowej funkcjonalności języka. Podoba mi się odpowiedź Matta Fenwicka na ten temat.

Dla kogo to ma znaczenie?

Ma to znaczenie dla użytkowników tego języka, podobnie jak każdej innej składni, i dlatego cukier zapewnia wsparcie (iw pewnym sensie błogosławi) określonym idiomom.

Wreszcie na pytanie bonusowe

Notacja [] ułatwia tę abstrakcję.

brzmi to bardzo podobnie do definicji cukru syntaktycznego: obsługuje (i zapewnia błogosławieństwo dla autorów języka) za pomocą wskaźników jako tablic. p[i]Forma nie jest tak naprawdę bardziej restrykcyjne niż *(p+i), więc jedyną różnicą jest jasne przekazywanie intencji (i niewielki przyrost czytelność).

Nieprzydatny
źródło
Najpierw powiesz „[zakres oparty na pętli] jest dokładnie równoważny (tj. Wersji cukrowej) [czegoś innego]”. Ale potem mówisz, że jest inaczej, ponieważ zabrania modyfikowania kontenera podczas przechodzenia ... i istnieją inne różnice, które czynią go czymś więcej niż prostą transformacją składniową, którą opisałeś (np. Zachowanie, gdy „kontener” jest tymczasowy). Różnice te sugerują, że to nie tylko cukier syntaktyczny, prawda? Wydaje mi się więc, że może nie jest to dobry przykład cukru syntaktycznego.
Don Hatch
Nie powiedziałem, że jest to odpowiednik jakiejś ogólnej pętli , powiedziałem, że jest to odpowiednik konkretnej podanej pętli. Specyficzny pętla nie zmienia zbiornik i reprezentuje bardzo często idiom - ale trzeba jeszcze czytać każde ogólne pętlę dokładnie powiedzieć, czy to w wyniku tej wspólnej idiom, czy coś niezwykłego czai się w ciele pętli. Nowszą pętlą jest cukier dla tego wspólnego idiomu , ponieważ jest on mniej gadatliwy i wyraźniej komunikuje używany idiom. To nie jest, i nigdy nie twierdziłem, że tak, to cukier dla ogólnej idei pętli.
Bezużyteczne
0

Niezależnie od pierwotnego znaczenia tego wyrażenia, obecnie jest on przede wszystkim pejoratywny, prawie zawsze wyrażony jako „tylko” lub „tylko” cukier składniowy. Ma to znaczenie tylko dla programistów, którzy lubią robić rzeczy w nieczytelny sposób i chcą zwięzłego sposobu na uzasadnienie tego swoim kolegom. Definicja tych, którzy dziś używają tego terminu, z ich punktu widzenia, mogłaby wyglądać następująco:

Składnia, która jest zbędna z innymi, bardziej powszechnie stosowanymi składniami, aby zapewnić wsparcie dla programistów, którzy tak naprawdę nie rozumieją języka.

Dlatego otrzymujesz dwa przeciwne wnioski dla tego samego elementu składniowego. Pierwszym przykładem notacji tablicowej jest użycie oryginalnego pozytywnego znaczenia tego terminu, coś podobnego do odpowiedzi Barta. Drugim przykładem jest obrona notacji tablicowej przed zarzutem bycia cukrem syntaktycznym w sensie pejoratywnym. Innymi słowy, argumentuje, że składnia jest użyteczną abstrakcją, a nie kulą.

Karl Bielefeldt
źródło
Myślę, że pejoratywne znaczenie tego terminu („to tylko cukier syntaktyczny”) wynika z faktu, że cukier syntaktyczny nie dodaje żadnych informacji.
Giorgio
1
Może pochodzić z pomysłu, że składnia nie dodaje żadnych informacji , ale ten pomysł nie jest faktem. Informacje o zamiarze (na przykład użycie dobrze znanego idiomu) są nadal informacjami.
Bezużyteczne
@Useless: Przez informację rozumiałem, że program zachowuje się tak samo z cukrem syntaktycznym lub bez niego. Oczywiście może być bardziej czytelny dzięki cukierowi syntaktycznemu (dodaje czytelnikowi informacje / dokumentację), co jest zaletą.
Giorgio
Podrobiony. Cukier syntaktyczny nie jest pejoratywny. Każdy programista wart swojej soli stworzy biblioteki, które zawierają i upraszczają bardziej złożone zadania, zamiast kopiować i wklejać ten sam kod w dowolnym miejscu. Prowadzi to do lepszego zachowania, łatwiejszego w utrzymaniu kodu. To właśnie osiąga cukier syntaktyczny poprzez wyodrębnienie typowych, choć złożonych wzorów w prostszą składnię.
Craig,
Mówię, że ludzie zwykle rozumieją ten termin jako obelgę, nie komentuję samej praktyki leżącej u podstaw. Powiedzenie słowa „idiota” jest krzywoprzysięstwem, nie oznacza, że ​​wszyscy ludzie są idiotami. Kiedy ludzie chcą mówić o praktyce pozytywnie, zwykle używają terminów takich jak „abstrakcja” lub „enkapsulacja”.
Karl Bielefeldt,