語法糖

語法糖(英語: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
. (原始內容存檔 (PDF)於2022-11-16).
- ^ 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
. (原始內容存檔於2024-07-07).
- ^ 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) (英語).