Что такое «сахар» и «десахар» в контексте Java 8?

107

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

Некоторый пример:

Повторное повторение цикла по умолчанию для java

Замечания о синтаксическом сахаре в компиляции.

Кселианский
источник

Ответы:

136

сахар , в программировании, обычно относится к сладким дополнениям, в основном ярлыкам, которые упрощают ввод и чтение некоторых конструкций (последнее на практике является наиболее важным в жизненном цикле вашей программы).

В Википедии есть определение синтаксического сахара, но вы должны отметить, что не весь сахар, по сути, является синтаксическим (не все недавние сладкие добавления были просто изменениями компилятора).

Вот несколько примеров :

  • операторы приращения постфикса и префикса ( i++и ++i). Их единственная цель - избежать написания дополнительных заявлений. Это чистый сахар.
  • +=, |=, &=И т.д. сделаны из того же вида сахара.
  • Неявное преобразование между примитивными типами и объектами - тоже сахар.
  • вывод типа тоже сахар.
  • Лямбда-выражение, поставляемое с Java 8, представляет собой другой вид сахара ( не только синтаксический ).

Многие считают Java недостаточно лаконичной, особенно по сравнению с современными языками. Поэтому приветствуются те дополнения, которые помогают ускорить чтение кода.

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

При этом десугаринг относится либо к

  • процесс, с помощью которого вы удаляете все лишнее на языке
  • процесс, с помощью которого обработчик кода обнаруживает, что стоит за засахаренным оператором (например, это может включать в себя вывод типа)
Дени Сегюре
источник
6
+1 Вы также можете упомянуть о части десахара, так как это завершит ответ, который спросил OP! :)
Рахул Трипати
6
@justhalf Подумайте, насколько тоньше будут ваши программы, если вы сможете удалить все созданные вами интерфейсы, просто чтобы иметь возможность передавать функцию.
Denys Séguret
42
«Синтаксический сахар вызывает рак точки с запятой». - Алан Перлис
Стюарт Маркс
12
Когда-то на заре C постфиксные и префиксные операторы не были синтаксическим сахаром. Ранние компиляторы были глупыми по сегодняшним стандартам, и эти операторы могли быть реализованы с помощью одной инструкции машинного кода, но эквивалентный оператор присваивания - нет. Так они позволили писать более эффективные программы.
Raedwald
3
@justhalf Этот вопрос привлек много внимания. В таких случаях администраторы нередко удаляют комментарии, которые кажутся неконструктивными. Не думаю, что ваш комментарий нужно было удалять, но он не принес многого.
Denys Séguret
17

«Обесуглероживание» в Java 8 имеет очень специфическое значение. Кажется, это универсальный термин, обозначающий различные способы привязки лямбда-выражения к реальному вызову конкретного метода.

Этот документ «Перевод лямбда-выражений», кажется, содержит реальные подробности того, что происходит, если вас интересуют детали.

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

Первый шаг преобразования лямбда-выражений в байт-код - это обесцвечивание тела лямбда-выражения в метод.

Стриженый
источник
6

В целом «обессахаривание» в javac позволяет отображать некоторые языковые функции с уже существующими. Это позволяет представить их в байт-коде, не внося больших изменений в формат файла класса. Также по этой причине внутренняя часть компилятора более стабильна, чем интерфейсная. Это не означает, что каждая новая языковая функция - это просто синтаксический сахар, что определенно не относится к лямбдам и ссылкам на методы. В компиляторе есть и другие примеры «обессахаривания»:

  • для каждой петли "обессахариваются" в стиле C для петель
  • утверждения "обессахариваются" до предложения if
  • внутренние классы представлены как отдельный класс

Вы также можете исследовать, что происходит с переключателем String, стиранием типа, ...

Висенте Ромеро
источник