【问题标题】:What are "sugar", "desugar" terms in context of Java 8?Java 8 上下文中的“糖”、“脱糖”术语是什么?
【发布时间】:2014-03-30 10:22:47
【问题描述】:

我在 Java 8 中经常听到“加糖”和“脱糖”,这些术语是什么意思?它们是概念性的还是句法性的。

一些例子:

默认迭代循环转为 java

关于编译中语法糖的观察。

【问题讨论】:

    标签: java semantics java-8


    【解决方案1】:

    sugar,在编程中,通常是指那些 sweet 添加,主要是快捷方式,使某些结构更易于键入和阅读(后者实际上是,在程序的生命周期中最重要)。

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

    这里有几个例子:

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

    Java 被广泛认为不够简洁,尤其是与现代语言相比。这就是为什么那些有助于使代码更快阅读的添加受到欢迎的原因。

    最后,我只想指出,虽然缺少糖会使您的程序变胖,但过多的糖会导致编写相同内容的多种不同方式,这会使您的语言变得令人不安,并且您的程序不那么连贯和更难维护。另一种糖,API 糖,通常是一种瘟疫,它使 API 更难掌握,尤其是当它由添加(例如重载)组成时。

    话虽如此,desugaring 指的是

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

    【讨论】:

    • +1 您还可以提及脱糖部分,因为这将完成 OP 要求的答案! :)
    • @justhalf 想一想,当您能够删除所有为传递函数而创建的接口时,您的程序将会变得多么薄。
    • “语法糖会导致分号癌。” ——艾伦·佩利斯
    • 在 C 语言的早期,后缀和前缀运算符曾经不是语法糖。按照今天的标准,早期的编译器是愚蠢的,这些运算符可以用一条机器代码指令来实现,但等效的赋值语句却不能。因此,他们能够编写更高效的程序。
    • @justhalf 这个问题引起了很多关注。在这些情况下,管理员删除似乎没有建设性的 cmets 并不少见。我不认为你的评论必须被删除,但它并没有带来什么。
    【解决方案2】:

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

    "Translation of Lambda Expressions" 上的这份文档包含有关正在发生的事情的真实细节,如果您对细节感兴趣的话。

    文档中的一个关键短语:

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

    【讨论】:

      【解决方案3】:

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

      • for 每个循环都“脱糖”为 C 风格的 for 循环
      • 断言被“脱糖”到 if 语句中
      • 内部类表示为独立类

      您还可以调查字符串开关、类型擦除、...

      【讨论】:

        【解决方案4】:

        正如其他人所指出的,在计算机编程中以及在此上下文中,“糖”是指使代码更易于读/写的语言特性。 “脱糖”是指当编译器或运行时缺乏对含糖版本的本机支持时,自动将“糖”结构翻译成其他结构。

        这些概念在 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 级别如何。”)

        【讨论】:

          猜你喜欢
          • 2020-03-07
          • 2015-05-24
          • 1970-01-01
          • 2014-01-03
          • 1970-01-01
          • 2011-04-21
          • 1970-01-01
          • 1970-01-01
          • 2021-07-09
          相关资源
          最近更新 更多