Co to są pojęcia "sugar", "desugar" w kontekście Java 8?

Częściej słyszę o "cukrowaniu" i "desugaringu" w Javie 8, co oznaczają te terminy ? czy są pojęciowe czy składniowe.

Jakiś Przykład:

Default iterated loop resugaring to java

Uwagi o cukrze składniowym w kompilacji.

Author: Community, 2014-02-27

4 answers

sugar , w programowaniu, zwykle odnosi się do tych sweet dodatków, głównie skrótów, które sprawiają, że niektóre konstrukcje są łatwiejsze do pisania i czytania (ta ostatnia jest w praktyce najważniejsza w cyklu życia programu).

Wikipedia ma definicję syntaktycznego cukru ale należy zauważyć, że nie wszystkie cukry są w istocie składniowe (nie wszystkie ostatnie słodkie dodatki były tylko zmianami kompilatora).

Oto kilka przykładów :

  • operatory Postfix i PREFIX increment (i++ i ++i). Ich jedynym celem jest uniknięcie pisania dodatkowego oświadczenia. To czysty cukier.
  • +=, |=, &=, itd. są wykonane z tego samego rodzaju cukru.
  • ukryta konwersja między prymitywnymi typami i obiektami jest również cukrem.
  • wnioskowanie typu to też cukier.
  • wyrażenie Lambda, pochodzące z Javy 8, to jakiś inny rodzaj cukru (ten nie tylko syntaktyczny )
Java jest powszechnie postrzegana jako mało zwięzła, szczególnie w porównaniu do współczesnych języków. Dlatego mile widziane są dodatki, które ułatwiają czytanie kodu.

Na zakończenie, chciałbym tylko zauważyć, że podczas gdy brak cukru może spowodować, że twój program jest gruby, 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 twój program będzie mniej spójny i trudniejszy do utrzymania. Inny rodzaj cukru, cukier API, to najczęściej jest to plaga, która sprawia, że API jest trudniejsze do uchwycenia, zwłaszcza, gdy składa się z dodatków (na przykład przeciążenia).

To powiedziane, desugaring odnosi się albo do

  • proces, za pomocą którego usuwasz wszystko, co jest zbędne w języku
  • Proces, w którym procesor kodu dowiaduje się, co kryje się za wyrażeniem sugared (może to na przykład wiązać się z wnioskowaniem typu)
 137
Author: Denys Séguret,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-28 05:45:08

"Desugaring" wydaje się mieć bardzo specyficzne znaczenie w Javie 8. Wydaje się, że jest to termin "catch-all" wyrażający różne sposoby, w jakie wyrażenie lambda może być związane z konkretnym wywołaniem metody.

Ten dokument na "tłumaczenie wyrażeń Lambda" zawiera prawdziwe szczegóły tego, co się dzieje, jeśli jesteś zainteresowany szczegółami.

Kluczowa fraza z dokumentu:

Pierwszym krokiem translacji lambda do bajtowego kodu jest desugaring ciała lambda do metoda.

 19
Author: Shorn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-01-16 00:38:40

Ogólnie rzecz biorąc "desugaring" w javac pozwala na reprezentowanie niektórych cech języka z wcześniej istniejącymi. Pozwala to na reprezentowanie ich w kodzie bajtowym bez dokonywania dużych zmian w formacie pliku klasy. Również z tego powodu back-end kompilatora jest bardziej stabilny niż front-end. Nie oznacza to, że każda nowa cecha języka jest tylko cukrem składniowym, jak na pewno nie jest w przypadku lambda i odniesień do metod. Jest więcej przykładów "desugaringu" w kompilatorze:

  • dla każdej pętli są "desugared" do stylu C dla pętli
  • twierdzenia są "desugared" do zdania if
  • klasy wewnętrzne są reprezentowane jako samodzielna klasa

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

 6
Author: Vicente Romero,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-26 03:05:54

Jak zauważyli inni, w programowaniu komputerowym i w tym kontekście "sugar" odnosi się do cech języka, które sprawiają, że kod jest przyjemniejszy do odczytu/zapisu. "Desugaring" odnosi się do automatycznego tłumaczenia konstruktów "sugar" na inne, gdy kompilator lub środowisko wykonawcze nie ma natywnego wsparcia dla wersji sugared.

Te koncepcje pojawiają się często w Javie w kontekście Androida. Android nie zawiera JDK, ale zamiast tego jest ponowną implementacją środowiska Java runtime. Dlatego obsługa nowych funkcji języka Java zależy od systemu Android obsługującego nowe funkcje językowe. Obecnie wszystkie aplikacje na Androida mogą obsługiwać wszystkie funkcje Java 7 oraz podzbiór funkcji Java 8 przy użyciu funkcji desugaring. Zobacz "Użyj funkcji języka Java 8 i interfejsów API", Aby uzyskać szczegółowe informacje.

[[0]} oto artykuł opisujący szczegółowo funkcje Javy w systemie Android: "Android' s Java 8 Support". Zgodnie z artykułem, lambda są w rzeczywistości zawsze desugared w binariach Androida ("to dlatego desguaring zawsze odbywa się w czasie kompilacji, niezależnie od minimalnego poziomu API.")
 2
Author: Carl G,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-10-29 19:51:49