14

在 C#(和 Java)中,字符串只不过是一个具有存储长度和附加一些方法的 char 数组。同样,(除了引用与值之外)对象只不过是添加了继承和接口的美化结构。

在一个层面上,这些添加感觉像是对自己的清晰功能和增强。在另一个层面上,它们感觉像是从“句法糖”的地位的边缘升级。

为了进一步了解这个想法,请考虑(我可能有一些细节错误,但重点仍然存在):

transistor
elementary logic gate
compound gate
  |         |
 ALU    flip-flop
   |    |       |
   | register  RAM
   | |
   CPU
   microcode
   assembly
   C
   C++
   | |
MSIL JavaScript
C#   jQuery

很多时候,任何单一的抽象层看起来很像语法糖,但多层分离感觉彼此非常分离。

你怎么知道什么时候不再是语法糖而开始成为真正的功能?

4

9 回答 9

26

当它暗示一种不同的思维方式时,它被证明是一种特征而不是语法糖。

当您说对象实际上是具有方法和继承的美化结构时,您是对的。然而,这只是实现细节。对象允许以不同的方式思考。在考虑对象时,您可以更轻松地与现实世界的实体相关联。同样的事情发生在更早的时候,我们从使用 go-to's 跳转到过程编程。在引擎盖下,处理器仍然不断地从 OP 跳到 OP,但我们可以用一种不同的、更黑盒的方式来思考。

话虽如此,在极端情况下,您可以说一切都是语法糖,但是当它允许您以不同的方式思考时,其中一些糖是一种功能。

于 2009-09-07T18:06:21.153 回答
12

语法糖一个特性。

于 2009-09-07T17:54:48.447 回答
5

所有的软件都是建立在其他抽象之上的巨大抽象堆栈。一个字符串可能只不过是一个字符数组,但是有很多操作在字符串上感觉很自然,但在字符数组上却很尴尬。所有这些抽象的目标都是相同的:删除不相关的细节,以便开发人员可以专注于问题的重要部分。

正如您所指出的,所有现代编程语言都可以被淘汰,我们可以重新使用汇编语言。但是我们的生产力会直线下降。

我猜当人们觉得从某种东西中获益不多时,他们称其为语法糖,而当他们觉得从中获得很大好处时,他们称其为功能。这使得区分非常模糊,而且非常主观。

于 2009-09-07T17:52:58.250 回答
5

变化何时提供价值?我已经在汇编程序中编码。我切换到 C 并查看编译器的输出。它的代码比我手工制作的汇编程序好 95% 以上,而且更容易编写。对我来说,它提供了价值,所以我会说它不是糖。

C++ 帮助我将面向对象的思想转化为代码。只要开销不是非常高,那么我认为这是一个功能。

我是个实用型的。“如果我能看到它的价值”是我的回答

于 2009-09-07T18:07:59.093 回答
3

“语法糖”是你不喜欢的功能

于 2009-09-07T17:59:55.427 回答
3

似乎语法 surgar 是一种不会改变语言能力的语法,并且使用不同的结构可以完成完全相同的事情。字符串(用 Java 思考)不仅仅是 char 数组上的语法糖。char 数组是可变的(如果不是长度,则在内容上)。如果没有 String 数组,您无法使用现有语言功能使 char 数组不可变。

另一方面,处理字符串的加号运算符确实是使用 StringBuilder 和调用 append 的语法糖。

于 2009-09-07T18:21:02.467 回答
2

我不得不说,当使用与使用语法糖相同类型的“时间约束”时,不能简单地通过编写不同的代码来实现相同的结果。

我的示例将是一个 Lambda 表达式,编写一个foreach循环并不需要太多的努力,但使用.Foreach()肯定也很好;而不是自己重写整个HttpRequest课程。一个是语法,一个是特征。两者都节省时间,一个比另一个大得多。

于 2009-09-07T17:52:27.170 回答
1

通常,术语“语法糖”指的是语言特性,它永远不允许程序员做以前不能做的事情,而是提供了一种很好的方式来表达已经用语言表达的东西,即使有点尴尬。

某些结构可能被明确地视为句法糖。例如,在 VB.NET 中,用于测试两个引用是否不相等的代码用于 requireIf Not (ref1 Is Ref2)但较新版本的语言允许If ref1 IsNot Ref2. 新语法不能表达旧语法不能表达的东西,但是新语法更简洁,不会引入歧义,唯一不使用它的原因是代码必须与旧版本向后兼容的语言。

有些结构可能有点难以定义为糖。特别是,如果一种语言添加了在与其他类型一起使用时与现有结构相同的结构,但在与其他类型一起使用时将无法编译,则此类结构可以提供一种以前不存在的编译时类型验证方法。Java 泛型通常可以从这个角度来看待。将 a 添加Cat到 anArrayList<Cat>就像添加到ArrayList;一样容易。ArrayList<Cat>增加的是拒绝的后卫Dogs 在编译时。由于编译时约束不允许编写任何没有它们就无法编写的程序,因此有些人可能会将它们视为语法糖。另一方面,即使类型验证是在编译时而不是运行时执行的,它仍可能被视为程序的一项工作。

于 2014-06-24T18:08:48.207 回答
0

语法糖和语言特征基本上描述的是同一件事,即使语法糖有时以贬义的方式使用,而特征通常与语言架构的更深层次的变化相关(引入 lambda 等)。但是这种区别在很大程度上取决于个人观点(以及主观感觉的有用性)。

关于语言设计方面和您的示例stringsand char-arrays,我想说这既不是功能也不是糖,而是可以简单地用语言基本语法(LOP - 面向语言的编程)表达。通用概念(类型类、元编程等)允许您自己表达许多新的和有用的结构,而无需等待语言获得新功能。看看 Haskell 或 C++ 的元编程能力。

于 2009-09-07T18:11:25.450 回答