อ่าน 6 นาที
น้ำตาลสังเคราะห์
ใน วิทยาการคอมพิวเตอร์ ไวยากรณ์ แบบย่อ (Syntactic sugar) คือ ไวยากรณ์ ภายใน ภาษาโปรแกรม ที่ออกแบบมาเพื่อให้การอ่านหรือการแสดงออกง่ายขึ้น ทำให้ภาษานั้น "น่าใช้"...
น้ำตาลสังเคราะห์

ในวิทยาการคอมพิวเตอร์ไวยากรณ์แบบย่อ (Syntactic sugar)คือไวยากรณ์ภายในภาษาโปรแกรมที่ออกแบบมาเพื่อให้การอ่านหรือการแสดงออกง่ายขึ้น ทำให้ภาษานั้น "น่าใช้" มากขึ้นสำหรับมนุษย์: สามารถแสดงออกได้อย่างชัดเจน กระชับ หรือในรูปแบบอื่นที่บางคนอาจชอบ ไวยากรณ์แบบย่อโดยทั่วไปจะเป็นตัวย่อสำหรับการดำเนินการทั่วไปที่สามารถแสดงออกในรูปแบบอื่นที่ยาวกว่าได้ โปรแกรมเมอร์มีทางเลือกที่จะใช้รูปแบบที่สั้นกว่าหรือรูปแบบที่ยาวกว่า แต่โดยปกติแล้วจะใช้รูปแบบที่สั้นกว่าเนื่องจากสั้นกว่าและพิมพ์และอ่านง่ายกว่า
ตัวอย่างเช่น ใน ภาษาโปรแกรม Pythonเราสามารถดึง องค์ประกอบ ของลิสต์ที่ดัชนี ที่กำหนดได้ โดยใช้ไวยากรณ์ `get_element_at_index` list_variable.__getitem__(index)แต่โดยทั่วไปมักจะย่อเป็น `get_element_at_index` list_variable[index]ซึ่งอาจถือว่าเรียบง่ายและอ่านง่ายกว่า แม้ว่าจะมีพฤติกรรมเหมือนกันก็ตาม ในทำนองเดียวกัน `get_element_at_index` ก็list_variable.__setitem__(index, value)มักจะย่อเป็น `get_element_at_index` list_variable[index] = valueเช่น กัน
โครงสร้างในภาษาหนึ่งๆ เรียกว่า "ไวยากรณ์เสริม" (syntactic sugar) หากสามารถลบออกจากภาษาได้โดยไม่ส่งผลกระทบต่อความสามารถของภาษา กล่าวคือฟังก์ชันการทำงานและพลังในการแสดงออกยังคงเหมือนเดิม
โปรแกรมประมวลผลภาษา รวมถึงคอมไพเลอร์และตัววิเคราะห์สแตติกมักจะขยายโครงสร้างที่ลดรูปให้เป็นรูปแบบที่ละเอียดกว่าก่อนที่จะประมวลผล ซึ่งกระบวนการนี้บางครั้งเรียกว่า "การลดรูปโครงสร้าง" (desugaring)
ต้นกำเนิด
คำว่าsyntactic sugarถูกบัญญัติโดยPeter J. Landinในปี พ.ศ. 2507 เพื่ออธิบายไวยากรณ์พื้นผิวของ ภาษาโปรแกรมแบบ ALGOL ที่เรียบง่าย ซึ่งถูกกำหนดความหมายตามนิพจน์ประยุกต์ของแคลคูลัสแลมบ์ดา [ 1 ] [ 2 ]โดยเน้นที่การแทนที่ λ ด้วย "where" ในเชิงคำ ศัพท์
ภาษาโปรแกรมรุ่นหลัง เช่นCLU , MLและSchemeได้ขยายคำนี้เพื่ออ้างถึงไวยากรณ์ภายในภาษาซึ่งสามารถกำหนดได้ในแง่ของแกนหลักของภาษาของโครงสร้างพื้นฐานที่จำเป็น คุณสมบัติระดับสูงที่สะดวกสามารถ "แยกย่อย" และแยกย่อยเป็นชุดย่อยนั้นได้[ 3 ]อันที่จริง นี่คือการปฏิบัติทางคณิตศาสตร์ตามปกติของการสร้างขึ้นจากองค์ประกอบพื้นฐาน
โดยอาศัยการแบ่งแยกของ Landin ระหว่างโครงสร้างภาษาที่จำเป็นและไวยากรณ์แบบย่อ ในปี 1991 Matthias Felleisenได้เสนอการกำหนดรหัสของ "พลังการแสดงออก" เพื่อให้สอดคล้องกับ "ความเชื่อที่แพร่หลาย" ในวรรณกรรม เขาให้คำจำกัดความของ "การแสดงออกที่มากขึ้น" ว่าหมายความว่าหากไม่มีโครงสร้างภาษาดังกล่าว โปรแกรมจะต้องได้รับการจัดระเบียบใหม่ทั้งหมด[ 4 ]
ตัวอย่างที่น่าสนใจ
- ในภาษา COBOLคำหลักระดับกลางหลายคำเป็นเพียงไวยากรณ์ที่ช่วยให้เขียนได้ง่ายขึ้น ซึ่งสามารถละเว้นได้ตามต้องการ ตัวอย่างเช่น ประโยค
MOVE A B.และประโยคMOVE A TO B.ทำหน้าที่เดียวกัน แต่ประโยคที่สองทำให้การกระทำที่จะต้องทำนั้นชัดเจนยิ่งขึ้น - ในภาษา Perl `@` เป็นรูปแบบการเขียนย่อสำหรับ`@` นอกจากนี้ คำสั่งใดๆ ก็สามารถตามด้วยเงื่อนไขได้ ดังนั้น `@` จึงเทียบเท่ากับ`@` แต่รูปแบบแรกนั้นดูเป็นธรรมชาติมากกว่าเมื่อเขียนในบรรทัดเดียว
unless(condition){...}if(notcondition){...}statementifconditionif(condition){...} - ในภาษา C สัญกรณ์ นี้
a[i]เป็นรูปแบบย่อทางไวยากรณ์สำหรับ*(a + i)[ 5 ] ในทำนองเดียวกันa->xสัญกรณ์นี้เป็นรูปแบบย่อทางไวยากรณ์สำหรับการเข้าถึงสมาชิกโดยใช้ตัวดำเนินการ(*a).xอ้างอิง - คำ
usingสั่งในC#ช่วยให้มั่นใจได้ว่าวัตถุบางอย่างจะถูกกำจัดอย่างถูกต้อง คอมไพเลอร์จะขยายคำสั่งเป็นบล็อกtry-finally [ 6 ] - ภาษา C++และCตั้งแต่เวอร์ชัน C23เป็นต้นไป อนุญาต
auto x = exprให้ใช้ตัวย่อสำหรับdecltype(expr) x = exprในภาษา C++ หรือtypeof(expr) x = exprในภาษา C ได้ - การสร้างลิสต์แบบเข้าใจง่ายในภาษา Python (เช่นสำหรับลิสต์ของสี่เหลี่ยมจัตุรัส) และตัวตกแต่ง (เช่น)
[x*xforxinrange(10)]@staticmethod - ในภาษา Haskellสตริงซึ่งเขียนด้วยเครื่องหมายอัญประกาศมีความหมายเทียบเท่ากับรายการของตัวอักษร ส่วนขยายภาษาเพิ่มเติมOverloadedStringsอนุญาตให้สตริงแบบลิเทอรัลสร้างค่าประเภทอื่นได้ เช่น ข้อความ ด้วยเช่นกัน
- ในชุดแพ็กเกจR tidyverse เครื่องหมาย ไปป์ (pipe) ซึ่งแสดงด้วยประกาศว่าข้อมูล (หรือผลลัพธ์ของฟังก์ชัน) ที่อยู่ก่อนหน้าเครื่องหมายไปป์จะทำหน้าที่เป็นอาร์กิวเมนต์แรกสำหรับฟังก์ชันที่อยู่หลังเครื่องหมายไปป์[ 7 ]ดังนั้นจึงเทียบเท่ากับ
%>%x %>% f(y)f(x,y) - ในSQLคำว่า `join`
JOINเทียบเท่ากับ `join`INNER JOINโดยคำหลังจะอธิบายเพิ่มเติมว่าคำสั่ง `join` นั้นเป็นการดำเนินการ `inner join` ไม่ใช่ `outer join` ในทำนองเดียวกัน เราสามารถละเว้น `join`OUTERจาก `join`LEFT OUTER JOINและRIGHT OUTER JOIN`FULL OUTER JOINjoin` ได้ - เมธอดส่วนขยายในภาษาโปรแกรมเชิงวัตถุ (OOP) ในรูปแบบของ
myObject.myMethod(parameter1, parameter2, parameter3)เมธอดแบบย่อ (syntactic sugar) สำหรับการเรียกฟังก์ชันส่วนกลาง (global function) ใน รูป แบบเมธอดแบบย่อ โดยจะส่งการอ้างอิงถึงอ็อบเจ็กต์เป็นอาร์กิวเมนต์ที่ซ่อนอยู่ ซึ่งโดยปกติจะสามารถเข้าถึงได้จากภายในเมธอดในรูปแบบอาร์กิวเมนต์แบบซ่อน (hidden argument )myMethod(myObject, parameter1, parameter2, parameter3)this - พารามิเตอร์ที่เรียกโดยการอ้างอิง (pass by reference)เป็นรูปแบบการเขียนโค้ดที่ช่วยให้เขียนได้ง่ายขึ้น โดยในทางเทคนิคแล้วจะส่งพอยน์เตอร์เป็นพารามิเตอร์ แต่ในทางไวยากรณ์จะจัดการพอยน์เตอร์นั้นเหมือนกับตัวแปร เพื่อหลีกเลี่ยงการเข้าถึงค่าที่พอยน์เตอร์ชี้โดยถูกต้องในโค้ดภายในฟังก์ชัน
- ภาษาโปรแกรมต่างๆ มีคำสั่ง import ที่อนุญาตให้เพิ่มสัญลักษณ์จากเนมสเปซ อื่น เข้ามาในขอบเขตปัจจุบันได้
- ในภาษา C++
usingคำสั่ง `import` เป็นตัวอย่างหนึ่งของการนำเข้าสัญลักษณ์เดียวเข้ามาในขอบเขต ในขณะที่using namespaceเนมสเปซจะนำเข้าสัญลักษณ์ทั้งหมดจากเนมสเปซนั้นเข้ามาในขอบเขต - ในภาษา C#
usingคำสั่ง `add` จะเพิ่มสัญลักษณ์ทั้งหมดจากเนมสเปซเข้าไปในขอบเขตการใช้งาน - ในภาษา Javaตัวแปร `and`
importเป็นตัวอย่างหนึ่ง ตัวอย่างเช่น `and`import javax.swing.*;ช่วยให้โปรแกรมเมอร์สามารถอ้างอิงถึง อ็อบเจ็กต์ Swing ได้ โดยjavax.swing.JButtonใช้เพียงชื่อJButtonเท่านั้น - ในภาษา Pythonคำ
from importสั่ง `import` จะนำเข้าสัญลักษณ์เพียงตัวเดียวเข้าสู่ขอบเขต ในขณะที่from import *คำสั่ง `import` จะนำเข้าสัญลักษณ์ทั้งหมดจากเนมสเปซนั้นเข้าสู่ขอบเขต - ในภาษา Rustคำ
useสั่ง `import` ใช้สำหรับนำเข้าสัญลักษณ์เข้าสู่ขอบเขตการใช้งาน
- ในภาษา C++
- ในJavaScriptหากคีย์และค่าในอ็อบเจ็กต์เหมือนกัน คุณสามารถเขียนเพียงครั้งเดียวได้ ตัวอย่างเช่น
{name: name}เทียบเท่ากับ{name}นี่เรียกว่าคุณสมบัติแบบย่อ (Shorthand Property)- ในJavaScriptเวอร์ชันES6ฟังก์ชันลูกศรมีรูปแบบย่อซึ่งเทียบเท่ากับรูปแบบเต็ม
(x) => x + 1(x)=>{returnx+1;}
- ในJavaScriptเวอร์ชันES6ฟังก์ชันลูกศรมีรูปแบบย่อซึ่งเทียบเท่ากับรูปแบบเต็ม
- ในScalaเครื่องหมายคำถามสามตัว (
???) เทียบเท่ากับซึ่งมีประโยชน์ในการทำเครื่องหมายตำแหน่งสำหรับโค้ดที่ยังไม่ได้เขียน[ 8 ]thrownewscala.NotImplementedError("an implementation is missing")
การวิจารณ์
โปรแกรมเมอร์บางคนรู้สึกว่าคุณสมบัติการใช้งานไวยากรณ์เหล่านี้ไม่สำคัญหรือไม่ก็ไร้สาระโดยสิ้นเชิง ที่น่าสังเกตคือ รูปแบบไวยากรณ์พิเศษทำให้ภาษามีความไม่สม่ำเสมอมากขึ้นและทำให้ข้อกำหนดซับซ้อนขึ้น และอาจก่อให้เกิดปัญหาเมื่อโปรแกรมมีขนาดใหญ่และซับซ้อน มุมมองนี้แพร่หลายเป็นพิเศษใน ชุมชน Lispเนื่องจาก Lisp มีไวยากรณ์ที่เรียบง่ายและสม่ำเสมอมาก และไวยากรณ์พื้นผิวสามารถแก้ไขได้ง่าย[ 9 ] ตัวอย่างเช่นAlan Perlisเคยพูดติดตลกใน " Epigrams on Programming " ในการอ้างอิงถึงภาษาที่คั่นด้วยวงเล็บว่า "Syntactic sugar ก่อให้เกิดมะเร็งของเครื่องหมายเซมิโคลอน " [ 10 ]
เงื่อนไขอนุพันธ์
เกลือเชิงไวยากรณ์
อุปมาอุปไมยนี้ได้รับการขยายความโดยการบัญญัติศัพท์คำว่าsyntactic saltซึ่งบ่งชี้ถึงคุณลักษณะที่ออกแบบมาเพื่อทำให้การเขียนโค้ดที่ไม่ดีทำได้ยากขึ้น[ 11 ]โดยเฉพาะอย่างยิ่ง syntactic salt เป็นอุปสรรคที่โปรแกรมเมอร์ต้องฝ่าฟันเพื่อพิสูจน์ว่าพวกเขารู้ว่าเกิดอะไรขึ้น แทนที่จะแสดงการกระทำของโปรแกรม
ในC#เมื่อซ่อนสมาชิกคลาสที่สืบทอดมา คอมไพเลอร์จะออกคำเตือน เว้นแต่newจะใช้คีย์เวิร์ดเพื่อระบุว่าการซ่อนนั้นเป็นไปโดยเจตนา[ 12 ]เพื่อหลีกเลี่ยงบั๊กที่อาจเกิดขึ้นเนื่องจากไวยากรณ์ของคำสั่ง switch คล้ายคลึง กับของ C หรือ C++ C# จึงกำหนดให้ต้องมีbreakสำหรับแต่ละป้ายกำกับที่ไม่ว่างเปล่าcaseของswitch(เว้นแต่ จะใช้ goto, return, หรือthrow) แม้ว่าจะไม่อนุญาตให้มีการทะลุผ่านโดย ปริยายก็ตาม [ 13 ] (การใช้ และการระบุป้ายกำกับที่ตามมาจะทำให้เกิด การทะลุผ่านgotoแบบ C/C++ )
การใช้เทคนิค Syntactic salt อาจทำให้โค้ดอ่านยากและคุณภาพลดลง ซึ่งในกรณีที่รุนแรง ส่วนสำคัญของโค้ดอาจสั้นกว่าส่วนที่ต้องเพิ่มเข้าไปเพื่อให้ตรงตามข้อกำหนดของภาษาเสียอีก
อีกทางเลือกหนึ่งนอกเหนือจากการใช้ syntactical salt คือการสร้างคำเตือนจากคอมไพเลอร์เมื่อมีความเป็นไปได้สูงที่โค้ดนั้นเกิดจากข้อผิดพลาด ซึ่งเป็นวิธีปฏิบัติทั่วไปในคอมไพเลอร์ C/C++ สมัยใหม่
แซคคารินเชิงสังเคราะห์
ส่วนขยายอื่นๆ ได้แก่แซคคารินเชิงไวยากรณ์และน้ำเชื่อมเชิงไวยากรณ์ซึ่งหมายถึงไวยากรณ์ที่ไม่จำเป็นซึ่งไม่ได้ทำให้การเขียนโปรแกรมง่ายขึ้นแต่อย่างใด[ 14 ] [ 15 ] [ 16 ] [ 17 ]
ประเภทน้ำตาล
ประเภทข้อมูลที่มีการสนับสนุนไวยากรณ์หลักเรียกว่า "ประเภทแบบย่อ" [ 18 ] [ 19 ] [ 20 ]ตัวอย่างทั่วไป ได้แก่ สตริงที่คั่นด้วยเครื่องหมายอัญประกาศ วงเล็บปีกกาสำหรับประเภทวัตถุและเรคอร์ด และวงเล็บเหลี่ยมสำหรับอาร์เรย์
หมายเหตุ
- ^ Landin, Peter J. (1964). "การประเมินค่าทางกลของนิพจน์" (PDF) . The Computer Journal . 6 (4). Computer Journal : 308– 320. doi : 10.1093/comjnl/6.4.308 . สืบค้นเมื่อ21 กรกฎาคม 2014 .
- ^ Abelson & Sussman 1996 , บทที่ 1,เชิงอรรถที่ 11 .
- ^ Barbara Liskov, "ประวัติของ CLU", รายงานทางเทคนิคหมายเลข 561 ของห้องปฏิบัติการวิทยาศาสตร์คอมพิวเตอร์ MIT (1993)
- ^ Felleisen, Matthias (ธันวาคม 1991). "เกี่ยวกับพลังการแสดงออกของภาษาโปรแกรม" . วิทยาศาสตร์ของการเขียนโปรแกรมคอมพิวเตอร์ . 17 ( 1– 3). Springer-Verlag: 35– 75. doi : 10.1016/0167-6423(91)90036-W . สืบค้นเมื่อ19 กรกฎาคม 2014 .
- ^ Raymond, Eric S. (11 ตุลาคม 1996). พจนานุกรมแฮกเกอร์ฉบับใหม่ – ฉบับที่ 3.สำนักพิมพ์ MIT. หน้า 432. ISBN 978-0-262-68092-9สืบค้นข้อมูลเมื่อ วัน ที่5 สิงหาคม 2555
- ^ "คำสั่ง using (เอกสารอ้างอิง C#)" . สืบค้นเมื่อ16 กันยายน 2014 .
- ^ "magrittr: Vignette" . สืบค้นเมื่อ 24 ธันวาคม 2018 .
- ^ "Stack Overflow: เครื่องหมายคำถามสามตัวใน Scala หมายความว่าอย่างไร?" . สืบค้นเมื่อ23 มกราคม 2024 .
- ^ Abelson & Sussman 1996 , บทที่ 1,เชิงอรรถที่ 11 .
- ^เปอร์ลิส 1982บทกวีสั้นหมายเลข 3
- ^ "The Jargon File - syntactic salt" . 2003-06-12. เก็บถาวรจากต้นฉบับเมื่อ 2003-06-12 . เรียกดูเมื่อ2018-03-19 .
- ^ "ตัวแก้ไขใหม่ (เอกสารอ้างอิง C#)" . microsoft.com . Microsoft . สืบค้นเมื่อ3 สิงหาคม 2015 .
- ^ "switch (C# Reference)" . microsoft.com . Microsoft . สืบค้นเมื่อ 3 สิงหาคม 2015 .
- ^ "syntactic sugar" . catb.org . สืบค้นเมื่อ3 สิงหาคม 2558 .
- ^ Boiten, Eerke A.; Möller, Bernhard (2002-06-26). คณิตศาสตร์ของการสร้างโปรแกรม . Springer. ISBN 9783540438571สืบค้นข้อมูลเมื่อ วัน ที่3 สิงหาคม 2558
- ^ดีน, โทมัส (2004). การพูดคุยกับคอมพิวเตอร์: การสำรวจในวิทยาศาสตร์และเทคโนโลยีการคำนวณ . สำนักพิมพ์มหาวิทยาลัยเค มบริดจ์. หน้า 115. ISBN 9780521542043.
- ^ Harrison, William; Sheard, Tim (8–10 กรกฎาคม 2545). "คณิตศาสตร์ของการสร้างโปรแกรม" (PDF) . คณิตศาสตร์ของการสร้างโปรแกรม: การประชุมนานาชาติครั้งที่ 6, MPC 2002, ปราสาท Dagstuhl, เยอรมนี, 8–10 กรกฎาคม 2545. รายงานการประชุม . การประชุมนานาชาติว่าด้วยคณิตศาสตร์ของการสร้างโปรแกรม. บันทึกการบรรยายในวิทยาการคอมพิวเตอร์. เล่มที่ 2386. ปราสาท Dagstuhl, เยอรมนี: Springer Berlin Heidelberg. หน้า 93. doi : 10.1007/3-540-45442-X_6 . ISBN 978-3-540-43857-1S2CID 10059915 เก็บถาวรจากต้นฉบับ(PDF) เมื่อ วันที่ 31 มีนาคม 2017
- ^ Chugh, Ravi (2013). ประเภทการปรับแต่งแบบซ้อนกันสำหรับ JavaScript (ปริญญาเอก). มหาวิทยาลัยแคลิฟอร์เนีย ซานดิเอโก.
- ^ "เอกสารประกอบภาษา C สำหรับ LLVM" . clang.llvm.org . สืบค้นเมื่อ30 มิถุนายน 2020 .
- ^ "ชีวิตลับๆ ของประเภทข้อมูลใน Swift" medium.com/@slavapestov 14 กรกฎาคม 2016 สืบค้นเมื่อ 30 มิถุนายน 2020
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ น้ำตาลสังเคราะห์
ใน วิทยาการคอมพิวเตอร์ ไวยากรณ์ แบบย่อ (Syntactic sugar) คือ ไวยากรณ์ ภายใน ภาษาโปรแกรม ที่ออกแบบมาเพื่อให้การอ่านหรือการแสดงออกง่ายขึ้น ทำให้ภาษานั้น "น่าใช้"...
ต้นกำเนิด
คำว่า syntactic sugar ถูกบัญญัติโดย Peter J. Landin ในปี พ.ศ. 2507 เพื่ออธิบายไวยากรณ์พื้นผิวของ ภาษาโปรแกรมแบบ ALGOL ที่เรียบง่าย ซึ่งถูกกำหนดความหมายตามนิพจน์ประยุกต์ของ แคลคูลัสแลมบ์ดา [ 1 ] [ 2 ] โดยเน้นที่การแทนที่ λ ด้วย "where" ในเชิงคำ ศัพท์
ตัวอย่างที่น่าสนใจ
ใน ภาษา COBOL คำหลักระดับกลางหลายคำเป็นเพียงไวยากรณ์ที่ช่วยให้เขียนได้ง่ายขึ้น ซึ่งสามารถละเว้นได้ตามต้องการ ตัวอย่างเช่น ประโยค MOVE A B. และประโยค MOVE A TO B.
การวิจารณ์
โปรแกรมเมอร์บางคนรู้สึกว่าคุณสมบัติการใช้งานไวยากรณ์เหล่านี้ไม่สำคัญหรือไม่ก็ไร้สาระโดยสิ้นเชิง ที่น่าสังเกตคือ รูปแบบไวยากรณ์พิเศษทำให้ภาษามีความไม่สม่ำเสมอมากขึ้นและทำให้ข้อกำหนดซับซ้อนขึ้น และอาจก่อให้เกิดปัญหาเมื่อโปรแกรมมีขนาดใหญ่และซับซ้อน...