Що таке терміни "цукор", "десугар" в контексті Java 8?


107

Я чую про «цукор» та «знежирення» частіше в Java 8, що означають ці терміни? вони концептуальні чи синтаксичні.

Деякі приклади:

За замовчуванням повторюється цикл перенаправлення на java

Спостереження щодо синтаксичного цукру в складанні.

Відповіді:


136

У програмі цукор зазвичай посилається на ті солодкі доповнення, в основному це ярлики, які роблять деякі конструкції простішими для набору та читання (останні, на практиці, є найважливішими протягом життєвого циклу вашої програми).

У Вікіпедії є визначення синтаксичного цукру, але слід зауважити, що не весь цукор, по суті, синтаксичний (не всі останні солодкі доповнення були лише змінами компілятора).

Ось кілька прикладів:

  • оператори приросту постфікса та префікса ( i++та ++i). Єдина їх мета - уникнути написання додаткової заяви. Вони чистий цукор.
  • +=, |=, &=І т.д. зроблені з того ж виду цукру.
  • Неявне перетворення між примітивними типами і предметами теж є цукром.
  • Тип висновку - це також цукор.
  • Лямбда-вираз, що йде разом з Java 8, - це якийсь інший вид цукру (цей не просто синтаксичний )

Вважається, що Java вважається недостатньо стислою, особливо порівняно із сучасними мовами. Ось чому вітаються ті доповнення, які допомагають зробити код швидшим для читання.

На закінчення я просто зазначу, що хоча брак цукру може зробити вашу програму жирною, надлишок цукру, що призводить до багатьох різних способів писати одні й ті ж речі, може зробити вашу мову легкою, а вашу програму менш узгодженою та складнішою у підтримці . Інший вид цукру, цукор API, - це найчастіше чума, яка ускладнює сприйняття API, особливо якщо він зроблений з доповнень (наприклад, перевантаження).

Це, як говориться, знежирення відноситься або до

  • процес, за допомогою якого ви видаляєте все зайве в мові
  • процес, за допомогою якого процесор коду з'ясовує, що стоїть за викладеним оператором (наприклад, це може включати умови виводу

6
+1 Ви також можете згадати про частину десугару, оскільки це доповнить відповідь, яку попросила ОП! :)
Рахул Тріпаті

6
@justhalf Подумайте, наскільки тоншими будуть ваші програми, коли ви зможете видалити всі створені інтерфейси просто для того, щоб передати функцію.
Denys Séguret

42
"Синтаксичний цукор викликає рак крапки з комою". - Алан Перліс
Стюарт Марк

12
Оператори постфікса та префікса були колись, у перші дні С, не синтаксичним цукром. За сучасними мірками ранні компілятори були німими, і ці оператори могли бути реалізовані за допомогою однієї інструкції машинного коду, але еквівалентна заява про призначення не могла. Таким чином вони дозволили написати більш ефективні програми.
Raedwald

3
@justhalf Це питання привернуло багато уваги. У цих випадках адміністратори видаляють коментарі, які здаються неконструктивними. Я не думаю, що ваш коментар потрібно було видалити, але він не приніс багато.
Denys Séguret

17

Здається, що "Desugaring" має дуже специфічне значення в Java 8. Здається, що термін "загальний" для вираження різних способів вираз лямбда може бути пов'язаний з фактичним конкретним викликом методу.

Цей документ про "Переклад лямбдаських виразів", здається, містить реальну інформацію про те, що відбувається, якщо вас цікавить конкретна інформація.

Ключова фраза з документа:

Перший крок перекладу лямбда в байт-код - це знешкодження тіла лямбда в метод.


6

Взагалі, «знежирення» в javac дозволяє представити деякі мовні особливості з попередніми. Це дозволяє представляти їх у байт-коді без великих змін у форматі файлу класу. Також з цієї причини задній компілятор компілятора є більш стабільним, ніж передній. Це не означає, що кожна нова мовна особливість - це лише синтаксичний цукор, як це, безумовно, не стосується лямбдів та посилань на методи. Є більше прикладів "знешкодження" у компіляторі:

  • для кожної петлі "знеструмлено" стиль C для циклів
  • твердження "знезаражені" у реченні if
  • внутрішні класи представлені як самостійний клас

Ви також можете дослідити, що відбувається з перемикачем String, введіть стирання, ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.