句法糖与特征

时间:2009-09-07 17:47:51

标签: language-agnostic syntax syntactic-sugar

在C#(和Java)中,字符串只是一个具有存储长度和一些方法的字符数组。同样地,(参考与值之外的东西除外)对象只不过是带有继承和接口的美化结构。

在某种程度上,这些新增功能感觉就像是清晰的功能和增强功能。在另一个层面上,他们觉得从“语法糖”的状态略微升级。

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

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

很多时候,任何单一的抽象层看起来都像语法糖,但是多层分离感觉彼此之间的隔离感很差。

你怎么知道什么东西不再是语法糖并开始成为真正的功能?

10 个答案:

答案 0 :(得分:23)

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

当你说对象实际上是带有方法和继承的美化结构时,你是对的。然而,这只是实施细节。对象允许以不同的方式思考。在考虑对象时,您可以更轻松地与现实世界实体联系。同样的事情发生在更进一步的时候,我们从使用go-to跳到程序编程。在引擎盖下,处理器仍然保持从OP到OP的jmp'ing,但我们可以用不同的,更黑盒子的方式思考。

话虽如此,在极端情况下,你可以说一切都是语法糖,但是当它允许你以不同的方式思考时,一些糖是一个特征。

答案 1 :(得分:12)

语法糖的一项功能。

答案 2 :(得分:5)

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

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

我猜人们在感觉到它们从中获得的好处时会称之为语法糖,并且当他们觉得从中获得很大的好处时,这就是一种特征。这使得区分非常模糊,而且非常主观。

答案 3 :(得分:5)

当变化提供价值时?我用汇编语言编写了代码。我切换到C并查看编译器的输出。它的代码是95 +%和我手工制作的汇编程序一样好,而且编写起来要容易得多。对我来说,提供了价值,所以我说它不是糖。

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

我是一个实用的人。 “如果我能看到它很有价值”是我的回答

答案 4 :(得分:3)

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

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

答案 5 :(得分:2)

我不得不说,只是通过编写不同的代码,使用与使用语法糖相同类型的“时间约束”,无法实现相同的结果。

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

答案 6 :(得分:2)

“Syntactic sugar”是您不喜欢的功能

答案 7 :(得分:1)

一般来说术语"句法糖"指的是从未允许程序员做过以前无法做的事情的语言特性,而是提供了表达已经用语言表达的东西的好方法,即使有点笨拙。 / p>

某些构建体可以明确地视为语法糖。例如,在VB.NET中,用于测试两个引用是否相等的代码用于需要If Not (ref1 Is Ref2),但该语言的较新版本允许If ref1 IsNot Ref2。新语法中没有任何东西可以用旧语法表达,但新语法更清晰,没有引起歧义,唯一不使用它的原因是代码必须与后者兼容旧版本的语言。

某些结构可能有点难以定义为糖。特别是,如果一种语言添加的构造在与其他类型一起使用时将与现有构造完全相同,但是与其他类型的编译失败,这种构造可能提供以前不存在的编译时类型验证的方法。通常可以从这个角度来看待Java泛型。可以像Cat一样轻松地向ArrayList<Cat>添加ArrayList; ArrayList<Cat>添加的是在编译时拒绝Dog的守卫。由于编译时限制不允许人们编写任何没有它们而无法编写的程序,因此有些人可能会将它们视为语法糖。另一方面,即使在编译时而不是运行时执行类型验证,它仍可能被视为程序的一个作业。

答案 8 :(得分:0)

“懒惰是进步的动力” 当您可以立即将想法映射到机器上时,此过程将停止。

答案 9 :(得分:0)

语法糖和语言功能基本上描述了同样的事情,即使语法糖有时以贬义方式使用,而功能通常与更深层次的变化相关联。语言架构(介绍lambdas等)。 但这种区别在很大程度上取决于个人的观点(以及其主观上的有用性)。

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