Подтвердить что ты не робот

Что такое термины "сахар", "desugar" в контексте Java 8?

Я слышал о "сахарировании" и "обессеривании" чаще в Java 8, что означают эти термины? являются ли они концептуальными или синтаксическими.

Пример:

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

Наблюдения за синтаксическим сахаром в компиляции.

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

Ответ 2

"Desugaring", по-видимому, имеет очень специфическое значение в Java 8. Похоже, это универсальный термин для выражения различных способов, которыми лямбда-выражение может быть связано с реальным конкретным вызовом метода.

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

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

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

Ответ 3

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

  • для каждой петли "desugared" для стиля C для циклов
  • утверждения "desugared" к предложению if
  • внутренние классы представлены как автономный класс

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