【发布时间】:2014-03-30 10:22:47
【问题描述】:
我在 Java 8 中经常听到“加糖”和“脱糖”,这些术语是什么意思?它们是概念性的还是句法性的。
一些例子:
默认迭代循环转为 java
关于编译中语法糖的观察。
【问题讨论】:
我在 Java 8 中经常听到“加糖”和“脱糖”,这些术语是什么意思?它们是概念性的还是句法性的。
一些例子:
默认迭代循环转为 java
关于编译中语法糖的观察。
【问题讨论】:
sugar,在编程中,通常是指那些 sweet 添加,主要是快捷方式,使某些结构更易于键入和阅读(后者实际上是,在程序的生命周期中最重要)。
维基百科有一个syntactic sugar 的定义,但您应该注意,本质上,并非所有的糖都是语法上的(并非所有最近的甜蜜添加都只是编译器更改)。
这里有几个例子:
i++ 和++i)。他们的唯一目的是避免写额外的声明。它们是纯糖。+=、|=、&=等都是用同一种糖做的。Java 被广泛认为不够简洁,尤其是与现代语言相比。这就是为什么那些有助于使代码更快阅读的添加受到欢迎的原因。
最后,我只想指出,虽然缺少糖会使您的程序变胖,但过多的糖会导致编写相同内容的多种不同方式,这会使您的语言变得令人不安,并且您的程序不那么连贯和更难维护。另一种糖,API 糖,通常是一种瘟疫,它使 API 更难掌握,尤其是当它由添加(例如重载)组成时。
话虽如此,desugaring 指的是
【讨论】:
“Desugaring”在 Java 8 中似乎具有非常特殊的含义。它似乎是一个包罗万象的术语,用于表达 lambda 表达式可能绑定到实际具体方法调用的各种方式。
"Translation of Lambda Expressions" 上的这份文档包含有关正在发生的事情的真实细节,如果您对细节感兴趣的话。
文档中的一个关键短语:
将 lambda 转换为字节码的第一步是将 lambda 主体脱糖成一个方法。
【讨论】:
一般而言,javac 中的“去糖”允许使用预先存在的语言特征来表示某些语言特征。这允许在字节码中表示它们,而无需对类文件格式进行重大更改。同样由于这个原因,编译器的后端比前端更稳定。这并不意味着每个新的语言特性都只是语法糖,绝对不是 lambda 和方法引用的情况。还有更多编译器中“脱糖”的例子:
您还可以调查字符串开关、类型擦除、...
【讨论】:
正如其他人所指出的,在计算机编程中以及在此上下文中,“糖”是指使代码更易于读/写的语言特性。 “脱糖”是指当编译器或运行时缺乏对含糖版本的本机支持时,自动将“糖”结构翻译成其他结构。
这些概念在 Android 环境中经常出现在 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"。根据这篇文章,lambda 实际上总是在 Android 二进制文件中去糖(“这就是为什么去糖总是在编译时发生,无论你的最低 API 级别如何。”)
【讨论】: