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

时间:2014-02-27 06:39:48

标签: java semantics java-8

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

一些例子:

  

重复使用java的默认迭代循环

     

编辑中关于句法糖的观察。

4 个答案:

答案 0 :(得分:115)

sugar ,在编程中,通常是指那些 sweet 添加,主要是快捷方式,使一些构造更容易打字和阅读(后者在实践中,在你的计划的生命周期中最重要的。)

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

以下是一些例子:

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

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

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

这就是说, desugaring 指的是

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

答案 1 :(得分:14)

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

如果您对细节感兴趣,"Translation of Lambda Expressions"上的这份文件似乎有详细信息。

文件中的关键词:

  

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

答案 2 :(得分:5)

一般而言,#des; desugaring"在javac中允许用预先存在的语言表示一些语言特征。这允许在字节码中表示它们,而无需对类文件格式进行大的更改。也是因为这个原因,编译器的后端比前端更稳定。这并不意味着每个新的语言特征都只是语法糖,因为绝对不是lambdas和方法引用的情况。有更多的例子" desugaring"在编译器中:

  • 每个循环都是" desugared" C风格的循环
  • 断言是" desugared"如果句子
  • 内部类表示为独立类

你也可以调查String开关发生了什么,输入erasure,...

答案 3 :(得分:1)

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

这些概念在Java的上下文中经常出现在Java中。 Android不包括JDK,而是Java运行时的重新实现。因此,对新Java语言功能的支持取决于Android是否支持新语言功能。当前,所有Android应用程序都可以通过使用废话功能支持所有Java 7功能以及部分Java 8功能。有关详细信息,请参见"Use Java 8 language features and APIs"

这里有一篇文章探讨了在Android中降低Java功能的细节:"Android's Java 8 Support"。根据这篇文章,lambdas实际上总是在Android二进制文件中删除(“这就是为什么无论您的最低API级别如何,总是在编译时进行解密)”