语法糖(英語:Syntactic sugar)是由英国计算机科学家彼得·蘭丁发明的一个术语,指计算机语言中添加的某种语法,用于简化代码阅读和表达的语法结构。它使语言更易于理解和使用:表达更清晰、更简洁,或者采用某些人偏好的另一种风格。这种语法对语言的功能没有影响,但是更方便程序员使用。语法糖让程序更加简洁,有更高的可读性。语法糖通常是常见操作的简写,也可以用另一种更冗长的形式表达:程序员可以选择使用较短的形式还是较长的形式,但通常会使用较短的形式,因为它更短,更容易输入和阅读。

Go语言中简短声明语法糖的代码示例

举例来说,许多程序语言提供专门的语法来对数组中的元素进行引用和更新。从理论上来讲,一个数组元素的引用涉及到两个参数数组下标,比如这样的表达式: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”替换 λ。

后来的编程语言,例如CLUMLScheme,扩展了该术语,将其用于指代语言内部的语法,这种语法可以用语言核心的基本构造来定义;方便的、更高级别的特性可以被“脱糖”并分解为该子集[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++提供了运算符重载,可以把運算符當作函式來寫,當使用運算子就等同於使用該函式,讓程式更容易撰寫,也比較容易閱讀。

關聯陣列

编辑

JavascriptLua中物件的「」如果不使用底線以外的符號、數字不做開頭時可以使用物件成員方式來取的「」。若不符合上述規則僅能使用陣列索引方式取得「值」。

以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]

註釋

编辑
  1. ^ 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 . (原始内容存档 (PDF)于2022-11-16). 
  2. ^ Abelson & Sussman 1996,Chapter 1, footnote 11.
  3. ^ Barbara Liskov, "A History of CLU", MIT Laboratory for Computer Science Technical Report 561 (1993)
  4. ^ 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 . (原始内容存档于2024-07-07). 
  5. ^ Abelson & Sussman 1996,Chapter 1, footnote 11.
  6. ^ Perlis 1982,Epigram #3.
  7. ^ syntactic sugar. catb.org. [2015-08-03]. (原始内容存档于2017-04-07). 
  8. ^ 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 (英语). 

參考文獻

编辑

📚 Artikel Terkait di Wikipedia

F♯

F#是由微软发展的为.NET语言提供运行环境的程序设计语言,是函數程式語言(FP,Functional Programming),函數程式語言最重要的基礎是Lambda Calculus。它是基于OCaml的,而OCaml是基于ML函数程式语言。有時F#和OCaml的程式是可以交互編譯的。

Lua

array data type)。第一个自动索引是1而非0,因为很多其他编程语言都这样(尽管显式的索引0是允许的)。 数值键1不同于字符串键"1"。 array = { "a", "b", "c", "d" } -- 索引被自动赋予。 print(array[2]) -- 打印"b"。在Lua中自动索引开始于1。

C语言

#include <stdlib.h> //调用分配内存需要的函数 int *array = (int *)malloc(5 * sizeof(int)); // 分配一個包含五個整數的數組 free(array); // 釋放使用malloc分配的內存

分区全局地址空间

Space Languages: Co-Array Fortran and Unified Parallel C" (页面存档备份,存于互联网档案馆) OpenSHMEM. [2019-12-12]. (原始内容存档于2019-12-09). The Programming Models and Languages

动态数组

在计算机科学中,动态数组(dynamic array),也称为:可增长数组(growable array)、可调大小数组( resizable array)、动态表格( dynamic table)、可变化数组(mutable array)或数组列表(array

代码风格

代码风格(英語:Programming style)即程序开发人员所编写源代码的书写风格。良好的代码风格会帮助程序员阅读和理解符合该风格的源代码,并且避免错误。 关于该主题的经典著作是 1970 年代编写的《编程风格的要素》(英语:The Elements of Programming Style),并以当时流行的

ALGOL 68

68的特征包括基于表达式(英语:Expression-oriented programming language)的语法,用户声明的类型和结构与标签联合类型,变量与引用参数的引用模型,可变长数组和字符串、数组与矩阵的分片(英语:array slicing),用户定义的运算符和运算符重载,高阶函数与匿名函数,以及并发。

J语言

Group on APL, reinterpreted the “APL” in its name in early 2009 as Array Programming Languages, so that J, k, Nial, etc. would be included in its purview