在 Java8的上下文中,“ sugar”、“ desugar”术语是什么?

我在 Java8中经常听到“糖化”和“去糖化”,这些术语是什么意思?是概念上的还是句法上的。

一些例子:

Default iterated loop resugaring to java

关于编纂中句法糖的几点思考。

19372 次浏览

Sugar ,在编程中,通常指的是那些增加的 真贴心,大部分是快捷方式,它们使得一些构造更容易输入和读取(实际上,后者是程序生命周期中最重要的)。

Wikipedia 有一个 syntactic sugar的定义,但是你应该注意到并不是所有的 Sugar 都是语法上的(并不是所有最近添加的 sweet 都是编译器的改变)。

下面是一些例子:

  • the postfix and prefix increment operators (i++ and ++i). Their only purpose is to avoid writing an additional statement. They're pure sugar.
  • +=|=&=等都是由同一种糖制成的。
  • 原始类型和对象之间的隐式转换也是 Sugar。
  • 类型推断也是糖。
  • Java8中的 Lambda 表达式是另一种 Sugar (这是 不仅仅是语法)

人们普遍认为 Java 不够简洁,尤其是与现代语言相比。这就是为什么那些有助于使代码读起来更快的补充是受欢迎的。

To finish, I'd just note that while a lack of sugar can make your program fat, an excess of sugar, leading to many different ways to write the same things, can make your language queasy and your program less coherent and harder to maintain. Another kind of sugar, API sugar, is most often a plague which makes the API harder to grasp, especially when it's made of additions (overloading for example).

也就是说,令人厌恶指的是

  • 去除语言中所有冗余的过程
  • 代码处理程序找出 Sugar 语句后面是什么的过程(例如,这可能涉及类型推断)

“ Desugaring”在 Java8中似乎有一个非常具体的含义。它似乎是一个包罗万象的术语,用来表示 lambda 表达式绑定到实际具体方法调用的各种方式。

如果您对细节感兴趣,这个关于 “ Lambda 表达的翻译”的文档提供了正在发生的事情的真实细节。

文件中的一个关键词:

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

一般来说,javac 中的“去糖化”允许用先前存在的语言特性来表示一些语言特性。这允许在字节码中表示它们,而不需要对类文件格式进行大的更改。也因为这个原因,编译器的后端比前端更稳定。这并不意味着每个新的语言特性都只是语法上的糖,而 lambdas 和方法引用的情况肯定不是这样。在编译器中还有更多“去糖化”的例子:

  • 对于每个循环都“去糖化”为 C 风格的 for 循环
  • 断言被“去糖化”为 if 句
  • 内部类表示为独立类

您还可以研究 String 开关、类型擦除、 ..。

As others have noted, in computer programming and in this context, "sugar" refers to language features that make the code nicer to read/write. "Desugaring" refers to automatically translating "sugar" constructs into other constructs when the compiler or runtime lacks native support for the sugared versions.

These concepts come up frequently for Java in the context of Android. Android doesn't include a JDK, but instead is a re-implementation of the Java runtime. Therefore support for new Java language features depends on Android supporting the new language features. Currently all Android apps can support all Java 7 features, and a subset of Java 8 features, using desugaring. See “使用 Java8语言特性和 API” for details.

Here's an article going into the details of desugaring Java features in Android: 「 Android 的 Java8支援」. According to the article, lambdas are actually always desugared in Android binaries ("This is why desguaring always happens at compile-time regardless of your minimum API level.")