2009-09-07 9 views
11

W języku C# (i Java) ciąg znaków jest niewiele więcej niż tablicą znaków z przechowywaną długością i kilkoma metodami przyczepionymi. Podobnie, obiekty referencyjne i wartościowe na bok są niewiele więcej niż gloryfikowanymi strukturami z dodanym dziedziczeniem i interfejsami.Syntactic sugar vs feature

Na jednym poziomie te dodatki mają dla siebie wyraźne cechy i ulepszenia. Na innym poziomie czują się jak marginalnie ulepszenie ze statusu "cukru syntaktycznego".

Aby wziąć ten pomysł dalej, należy rozważyć (może mam jakieś szczegóły źle, ale punkt pozostaje):

transistor 
elementary logic gate 
compound gate 
    |   | 
ALU flip-flop 
    | |  | 
    | register RAM 
    | | 
    CPU 
    microcode 
    assembly 
    C 
    C++ 
    | | 
MSIL JavaScript 
C# jQuery 

wiele razy, każda pojedyncza warstwa abstrakcji wygląda jak cukier składniowej, ale wielu warstw separacja czuje się bardzo oderwana od siebie.

Skąd wiadomo, że coś przestało być cukrem syntaktycznym i zaczęło funkcjonować jako bona fide?

+1

Czy odwołujesz się do projektowania języka? Co masz na myśli mówiąc "coś"? – Dario

+1

Zasadniczo subiektywne, myślę. – dmckee

Odpowiedz

23

Okazuje się, że to cecha zamiast cukru składniowym, gdy oznacza to inny sposób myślenia.

Masz rację, kiedy mówisz, że obiekty są gloryfikowanymi strukturami za pomocą metod i dziedziczenia. To jednak tylko szczegół implementacji. Dopuszczalne obiekty to myślenie w inny sposób. Możesz łatwiej łączyć się z rzeczywistymi istotami, myśląc o przedmiotach. To samo zdarzyło się, gdy jeszcze bardziej cofnęliśmy się w czasie, przeskoczyliśmy od używania go-to do programowania proceduralnego. Pod maską procesor wciąż działa z PO do OP, ale możemy myśleć w inny, bardziej czarny sposób.

Powiedziawszy to, w skrajnym przypadku można powiedzieć, że wszystko jest cukrem syntaktycznym, ale część tego cukru jest cechą, gdy pozwala myśleć inaczej.

+1

Wiele razy zastanawiałem się nad twoją odpowiedzią w ciągu ostatnich kilku miesięcy i im bardziej stosuję się do sytuacji, tym bardziej się z tym zgadzam. – Dinah

2

Musiałbym powiedzieć, że tego samego wyniku nie da się osiągnąć po prostu przez napisanie innego kodu, z tym samym rodzajem "ograniczenia czasowego", jak przy użyciu cukru syntaktycznego.

Mój przykład byłby wyrażeniem Lambda, pisanie pętli foreach nie wymagało wiele wysiłku, ale używanie .Foreach() również jest fajne; w przeciwieństwie do przepisywania całej klasy HttpRequest na własną rękę. Jedna jest syntaktyczna, jedna jest cechą. Oba oszczędzają czas, jeden w znacznie większym stopniu niż drugi.

5

Całe oprogramowanie to olbrzymi zbiór abstrakcji zbudowany na innych abstrakcjach. Łańcuch może być niczym więcej jak tablicą znaków, ale jest wiele operacji, które są naturalne na łańcuchach, ale są niezręczne w tablicach znaków. Cel wszystkich tych abstrakcji jest taki sam: usuń nieistotne szczegóły, aby programista mógł skupić się na ważnych częściach problemu.

Jak podkreślasz, wszystkie współczesne języki programowania mogą zostać wyeliminowane, a my możemy powrócić do pracy w języku asemblerowym. Ale nasza produktywność spadłaby gwałtownie.

Podejrzewam, że ludzie nazywają coś syntaktycznym cukrem, gdy czują, że odbierają z niego niewielką korzyść, a funkcja, gdy czują, że czerpią z niej dużą korzyść. To sprawia, że ​​rozróżnienie jest bardzo rozmyte i dość subiektywne.

12

Cukier składniowy to funkcja.

+2

W szerokim znaczeniu, tak. Ale nie sądzę, byś odpowiedział w duchu pytania OP. – nawfal

0

"lenistwo jest motorem postępu" Ten proces zostanie zatrzymany, gdy możesz natychmiast zmapować swoje pomysły na maszynę.

2

„cukier syntaktyczna” to cecha nie lubisz

+3

Nie po moim rozumieniu tego terminu. Cukier syntaktyczny sprawia, że ​​język * jest słodszy *. –

+2

Ale wtedy musisz opisać smak słodzonej, skróconej składni - z przyjemnością. Po poważnej stronie, jeśli funkcja została dodana do ewolucyjnego języka i nie została wyjątkowo dobrze odebrana, będzie się nazywać cukrem syntaktycznym. – ima

5

Kiedy zmiana zapewnia wartość? Zakodowałem w asemblerze. Przełączyłem się na C i spojrzałem na wyjście z kompilatora. Jego kod to 95 +% tak dobry jak mój ręcznie wykonany asembler i było o wiele łatwiej pisać. Dla mnie to zapewniało wartość, więc powiedziałbym, że to nie cukier.

C++ pomaga mi przetłumaczyć moje myśli obiektowe na kod. Dopóki obciążenie nie jest zbyt wysokie, myślę, że jest to funkcja.

Jestem praktyczny. „Jeśli widzę, że to cenne” to moja odpowiedź

0

syntaktyczna cukier i funkcja języka są zasadniczo opisujące to samo, nawet jeśli cukier syntaktyczny jest czasami stosowany w pejoratywnym sposób natomiast funkcji często wiąże się z głębszych zmian w architekturze językowej (wprowadzanie lambdas itp.). Ale to rozróżnienie jest bardzo zależne od indywidualnego punktu widzenia (i jego subiektywnie odczuwanej przydatności).

odniesieniu do aspektów języka projektowania i swojej przykład strings i char-arrays, powiedziałbym, że powinno to być ani funkcja, ani cukru, ale po prostu wyrazić w języku Podstawowa składnia (LOP - język programowania zorientowanych). Ogólne koncepcje (typografia, metaprogramowanie itp.) Pozwalają na wyrażanie wielu nowych i użytecznych konstrukcji przez siebie bez czekania, aż język uzyska nową funkcję. Wystarczy spojrzeć na funkcje metaprogramowania Haskella lub C++.

3

Wygląda na to, że syntaktyczny surgar to składnia, która nie zmienia niczego w umiejętnościach danego języka, a użycie innego konstruktu pozwala osiągnąć dokładnie to samo. Ciąg (myślenie w Javie) to nie tylko syntaktyczny cukier w tablicy znaków. Tablica znaków jest zmienna (w treści, jeśli nie jest długa). Nie można uczynić tablicy znaków niezmienną za pomocą istniejącej funkcji języka bez tablicy String.

Z drugiej strony, operator plus pracujący na Strings jest rzeczywiście syntaktycznym cukrem do używania StringBuilder i wywoływania wywołania.

1

Ogólnie termin "cukier syntaktyczny" odnosi się do cech językowych, które nigdy nie pozwoliły programistom na zrobienie czegoś, co wcześniej nie mogło być zrobione, ale raczej stanowiło przyjemny sposób wyrażenia czegoś, co mogło już wyrazić w języku, nawet jeśli nieco bardziej niezręcznie.

Niektóre konstrukty mogą być jednoznacznie traktowane jako cukier syntaktyczny. Na przykład w VB.NET: kod sprawdzający, czy dwa odniesienia nie były równe, wymagały If Not (ref1 Is Ref2), ale nowsze wersje tego języka zezwalały na If ref1 IsNot Ref2. Nic nie może być wyrażone w nowej składni, której nie można wyrazić w starym, ale nowa składnia jest czystsza, nie wprowadza żadnych niejednoznaczności, a jedynym powodem, dla którego by jej nie używał, byłby kod, który musiałby być kompatybilny z poprzednimi wersjami języka.

Niektóre konstrukty mogą być nieco trudniejsze do zdefiniowania jako cukier. W szczególności, jeśli język dodaje konstrukcje, które będą działać identycznie do istniejącej konstrukcji, gdy są używane z innymi typami, ale nie powiedzie się kompilacji z innymi, takie konstrukcje mogą zapewnić narzędzie do weryfikacji typu kompilacji, które wcześniej nie istniało. Generics Java generalnie można oglądać w tym świetle.Można dodać Cat do ArrayList<Cat> równie łatwo jak do ArrayList; to, co dodaje ArrayList<Cat>, to strażnik, który odrzuca w czasie kompilacji Dog. Ponieważ ograniczenia kompilacji nie pozwalają na napisanie żadnego programu, który nie mógłby być napisany bez nich, niektórzy ludzie mogą postrzegać je jako cukier syntaktyczny. Z drugiej strony, mimo że weryfikacja typu odbywa się w czasie kompilacji, a nie w czasie wykonywania, nadal może być postrzegana jako jedno z zadań programu.

Powiązane problemy