语法糖的严格定义?[关闭]


9

在语言圣战中,人们似乎不断地贬低他们认为不是特别有用的任何功能,例如“仅是语法糖”。在这些辩论中,“真实特征”与“句法糖”之间的界线往往变得模糊。您认为语法糖的合理而明确的定义是什么,它避免将其定义为说话者/作者没有用的任何功能?

Answers:


19

怎么样了:“语法糖是某些功能的便捷速记,它不会引入任何有意义的抽象层。”

a->b如您所指出的,Take 等价于(*a).b。此符号是否允许您以任何有用的方式(否则隐藏方式)考虑代码?不,所以是语法糖。

现在考虑a[i] == *(a + i)。考虑任何以任何实质性方式使用数组的C程序。您能想象不使用[]符号来理解它吗?使用多维数组?将数组视为整个单元是有意义的,而不是作为对连续内存块开始的引用。如果您打算对数组进行复杂的操作确实有助于了解数组在C中的工作原理,但始终必须考虑“我需要在内存的右边存储2 * i字节的两位内存”,这毫无用处。所引用的内存位置a。” 数组的重点是能够抽象化将序列存储为相干单元的过程。该[]符号有助于这种抽象。这不是语法糖。

这并不是说语法糖总是坏事。像许多典故一样,它已成为一个绰号,并与“真实特征”相对立。但是,如果不是let简写形式(和其他形式),则LISP和Scheme将不可读。

三元运算符<pred> ? <cnsq> : <alt>是另一个示例。语法糖可以帮助组织程序并删除冗余代码,这可以节省日常维护成本。如果语法糖有助于消除编程的语法障碍,那么有时它可能比堆积在“真实特征”上更为可取。

R ^ 5RS引用,“编程语言的设计不应通过在功能之上叠加功能来实现,而应消除那些使附加功能显得必要的弱点和限制。” 恕我直言,语法可以说是弱点和局限性,因此让程序员摆脱语法可以提高语言的表达能力。


7

恕我直言,我认为您无法对语法糖进行定义,因为该短语是BS,很可能被那些在“真实操作系统”上使用“真实工具”谈论“真实程序员”的人使用。

之所以获得其学士学位,是因为“真实特征”或“语法糖”的想法就像没有真正的苏格兰谬论。因为这些短语是“临时保留不合理断言的尝试”。这里的断言是这里的功能微不足道,因为您可以改用“真实功能”。

它的BS,因为有人认为应避免使用糖,因为您可以编写错误,但应坚持使用糖因为它更难编写错误。那不是很棒 使用相同的逻辑,相同的短语会得出完全相反的结论。

它的BS,因为没有人引用可用性研究或缺陷计数研究来支持其可读性或可维护性或可能的缺陷论证。

它的BS,是因为人们经常对等或对等。例如,此问题断言C#字符串是char数组的糖。他们不是

但是,如果您想说两件事在语义上是等效的,那么它们就是糖,这可以帮助您继续进行定义。

如果您想对某人不屑一顾,也可以使用该短语。


2
“如果您想对某人不屑一顾,您也可以使用该短语。” -就像:“你见过芭芭拉吗?她是我们的句法糖”。
molf 2010年

@molf。真有趣。我想我的意思是某人的想法,工作或工具。就像:“您遇到芭芭拉了吗,她认为她是一个真正的编码员,但是她使用了太多糖。” 或“ Barbra是Bar ++ v8.0的专家,但8.0确实只是7.0,而且糖量很大。”
康拉德·弗里克斯

7

这是一个相关概念的非常严格的定义:表达性,由
Matthias Felleisen撰写:

关于编程语言的表达能力 [后记是我能找到的唯一自由格式。

另请参阅有关Java语言和闭包的条目。

实际上,如果可以通过仅进行局部更改而将其更改为不具有语法的形式,则该语法就是糖。例如,如果没有语法格式,则需要更改几个不同的代码位置,或将片段移动到其他位置,那么它就不是糖。

也就是说,适当使用语法糖是可以的。我认为,任何Scheme程序员都希望有一种let特殊的形式,而不是必须先创建一个新的匿名函数然后应用它,这将做同样的事情。目的是使代码更清晰。


5
+1:语法糖很重要。现代代数符号只是它所代替的拉丁散文的句法糖,但是它在我们的数学推理能力上却有很大的不同。
凯文·克莱恩

3

我认为“ 语法糖 ”一词表示表达相同底层语义的另一种语法。

以一种编程语言A为例,该编程语言A的操作sum可以累加任意长度的整数列表。用这种语言我们可以写表达式

sum []
sum [3, 4, 5, 1]
sum [2, 7]

其结果分别为0、13和9。

现在,假设我们意识到90%的时间使用sum两个参数,因此为了方便起见,我们引入了新的符号

2 + 7

这只是语法糖sum [2, 7]

现在,使用第二种语言B,该语言没有任何加法运算。我们可能有类似<,的运算符=,允许我们比较数字,但无法添加数字。在语言B的版本2中,我们引入了一个新的带有语法的加法运算

2 + 7

像往常一样增加数字。

在语言A的上下文中,该+表示法是语法糖(它是一种替代,简化和即席的表示法,可以代替该sum [...]表示法使用)。同样,正如Hoa Long Tam的答案所指出的那样,在C中,表示法p->field是的语法糖(*p).field

在语言B的上下文中,该+符号不是语法糖(这是用于求和运算的唯一有效语法)。同样,如果C只能通过指针访问结构成员,并且如果没有符号(*p).field,则该符号p->field将不是语法糖。

我认为,关于语法糖的误解可以追溯到关于编程语言语义的混淆。推理是这样的:

  • 程序的语义是程序计算的内容。
  • 编程语言的表达能力由可以用该语言描述的计算表示。
  • 两种可以描述所有可计算功能的编程语言(使用图灵机定义)具有相同的表达能力...
  • ...因此仅在语法上有所不同。
  • 结论:图灵完备的语言的任何扩展仅是语法(语法糖),因为您不会改变该语言的表达能力。

上面的推理导致了诸如“无法正确定义语法糖”,“口味问题”或“毕竟每种编程语言功能都只是语法糖”之类的通用断言。

我认为上述论点的主要问题在于语义不仅与程序可以计算的内容有关,而且还与如何计算语义有关,即,使用了什么原始构造以及如何将它们组合在一起。

因此,例如,对象不是底层位配置和位转换的语法糖,而是一种可以对数据和操作进行建模并描述计算的构造。使用对象,方法,方法调用进行的计算与使用字节,处理器寄存器,内存地址进行的计算(即使两种计算的结果相同,即使第二种计算用于实现第一种计算)也不相同。

我做了很长的描述,但是我认为这是一个重要的方面,我在其他答案中都没有提到。

底线:语法糖是一种已经存在于某种语言中并且已经具有明确定义的语法和语义的构造的替代(可能更方便)语法。新语法(语法糖)与现有语法不同,但具有相同的语义。如果以一种语言和一种新语法引入一种新的构造,那么您就没有语法糖。


0

语法糖是一种功能,它不会扩展语言本身的表达能力,因此是多余的,有时甚至是符号的滥用,但它既简化了作者的生活,又为读者提供了更多的见识。


0

为了回答我自己的问题,一个功能是语法糖,当且仅当它被包括主要是为了增强美观性和可读性,并且可以以大约一对一的方式被琐碎地翻译成减糖版本。(我大致是一对一的,指的是模微不足道的东西,例如交换运算的顺序,变量名和空格。)

只能由大量程序员约束才能使用的任何功能都不是语法糖。作为其子集,任何增加类型安全性的功能都不是语法糖,因为通过程序员的纪律来手动实施类型安全性是非常重要的。例如,C ++的对象系统不只是C指针强制转换多态性之上的语法糖。

如果删除了任何功能,那么它们都将需要大量的代码重复或进行重大的重新设计,这都不是语法上的糖,因为这些功能都不是一件小事。例如,模板不仅是语法糖,因为没有它们就获得等效的功能将需要大量的克隆和修改。

的东西,例如语法糖:

a[i] 代替 *(a + i)

a -> b 代替 (*a).b

foreach 而不是手动键入迭代器语法。

所有运算符重载都是纯语法糖。

这听起来像一个公平且合理明确的定义吗?


3
运算符重载不是语法糖。这就是使C ++具有适用于基本类型(例如int)和我自己的类的模板的原因。
凯特·格雷戈里

@KateGregory:如果人们接受函数重载不是语法糖,则可以将操作符重载视为简单地在指示值上调用可重载函数的语法糖。
2012年

0

“语法糖”不是严格定义的术语。根据您询问的人,您很可能会获得以下几种定义之一:

  1. 没有真正的苏格兰人的方法。我喜欢的东西是真正的编程,而我不喜欢的东西是语法糖。
  2. MIPS之后的所有内容都是语法糖,甚至其中的某些说明可能也没有必要。
  3. 任何使某人的编程变得容易的事情都是有用的,而不是语法糖。由于如果没有人发现它在任何情况下都有用,就不会添加该功能,因此可以得出结论,每个现有功能都不是语法糖。假设功能可能是语法糖,直到有人认为该功能对他们有用。

-3

我不确定计算机科学领域内的内容,但是对于逻辑领域,定义的保守性和可消除性[ 1 ] 的概念似乎是一致的。

应用库里-霍华德的对应关系,人们也许可以提出关于“句法糖”的平行概念。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.