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

问题描述 投票:94回答:3

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

一些例子:

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

编辑中的句法糖观察。

java semantics java-8
3个回答
116
投票

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

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

这里有一些例子 :

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

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

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

这就是说,desugaring指的是

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

14
投票

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

关于"Translation of Lambda Expressions"的这个文件似乎有关于如果你对细节感兴趣的事情的真实细节。

该文件的一个关键短语:

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


5
投票

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

  • 对于每个循环都是“desugared”到C风格的循环
  • 断言是对“if”句子的“贬低”
  • 内部类表示为独立类

您还可以调查String开关发生的情况,键入擦除,...

© www.soinside.com 2019 - 2024. All rights reserved.