Co to są terminy „cukier”, „desugar” w kontekście Java 8?

107

Częściej słyszę o „cukrowaniu” i „usuwaniu cukru” w Javie 8, co oznaczają te terminy? czy są konceptualne czy składniowe.

Jakiś przykład:

Domyślna iterowana pętla resetowania do java

Obserwacje dotyczące cukru syntaktycznego w kompilacji.

Xelian
źródło

Odpowiedzi:

136

cukier w programowaniu zwykle odnosi się do tych słodkich dodatków, głównie skrótów, które sprawiają, że niektóre konstrukcje są łatwiejsze do wpisania i odczytania (te ostatnie są w praktyce najważniejsze podczas cyklu życia programu).

Wikipedia ma definicję cukru syntaktycznego, ale należy zauważyć, że nie każdy cukier jest w istocie syntaktyczny (nie wszystkie ostatnie słodkie dodatki były tylko zmianami w kompilatorze).

Oto kilka przykładów:

  • operatory przyrostu przyrostka i przedrostka ( i++i ++i). Ich jedynym celem jest uniknięcie pisania dodatkowego oświadczenia. To czysty cukier.
  • +=, |=, &=, Itd. Są wykonane z tego samego rodzaju cukru.
  • Niejawna konwersja między typami prymitywnymi a przedmiotami to także cukier.
  • wnioskowanie o typie to też cukier.
  • Wyrażenie lambda, zawarte w Javie 8, to inny rodzaj cukru (ten nie tylko syntaktyczny )

Java jest powszechnie postrzegana jako niewystarczająco zwięzła, zwłaszcza w porównaniu z nowoczesnymi językami. Dlatego te dodatki, które pomagają przyspieszyć czytanie kodu, są mile widziane.

Na koniec chciałbym tylko zauważyć, że chociaż brak cukru może sprawić, że twój program będzie tłusty, nadmiar cukru, prowadzący do wielu różnych sposobów pisania tych samych rzeczy, może sprawić, że twój język będzie mdły, a program mniej spójny i trudniejszy do utrzymania . Inny rodzaj cukru, cukier API, jest najczęściej plagą, która sprawia, że ​​API jest trudniejsze do uchwycenia, zwłaszcza gdy jest zrobione z dodatków (na przykład przeciążenie).

To powiedziawszy, desugaring odnosi się do

  • proces, w którym usuwasz wszystko, co jest zbędne w języku
  • proces, za pomocą którego procesor kodu dowiaduje się, co kryje się za przesłaną instrukcją (może to na przykład obejmować wnioskowanie o typie)
Denys Séguret
źródło
6
+1 Możesz również wspomnieć o części dotyczącej usuwania cukru, ponieważ uzupełniłoby to odpowiedź, o którą zadał OP! :)
Rahul Tripathi
6
@justhalf Pomyśl, o ile cieńsze będą twoje programy, gdy będziesz mógł usunąć wszystkie te interfejsy, które utworzyłeś, tylko po to, aby móc przekazać funkcję.
Denys Séguret
42
„Cukier syntaktyczny powoduje raka średnika”. - Alan Perlis
Stuart Marks
12
Operatory przedrostków i przedrostków nie były kiedyś, we wczesnych dniach C, cukrem syntaktycznym. Wczesne kompilatory były głupie, jak na dzisiejsze standardy, i operatorzy ci mogli być implementowani za pomocą jednej instrukcji kodu maszynowego, ale równoważna instrukcja przypisania nie mogła. Umożliwiły więc pisanie wydajniejszych programów.
Raedwald
3
@justhalf To pytanie przyciągnęło wiele uwagi. W takich przypadkach administratorzy nierzadko usuwają komentarze, które nie wydają się konstruktywne. Nie sądzę, aby Twój komentarz musiał zostać usunięty, ale nie przyniósł wiele.
Denys Séguret
17

Wydaje się, że „desugaring” ma bardzo specyficzne znaczenie w Javie 8. Wydaje się, że jest to termin obejmujący wszystkie elementy, wyrażający różne sposoby, w jakie wyrażenie lambda może być powiązane z rzeczywistym wywołaniem metody konkretnej.

Ten dokument „Tłumaczenie wyrażeń lambda” wydaje się zawierać prawdziwe szczegóły tego, co się dzieje, jeśli jesteś zainteresowany szczegółami.

Kluczowa fraza z dokumentu:

Pierwszym krokiem do przetłumaczenia lambd na kod bajtowy jest usunięcie cukru z treści lambda na metodę.

Wystrzyżony
źródło
6

Generalnie „desugaring” w javac pozwala na reprezentowanie niektórych funkcji językowych za pomocą wcześniej istniejących. Pozwala to na przedstawienie ich w kodzie bajtowym bez dokonywania dużych zmian w formacie pliku klasy. Również z tego powodu zaplecze kompilatora jest bardziej stabilne niż front-end. Nie oznacza to, że każda nowa funkcja języka jest po prostu cukrem składniowym, jak na pewno nie ma to w przypadku lambd i odwołań do metod. W kompilatorze jest więcej przykładów „usuwania cukru”:

  • dla każdej pętli są "desugared" do stylu C dla pętli
  • twierdzenia są „pozbawione cukru” do zdania if
  • klasy wewnętrzne są reprezentowane jako samodzielne klasy

Możesz również zbadać, co się dzieje z przełącznikiem String, wpisz wymazanie, ...

Vicente Romero
źródło