什么是Java 8中的"糖","desugar"术语?

Xel*_*ian 99 java java-8 semantics

我在Java 8中经常听说'糖化'和'贬低',这些术语是什么意思?他们是概念性的还是语法式的.

一些例子:

默认迭代循环重新发布到java

编辑中的句法糖观察.

Den*_*ret 121

在编程中,通常指的是那些甜蜜的补充,主要是快捷方式,使一些结构更容易打字和阅读(后者在实践中是程序生命周期中最重要的).

维基百科有一个句法糖的定义,但你应该注意到并非所有的糖本质上都是语法的(并非所有最近的甜味添加都只是编译器的变化).

这里有一些例子 :

  • 后缀和前缀增量运算符(i++++i).他们唯一的目的是避免写一个额外的声明.他们是纯糖.
  • +=,|=,&=等都是由同种糖的.
  • 原始类型和对象之间的隐式转换也是糖.
  • 类型推断也是糖.
  • 与Java 8一起使用的Lambda表达式是另一种糖(这不仅仅是语法上的)

人们普遍认为Java不够简洁,特别是与现代语言相比.这就是为什么欢迎那些有助于使代码更快阅读的新增功能.

最后,我要注意的是,虽然缺糖可以使你的程序变胖,过多的糖,导致许多不同的方式来编写相同的东西,可以使你的语言不安,你的程序不那么连贯,更难维护.另一种糖,API糖,通常是一种瘟疫,使API更难掌握,特别是当它由添加物(例如超载)组成时.

就是说,desugaring指的是

  • 删除语言中所有冗余的过程
  • 代码处理器找出含糖语句背后的内容的过程(例如,这可能涉及类型推断)

  • "复合糖导致分号癌症." - Alan Perlis (39认同)
  • 在C的早期,后缀和前缀运算符曾经不是语法糖.根据今天的标准,早期的编译器是愚蠢的,并且这些运算符可以用一个机器代码指令实现,但是等效的赋值语句不能.因此他们能够编写更有效的程序. (12认同)
  • +1你也可以提一下desugar部分,因为这将完成OP提出的答案!:) (6认同)
  • @justhalf想想当你能够删除你创建的所有接口以便能够传递函数时,你的程序会变薄多少. (6认同)
  • @justhalf这个问题得到了很多关注.在这些情况下,管理员删除看似不具有建设性的评论并不罕见.我不认为你的评论必须删除,但它没有带来太多. (3认同)

Sho*_*orn 16

"Desugaring"似乎在Java 8中具有非常具体的含义.表达lambda表达式可能绑定到实际具体方法调用的各种方式似乎是一个包罗万象的术语.

关于"Lambda表达式的翻译"的这篇文章似乎有关于如果你对细节感兴趣的事情的真实细节.

该文件的一个关键短语:

将lambda转换为字节码的第一步是将lambda体转化为方法.


Car*_*l G 7

正如其他人所指出的,在计算机编程和本文中,“糖”是指使代码更易于读/写的语言功能。“脱糖”是指当编译器或运行时缺乏对加糖版本的本机支持时,自动将“糖”结构转换为其他结构。

对于 Java,这些概念在 Android 环境中经常出现。Android 不包含 JDK,而是 Java 运行时的重新实现。因此,对新的 Java 语言功能的支持取决于 Android 对新语言功能的支持。目前,所有 Android 应用程序都可以使用脱糖来支持所有 Java 7 功能以及 Java 8 功能的子集。有关详细信息,请参阅“使用 Java 8 语言功能和 API”

这里有一篇文章详细介绍了 Android 中的 Java 脱糖功能:“Android 的 Java 8 支持”。根据这篇文章,lambda 实际上总是在 Android 二进制文件中进行去糖操作(“这就是为什么无论您的最低 API 级别如何,总是在编译时进行去糖操作。”)


Vic*_*ero 5

通常,javac中的“ desugaring”允许使用预先存在的语言功能来表示某些语言功能。这样就可以用字节码表示它们,而无需对类文件格式进行大的更改。同样由于这个原因,编译器的后端比前端更稳定。这并不意味着每个新语言功能都只是语法糖,绝对不是lambda和方法引用的情况。编译器中还有更多的“ desugaring”示例:

  • 对于每个循环,循环使用C样式的“ desugared”
  • 断言被if句子“拒绝”
  • 内部类表示为独立类

您还可以调查String开关,擦除类型,...