语法糖

语法糖(英語:Syntactic sugar)是由英国计算机科学家彼得·蘭丁发明的一个术语,指计算机语言中添加的某种语法,用于简化代码阅读和表达的语法结构。它使语言更易于理解和使用:表达更清晰、更简洁,或者采用某些人偏好的另一种风格。这种语法对语言的功能没有影响,但是更方便程序员使用。语法糖让程序更加简洁,有更高的可读性。语法糖通常是常见操作的简写,也可以用另一种更冗长的形式表达:程序员可以选择使用较短的形式还是较长的形式,但通常会使用较短的形式,因为它更短,更容易输入和阅读。
举例来说,许多程序语言提供专门的语法来对数组中的元素进行引用和更新。从理论上来讲,一个数组元素的引用涉及到两个参数:数组和下标,比如这样的表达式:get_array(Array, vector(i, j))。然而,许多语言支持这样直接引用:Array[i, j]。同理,数组元素的更新涉及到三个参数:set_array(Array, vector(i, j), value),但是很多语言提供直接赋值:Array[i, j] = value。
如果程序语言中的某个语法可以从语言中删除而不会对语言的功能产生任何影响,那么它就是语法糖,因为即使删除它语言的表达能力也能保持不变。语言处理器(包括编译器和静态分析器)通常会在处理之前将带糖的构造扩展为更冗长的等效项,这一过程有时称为“脱糖”(desugaring)。
历史
[编辑]“语法糖”一词由彼得·兰丁于1964年提出,用于描述一种类似ALGOL的简单编程语言的表面语法。这种语言的语义定义基于λ演算的应用表达式[1][2],其核心在于用“where”替换 λ。
后来的编程语言,例如CLU、ML和Scheme,扩展了该术语,将其用于指代语言内部的语法,这种语法可以用语言核心的基本构造来定义;方便的、更高级别的特性可以被“脱糖”并分解为该子集[3]。这实际上就是数学中从基本元素向上构建的常用方法。
基于兰丁对基本语言构造和语法糖的区分,马蒂亚斯·费莱森于1991年提出了“表达能力”的编码,以符合文献中“普遍接受的观点”。他将“更具表现力”定义为:如果没有所讨论的语言结构,程序就必须完全重新组织。[4]
語法糖的例子
[编辑]for循环
[编辑]一个例子是C語言中的for循环:
for (i = 0; i < 10; i++) {
// P
}
其效果在不考虑for循环中的continue语句时和以下的while循环是一樣的,其中P是循环要處理的主體。
i = 0;
while (i < 10) {
// P
i++;
}
中置表示法
[编辑]Haskell雖然是函數程式語言,但它提供了a + b這種「中置表示法」的語法,讓程式更容易撰寫,也比較容易閱讀。
运算符重载
[编辑]C++提供了运算符重载,可以把運算符當作函式來寫,當使用運算子就等同於使用該函式,讓程式更容易撰寫,也比較容易閱讀。
關聯陣列
[编辑]Javascript和Lua中物件的「鍵」如果不使用底線以外的符號、數字不做開頭時可以使用物件成員方式來取的「值」。若不符合上述規則僅能使用陣列索引方式取得「值」。
以Javascript來舉例:
let a = { 'abc': 5, '12w': 6, '>': 7, '_': 8 };
console.log(a.abc); //因為「鍵」符合規則,所以可以直接使用物件成員方式來取得「值」。
console.log(a["abc"]); //也能用陣列索引的方式取得「值」。
console.log(a["12w"]); //因為「鍵」是數字開頭,所以僅能以陣列索引方式取得「值」。
console.log(a[">"]); //因為「鍵」有使用到符號,所以僅能以陣列索引方式取得「值」。
console.log(a._); //雖然「鍵」有使用到符號,但是因為Javascript中底線可以當作變數名稱,所以可以使用物件成員方式來取得「值」。
差異在於如果使用陣列索引的話「鍵」需要加上「中括號」和「字串引號」,但是物件成員只要加上「小數點」能讓程式碼看起來更加簡潔。
批评
[编辑]一些程序员认为这些语法可用性特性要么无关紧要,要么完全是无意义的。值得注意的是,特殊的语法形式会使语言变得不统一,规范更加复杂,并且随着程序规模和复杂性的增加,可能会引发问题。这种观点在Lisp社区尤为普遍,因为Lisp的语法非常简单且规则,而且其表面语法很容易修改。[5]例如,艾伦·佩利曾在《编程格言》(Epigrams on Programming)中,在谈到括号分隔的语言时,戏谑地说:“语法糖会导致分号患上癌症。”[6]
衍生詞語
[编辑]语法盐
[编辑]语法盐(英語:syntactic salt)指的是不容易写出坏代码的语法特性。这些特性强迫程序员做出一些基本不用于描述程序行为,而是用来证明他们知道自己在做什么的额外举动。
语法糖精
[编辑]语法糖精(英語:syntactic saccharine),或者说语法糖浆(英語:syntactic syrup),指的是未能让编程更加方便的附加语法[7][8]。
註釋
[编辑]- ^ Landin, Peter J. The mechanical evaluation of expressions (PDF). The Computer Journal (Computer Journal). 1964, 6 (4): 308–320 [21 July 2014]. doi:10.1093/comjnl/6.4.308
.
- ^ Abelson & Sussman 1996,Chapter 1, footnote 11.
- ^ Barbara Liskov, "A History of CLU", MIT Laboratory for Computer Science Technical Report 561 (1993)
- ^ Felleisen, Matthias. On the Expressive Power of Programming Languages. Science of Computer Programming (Springer-Verlag). December 1991, 17 (1–3): 35–75 [19 July 2014]. doi:10.1016/0167-6423(91)90036-W
.
- ^ Abelson & Sussman 1996,Chapter 1, footnote 11.
- ^ Perlis 1982,Epigram #3.
- ^ syntactic sugar. catb.org. [2015-08-03]. (原始内容存档于2017-04-07).
- ^ Boiten, Eerke A.; Möller, Bernhard. Mathematics of Program Construction: 6th International Conference, MPC 2002, Dagstuhl Castle, Germany, July 8-10, 2002. Proceedings. Springer Science & Business Media. 2002-06-26: 93. ISBN 978-3-540-43857-1 (英语).
參考文獻
[编辑]- Abelson, Harold; Sussman, Gerald Jay; Sussman, Julie. Structure and Interpretation of Computer Programs. Cambridge, MA: MIT Press. 1996 [1984]. ISBN 0-262-51087-1.
- Landin, P. J. Correspondence between ALGOL 60 and Church's Lambda-notation: part I. Communications of the ACM. 1965-02, 8 (2): 89–101 [2022-01-16]. ISSN 0001-0782. S2CID 6505810. doi:10.1145/363744.363749. (原始内容存档于2022-01-13) (英语).
- Landin, Peter J. Programming Without Imperatives – An Example. UNIVAC Systems Programming Research. 1965-03.
- Landin, P. J. Getting rid of labels. Higher-Order and Symbolic Computation. 2009-12, 22 (4): 315–329. ISSN 1388-3690. doi:10.1007/s10990-010-9057-5 (英语).
- Landin, Peter J. A Generalization of Jumps and Labels. UNIVAC Systems Programming Research. 1965-08., reprinted in Landin, Peter J. A Generalization of Jumps and Labels. Higher-Order and Symbolic Computation. 1998-12-01, 11 (2): 125–143. CiteSeerX 10.1.1.85.2610
. ISSN 1573-0557. doi:10.1023/A:1010068630801 (英语). - Perlis, Alan J. Special Feature: Epigrams on programming. ACM SIGPLAN Notices. 1982-09, 17 (9): 7–13 [2022-01-16]. ISSN 0362-1340. S2CID 20512767. doi:10.1145/947955.1083808. (原始内容存档于2022-05-10) (英语).