อะไรคือความแตกต่างระหว่าง "ไวยากรณ์" และ "น้ำตาลเชิงกล"


45

พื้นหลัง

หน้า Wikipedia เกี่ยวกับSyntactic Sugarกล่าวว่า:

ในวิทยาการคอมพิวเตอร์น้ำตาล syntactic เป็นไวยากรณ์ในภาษาการเขียนโปรแกรมที่ออกแบบมาเพื่อให้สิ่งที่ง่ายต่อการอ่านหรือการแสดง มันทำให้ภาษา "หวาน" สำหรับมนุษย์ที่จะใช้: สิ่งที่สามารถแสดงได้ชัดเจนยิ่งขึ้นรัดกุมหรือในรูปแบบทางเลือกที่บางคนอาจชอบ

ฉันไม่เข้าใจจริงๆว่าความแตกต่างระหว่างวากยสัมพันธ์น้ำตาลกับวากยสัมพันธ์คืออะไร

ฉันขอขอบคุณจุดที่รุ่นน้ำตาลสามารถชัดเจนและกระชับมากขึ้นบางทีต้มออกไปบางแผ่น แต่ฉันรู้สึกว่าในบางระดับไวยากรณ์ทั้งหมดจะทำเช่นนั้นเพื่อสร้างสิ่งที่เป็นนามธรรมเกี่ยวกับสิ่งที่โค้ดได้รับการรวบรวมลงไป

จากหน้า Wikipedia เดียวกัน:

ตัวประมวลผลภาษารวมถึงคอมไพเลอร์ตัววิเคราะห์แบบคงที่และที่คล้ายกันมักจะขยายการสร้าง sugared เป็นโครงสร้างพื้นฐานมากขึ้นก่อนการประมวลผลบางครั้งกระบวนการที่เรียกว่า "desugaring"

ในฐานะที่เป็นแบบฝึกหัดทางความคิดถ้าฉันใช้ "บ่อยครั้ง" ในคำสั่งนี้เพื่อหมายถึง "เสมอ": หากความแตกต่างเป็นเพียงว่าคอมไพเลอร์ "desugars" ไวยากรณ์ก่อนที่จะย้ายไปยังขั้นตอนถัดไป ของคอมไพเลอร์รู้ (หรือสนใจ) อะไรคือ Sugar'd Syntax หรือไม่

คำถามที่เกี่ยวข้องมากในเว็บไซต์นี้"คำจำกัดความที่เข้มงวดของน้ำตาลซินแทคติค" มีคำตอบที่เริ่ม:

IMHO ฉันไม่คิดว่าคุณจะมีคำจำกัดความเกี่ยวกับน้ำตาลในประโยคเพราะวลีนี้เป็น BS และน่าจะถูกใช้โดยคนที่พูดถึง "โปรแกรมเมอร์จริง" โดยใช้ "เครื่องมือจริง" ใน "ระบบปฏิบัติการจริง"

สิ่งใดที่อาจบ่งบอกฉันได้ว่าอาจไม่มีความแตกต่างอย่างมากกับ coder ที่ใช้ภาษานี้ บางทีความแตกต่างอาจสังเกตได้เฉพาะนักเขียนคอมไพเลอร์เท่านั้น? แม้ว่าอาจมีบางกรณีที่ผู้ใช้ coder ใช้ภาษารู้ว่าอะไรคือสิ่งที่อยู่ภายใต้การควบคุมของ Syntactic Sugar? (แต่บางทีในความเป็นจริงวาทกรรมใด ๆ ของผู้ทดลองมีแนวโน้มที่จะใช้คำนี้เป็นเหยื่อล่อเปลวไฟ?)

หัวใจของคำถาม

ดังนั้น ... คำถามสั้น ๆ :

  • มีความแตกต่างที่แท้จริงระหว่างวากยสัมพันธ์และวากยสัมพันธ์น้ำตาลไหม?
  • ใครจะสำคัญกับใคร

อาหารเสริมสำหรับความคิด

โบนัสตามหัวข้อที่ขัดแย้งกัน:

ในหน้า Wikipedia จะมีตัวอย่างให้ดู:

ยกตัวอย่างเช่นในภาษา C a[i]สัญกรณ์เป็นน้ำตาลเชิงประโยคสำหรับ*(a + i)

ในขณะที่คำตอบอีกข้อหนึ่งของคำถามที่เชื่อมโยงข้างต้นพูดถึงตัวอย่างเดียวกัน:

a[i] == *(a + i)ตอนนี้พิจารณา คิดเกี่ยวกับโปรแกรม C ใด ๆ ที่ใช้อาร์เรย์ด้วยวิธีการที่สำคัญ

และสรุปว่า:

[]สัญกรณ์อำนวยความสะดวกในสิ่งที่เป็นนามธรรมนี้ มันไม่ใช่น้ำตาลทราย

ข้อสรุปตรงข้ามสำหรับตัวอย่างเดียวกัน!


9
ในคำตอบของคำถามที่ฉันอ้างถึงฉันอธิบายว่าน้ำตาล syntacticเป็นไวยากรณ์ทางเลือก ( ไวยากรณ์บางอย่างที่มีอยู่แล้วในภาษา) ที่ทำให้ง่ายต่อการแสดงสำนวนทั่วไปบางอย่าง แต่ไม่แนะนำความหมายใหม่ ในแง่นี้น้ำตาลประโยคขึ้นอยู่กับบริบท (ในภาษาที่ใช้): สัญกรณ์เดียวกันสามารถเป็นไวยากรณ์ปกติในภาษาหนึ่งและน้ำตาลประโยคในภาษาอื่น คำอธิบายนี้ช่วยคุณได้หรือไม่?
Giorgio

7
ปัญหาหนึ่งก็คือบางคนดูเหมือนจะคิดว่า "น้ำตาลประโยค" เป็นคำสกปรกเมื่อมันไม่ได้ แต่ละฟังก์ชั่นหรือคลาสที่คุณเพิ่มเข้าไปในระบบนั้นอาจถูกพิจารณาว่าเป็น "ซินแทคติคน้ำตาล" เนื่องจากพวกเขาทำให้ความคิดที่ชัดเจนอยู่แล้วในภาษานั้นง่ายขึ้นเล็กน้อย
Joris Timmermans

เห็นได้ชัดว่ามันสำคัญสำหรับคุณ
SShaheen

11
ในที่สุดมันก็แค่น้ำตาล syntatic มากกว่ากระแสไฟฟ้า
Anthony Pegram

คำตอบ:


34

ความแตกต่างที่สำคัญคือไวยากรณ์เป็นไวยากรณ์ที่กำหนดไว้ในภาษาเพื่อให้คุณสามารถแสดงฟังก์ชั่นบางอย่าง ทันทีที่คุณสามารถใช้งานฟังก์ชั่นนั้นได้ซินแท็กซ์อื่น ๆที่ให้คุณทำสิ่งเดียวกันก็คือน้ำตาล แน่นอนว่ามันจะมีสถานการณ์แปลก ๆ เกี่ยวกับซินแท็กซ์สองอันนั้นคือน้ำตาลโดยเฉพาะอย่างยิ่งเนื่องจากมันไม่ชัดเจนว่าจะเกิดขึ้นก่อนใคร

ในทางปฏิบัติน้ำตาลประโยคจะใช้เพื่ออธิบายไวยากรณ์เพิ่มไปยังภาษาเพื่ออำนวยความสะดวกในการใช้งานง่ายเช่นการมัดแผนที่lhs + rhs lhs.Add(rhs)ฉันจะพิจารณาการจัดทำดัชนีอาร์เรย์ของ C ให้เป็นน้ำตาลประโยค

มันสำคัญมากเพราะการออกแบบที่หรูหรามีแนวโน้มที่จะ จำกัด จำนวนการทำซ้ำ ต้องการน้ำตาล (หรืออย่างน้อยที่ต้องการ) syntactic เห็นเป็นสัญญาณของการออกแบบที่ล้มเหลว


"ทันทีที่คุณสามารถใช้ฟังก์ชั่นนั้นได้ซินแท็กซ์อื่น ๆ ที่ให้คุณทำสิ่งเดียวกันนี้จะถือว่าเป็นน้ำตาล": นี่ไม่เพียงพอที่จะมีน้ำตาลซินแทคติคเพราะโปรแกรมอื่น ๆ ที่คำนวณฟังก์ชันเดียวกันจะเป็นน้ำตาล . sugared และโปรแกรม de-sugared ต้องมีความหมายเดียวกัน
จอร์โจ

3
@Giorgio วิธี "ทั้งสองโปรแกรมคำนวณฟังก์ชันเดียวกัน" แตกต่างจาก "โปรแกรมทั้งสองนี้มีความหมายเหมือนกัน"? นอกเหนือจากนั้นคุณกำลังมุ่งเน้นไปที่โปรแกรมไม่ใช่องค์ประกอบของวากยสัมพันธ์ โปรแกรมทั้งหมดไม่สามารถเป็นประโยคน้ำตาลได้ ผู้ประกอบการชนิดของคำสั่ง ฯลฯ สามารถน้ำตาลประโยค

@Giorgio - แน่นอนฉันกำลังพิจารณาฟังก์ชั่นที่คล้ายกันที่มีความหมายที่แตกต่างกันเพื่อให้เป็นฟังก์ชั่นที่แตกต่างกัน และใช่อาจมีการกระโดดแบบห่วงเหมือนเขียนคอมไพเลอร์ของคุณเองที่มีความหมายเดียวกันและเรียกว่า "น้ำตาล" คำนิยามอย่างเป็นทางการจะไม่เกิดขึ้นสำหรับแนวคิดที่ไม่เป็นทางการดังกล่าว
Telastyn

1
@Giorgio อีกครั้งเนื้อของฉันไม่ได้อยู่ที่ความเท่าเทียมของคุณ แต่คุณลองใช้แนวคิดของน้ำตาล syntactic กับโปรแกรม คำนี้ไม่ได้หมายถึงโปรแกรมทั้งหมด! ขึ้นอยู่กับคำจำกัดความของคุณมันเป็นเพียงแค่ตัวบล็อกปรมาณูหรือชิ้นส่วนของโปรแกรมสั้น ๆ เท่านั้น (อันแรกดูเหมือนจะครอบคลุม> 80% แต่ฉันไม่แน่ใจว่ามันครอบคลุมทุกอย่างที่พิจารณากันโดยทั่วไปว่าน้ำตาล syntactic)

3
@Giorgio ตัวอย่างเช่นโปรแกรมทั้งหมด ;-) หรืออะไรก็ตามที่มีขนาดใหญ่พอที่สูตรทั้งสองเกี่ยวข้องกับคำหลักภาษาที่ไม่เกี่ยวข้องหลายคำ สิ่งที่ฉันไม่เคยได้รับการรักษาเป็นน้ำตาลประโยคคือเมื่อเทียบกับif (a) return blah; ... result_type res; if (a) res = blah; else {...}; return res;คุณต้องสมมติภาษาที่เฉพาะเจาะจงและรับทนายภาษาอย่างมาก (มักจะเป็นประเด็นของความหมายในการปฏิบัติการขั้นตอนเล็ก ๆ ) เพื่อค้นหาความแตกต่างระหว่างโปรแกรมเหล่านั้น

10

ไวยากรณ์คือสิ่งที่ตัวประมวลผลภาษาใช้เพื่อทำความเข้าใจความหมายของโครงสร้างของภาษา โครงสร้างที่ถือว่าเป็นน้ำตาลเชิงประโยคจะต้องมีการตีความโดยหน่วยประมวลผลภาษาและทำให้เป็นส่วนหนึ่งของไวยากรณ์ภาษา

สิ่งที่ทำให้น้ำตาลทรายนั้นแตกต่างจากไวยากรณ์ที่เหลือของภาษาคือมันเป็นไปได้ที่จะเอาน้ำตาลทรายออกจากภาษาโดยไม่ส่งผลกระทบต่อโปรแกรมที่เขียนด้วยภาษา

เพื่อให้คำจำกัดความที่เป็นทางการมากกว่านี้ฉันจะบอกว่า

ซินแทคติคน้ำตาลเป็นส่วนหนึ่งของไวยากรณ์ภาษาที่มีการกำหนดเอฟเฟกต์ในแง่ของการสร้างไวยากรณ์อื่น ๆ ในภาษา

สิ่งนี้ไม่ได้หมายความว่าจะลบล้างประโยคน้ำตาลหรือภาษาที่มีเพราะการใช้น้ำตาลประโยคมักจะนำไปสู่โปรแกรมที่มีความตั้งใจที่จะเข้าใจได้มากขึ้น


"ไม่มีทางที่จะพูดอย่างชัดเจนว่า 'นี่คือ syntactic sugar และนั่นคือ syntax' เพราะน้ำตาล syntactic เป็นส่วนหนึ่งของไวยากรณ์ของภาษา": เท็จ มันเป็นผู้ออกแบบภาษาที่แนะนำไวยากรณ์บางอย่างเป็นน้ำตาลประโยคสำหรับการสร้างที่มีอยู่แล้วในภาษาและมีไวยากรณ์ โดยทั่วไปแล้วน้ำตาล syntactic จะ ad-hoc (ทั่วไปน้อยกว่า) แต่อ่าน / สะดวกในการใช้
Giorgio

@Giorgio: ฉันขอย้ำย่อหน้าแรกของฉันเพราะมันค่อนข้างอึดอัด แต่ฉันไม่เห็นด้วยว่าน้ำตาล syntactic ถูกเพิ่มเข้าไปในเฉพาะกิจ น้ำตาลซินแทคติกที่เป็นที่รู้จักอย่างกว้างขวางที่สุดน่าจะเป็น->ตัวดำเนินการของ C และฉันไม่เห็นว่าตัวดำเนินการทั่วไปนั้นน้อยกว่าคนอื่น ๆ อย่างไร
Bart van Ingen Schenau

1
@Giorgio: ในกรณีนั้นทุกสิ่งที่ไม่ได้แมปโดยตรงกับคำสั่งการประกอบเพียงครั้งเดียวควรได้รับการพิจารณาว่าเป็นน้ำตาลซินแทคติคเพราะมันสามารถแบ่งออกเป็นชิ้น ๆ ได้ง่ายขึ้น ฉันไม่คิดว่าคุณจะไม่พบคนมากมายที่แชร์มุมมองนั้น
Bart van Ingen Schenau

1
"Ad-hoc" หมายถึงมันถูกใช้ในสถานการณ์พิเศษที่ถูก จำกัด คำนี้ไม่มีความหมายแฝงในแง่ลบโดยทั่วไป โซลูชัน ad-hoc คำว่ามีความหมายเชิงลบเนื่องจากปกติต้องการโซลูชันทั่วไปไม่ใช่โซลูชันเฉพาะ (เพื่อหลีกเลี่ยงการแก้ไขปัญหาที่คล้ายกันซ้ำแล้วซ้ำอีก)
จอร์โจ

1
เนื่องจาก "โซลูชัน ad-hoc" มักจะไม่ดีดังนั้นจึงอาจดูเหมือนว่า "ad-hoc" นั้นหมายถึงไม่ดี แต่ก็มี "ฟังก์ชั่น ad-hoc polymorphism" AKA ที่ทำงานหนักเกินไป ( en.wikipedia.org/wiki/Ad_hoc_polymorphism ) ซึ่งไม่เลว อย่างน้อยในภาษาอิตาลี (ภาษาแม่ของฉัน) การใช้ภาษาละติน "โฆษณาเฉพาะกิจ" ไม่ได้เป็นผลลบในตัวเอง หากมันมีความหมายแฝงในภาษาอังกฤษให้ยกโทษให้ฉันด้วย
Giorgio

6

คำตอบอื่น ๆ ยังไม่ได้กล่าวถึงแนวคิดหลัก: ไวยากรณ์นามธรรม ; หากปราศจากมันคำว่า "น้ำตาลเชิงซ้อน" ก็ไม่สมเหตุสมผล

ไวยากรณ์นามธรรมกำหนดองค์ประกอบและโครงสร้างของภาษาและวิธีรวมวลีของภาษานั้นเพื่อสร้างวลีที่ใหญ่ขึ้น ไวยากรณ์ที่เป็นนามธรรมเป็นอิสระจากไวยากรณ์ที่เป็นรูปธรรม คำว่า "น้ำตาลเชิงกล" ในขณะที่ฉันเข้าใจมันหมายถึงไวยากรณ์ที่เป็นรูปธรรม

โดยทั่วไปเมื่อออกแบบภาษาคุณจะต้องสร้างไวยากรณ์ที่เป็นรูปธรรมสำหรับแต่ละคำศัพท์ของรูปแบบนามธรรมของคุณเพื่อให้ผู้คนสามารถเขียนโค้ดในภาษาของคุณโดยใช้ข้อความธรรมดา

ตอนนี้ขอบอกว่าคุณสร้างไวยากรณ์คอนกรีตที่น่าอึดอัดใจสำหรับfoo ผู้ใช้บ่นและคุณใช้ไวยากรณ์คอนกรีตใหม่เพื่อเป็นตัวแทนของไวยากรณ์นามธรรมเดียวกัน ผลลัพธ์คือไวยากรณ์นามธรรมและซีแมนทิกส์ของคุณไม่ได้เปลี่ยน แต่ตอนนี้คุณมีไวยากรณ์คอนกรีตสองรูปแบบสำหรับคำศัพท์ไวยากรณ์เดียวกัน

ฉันเชื่อว่านี่คือสิ่งที่ผู้คนหมายถึงเมื่อพวกเขาพูดว่า "น้ำตาลทราย" - การเปลี่ยนแปลงที่มีผลกระทบต่อรูปแบบที่เป็นรูปธรรมเท่านั้น แต่ไม่มีผลต่อไวยากรณ์หรือความหมายเชิงนามธรรม

ดังนั้นความแตกต่างระหว่าง "น้ำตาลเชิงซ้อน" และ "รูปแบบคอนกรีต" จึงชัดเจน ถึงฉัน. :)

การตีความนี้ยังช่วยอธิบายสิ่งที่อลันเพลิสอาจหมายถึงเมื่อเขาพูดว่า "น้ำตาลเชิงซ้อนทำให้เกิดมะเร็งอัฒภาค": น้ำตาลที่เป็นรูปธรรมทั้งหมดในโลกไม่สามารถแก้ไขไวยากรณ์นามธรรมที่อ่อนแอได้และความพยายามทั้งหมดที่คุณใช้จ่าย ความพยายามที่คุณไม่ได้ใช้จ่ายในการจัดการกับปัญหาจริง - ไวยากรณ์นามธรรม


ฉันควรทราบด้วยว่านี่เป็นเพียงความคิดเห็นของฉันเท่านั้น ฉันเชื่อเพียงเพราะมันเป็นการตีความเพียงอย่างเดียวที่ฉันสามารถนึกได้


1
ฉันเคยคิดเกี่ยวกับการเปรียบเทียบเชิงนามธรรมกับไวยากรณ์ที่เป็นรูปธรรม แต่ฉันไม่แน่ใจว่าสิ่งนี้จะอธิบายเกี่ยวกับวากยสัมพันธ์น้ำตาล เช่นใน C ให้ตัวชี้pไปยังโครงสร้างที่มีเขตข้อมูลxทำนิพจน์(*p).xและp->xมีไวยากรณ์นามธรรมที่เหมือนกันหรือไม่ แต่ฉันคิดว่ามันจะดีถ้าทุกอย่างต้มลงในนามธรรมและไวยากรณ์ที่เป็นรูปธรรม
Giorgio

@Giorgio โชคไม่ดีที่ฉันไม่รู้ว่า C เพียงพอที่จะบอกได้อย่างมั่นใจว่าทั้งสองอย่างนั้นเป็นน้ำตาล syntactic สำหรับอีกหรือสิ่งที่ต้นไม้ไวยากรณ์ของพวกเขาจะมีลักษณะ หรือแม้ว่าข้อมูลจำเพาะของ C จะกำหนดไวยากรณ์นามธรรม :(

1
การแสดงออกครั้งแรกสามารถแยกเป็นต้นไม้ที่มี.ที่ราก subnode ซ้ายของรากเป็นและเด็กของมันคือ* psubnode xขวาของราก สำหรับการแสดงออกที่สองต้นไม้ไวยากรณ์นามธรรมมี->ที่รากและรากมีลูกสองคนและp xฉันพยายามคิดออกว่าการแยกทั้งสองนิพจน์แตกต่างกันหรือไม่เพื่อให้พวกเขามีต้นไม้ไวยากรณ์ที่เป็นนามธรรมเหมือนกัน แต่ฉันไม่เห็นว่าตอนนี้
Giorgio

3
ฉันไม่คิดว่าต้นไม้นี้แยกวิเคราะห์แม้ว่ามักจะอธิบายว่าเป็น AST เหมือนกับไวยากรณ์นามธรรมที่ Matt กำลังพูดถึง ทั้งสองนิพจน์มีการทำงานที่เหมือนกัน ( แปลงประเภทตัวชี้เป็นประเภทอ้างอิงจากนั้นรับการอ้างอิงถึงสมาชิกx )
ไร้ประโยชน์

1
"นิพจน์ทั้งสองมีการกระทำที่เหมือนกัน (แปลงประเภทตัวชี้เป็นประเภทอ้างอิงจากนั้นรับการอ้างอิงถึงสมาชิก x)": นี่คือความหมายไม่ใช่ไวยากรณ์นามธรรม ไวยากรณ์ที่เป็นนามธรรมหมายถึงการทิ้งรายละเอียดที่ไร้ประโยชน์ของไวยากรณ์ที่เป็นรูปธรรม (เช่น(หรือ;) เพื่อสร้างแผนภูมิที่สะท้อนโครงสร้างที่แท้จริงของโปรแกรม (ดูen.wikipedia.org/wiki/Abstract_syntax_tree ) อย่างไรก็ตามในรูปแบบนามธรรมไม่มีอะไรพูด (ยัง) เกี่ยวกับความหมายของโปรแกรม
Giorgio

4

วากยสัมพันธ์น้ำตาลเป็นส่วนหนึ่งของไวยากรณ์ภาษา แนวคิดพื้นฐานคือมีมากกว่าหนึ่งวิธีที่จะพูดในสิ่งเดียวกัน

สิ่งที่ทำให้ยากที่จะบอกว่าชิ้นส่วนใดเป็นน้ำตาลประโยคและส่วนใดเป็น "ไวยากรณ์บริสุทธิ์" ซึ่งเป็นข้อความเช่น "ยากที่จะพูดว่ารูปแบบใดมาก่อน" หรือ "ยากที่จะทราบว่าผู้เขียนภาษาตั้งใจใช้วิธีใด" หรือ "มัน โดยพลการในการตัดสินใจว่ารูปแบบใดง่ายกว่า "

อะไรทำให้ง่ายต่อการตัดสินใจว่าชิ้นส่วนใดที่บริสุทธิ์หรือหวานคือการถามคำถามภายในกรอบของนักแปลหรือล่ามที่เฉพาะเจาะจง ไวยากรณ์ที่แท้จริงคือสิ่งที่คอมไพเลอร์แปลงโดยตรงกับรหัสเครื่องหรือล่ามตอบสนองโดยตรง น้ำตาลคือสิ่งที่ถูกเปลี่ยนเป็นไวยากรณ์ก่อนอื่นก่อนที่สิ่งเหล่านี้จะเกิดขึ้น ขึ้นอยู่กับการนำไปใช้งานสิ่งนี้อาจหรืออาจจะไม่เหมือนกับสิ่งที่ผู้เขียนตั้งใจหรือแม้กระทั่งสิ่งที่ข้อมูลจำเพาะทางภาษาอ้าง

ในทางปฏิบัตินี่เป็นวิธีที่จะตัดสินความจริงของเรื่อง


คำตอบนี้ผิดเชื่อมโยงการใช้งานของไวยากรณ์เพื่อไม่ว่าจะเป็นน้ำตาลหรือไม่ ฉันไม่เคยเห็นข้อโต้แย้ง = เกี่ยวกับว่าองค์ประกอบของภาษาเป็น "น้ำตาล" หรือไม่นั้นเกี่ยวข้องกับตัวเองว่าจะใช้องค์ประกอบอย่างไร เป็นเรื่องหมดจดไม่ว่าจะเป็นการทำซ้ำองค์ประกอบที่น่าเกลียดที่แตกต่างกันวากยสัมพันธ์
GreenAsJade

3

จริงๆแล้วการอ้างอิงแรกของคุณจาก Wikipedia บอกว่ามันทั้งหมด "... ทำให้การอ่านง่ายขึ้น ... ", ".... มีความหวานมากขึ้นสำหรับมนุษย์ที่จะใช้ .... "

ในการเขียนรูปแบบที่สั้นลงเช่น "ไม่" หรือ "ไม่ได้" อาจถูกพิจารณาว่าเป็นน้ำตาลซินแทคติค


ลองพิจารณา (1) "ฉันควรไปแล้ว" กับ (2) "ฉันควรจะไปแล้ว": (1) น้ำตาลซินแทคติกสำหรับ (2) หรือไม่?
Giorgio

1
@Giorgio ฉันจะบอกว่าไม่
ozz

เนื่องจากความสามารถในการอ่าน ("ควร" ไม่สามารถอ่านได้มากกว่า "ควร") หรือเพราะความหมาย ("ควร" และ "ควร" มีความหมายต่างกัน)
Giorgio

พอยุติธรรม @Giorgio :)
Ozz

1
อ่าฉันเห็น :) มีความรู้สึกมากขึ้นฉันเดาว่าฉันไม่คิดว่าจะมีคนอ่านได้มากกว่าคนอื่น ๆ ในตัวอย่างนั้น
ozz

3

โดยทั่วไปแล้วไวยากรณ์ของน้ำตาลจะเป็นส่วนหนึ่งของภาษาที่สามารถแสดงโดยส่วนที่มีอยู่ของภาษา (ไวยากรณ์) โดยไม่สูญเสียความรู้ทั่วไป แต่อาจสูญเสียความชัดเจน บางครั้งคอมไพเลอร์มีขั้นตอนการแยกอย่างชัดเจนซึ่งเปลี่ยน AST ที่สร้างโดยซอร์สโค้ดและใช้ขั้นตอนง่าย ๆ ในการลบโหนดที่สอดคล้องกับน้ำตาล

ตัวอย่างเช่น Haskell มี syntax น้ำตาลสำหรับ monads ซึ่งใช้กฎต่อไปนี้ซ้ำ ๆ

do { f }            ~> f
do { g; h }         ~> g >> do h
do { x <- f; h }    ~> f >>= \x -> do h
do { let x = f; h } ~> let x = f in do h

ตอนนี้มันไม่สำคัญว่ามันจะหมายถึงอะไร - แต่คุณสามารถเห็นว่าไวยากรณ์พิเศษบน LHS สามารถเปลี่ยนเป็นสิ่งที่พื้นฐานมากขึ้นใน RHS (เช่นฟังก์ชั่นการใช้งาน, lambdas และlet's) ขั้นตอนนี้ช่วยให้สามารถรักษาทั้งสองโลกได้ดีที่สุด:

  1. ไวยากรณ์บน LHS ง่ายขึ้นสำหรับโปรแกรมเมอร์ (ซินแท็กซ์น้ำตาล) ที่แสดงความคิดที่มีอยู่ในลักษณะที่ชัดเจนยิ่งขึ้น
  2. อย่างไรก็ตามเนื่องจากการสนับสนุนในคอมไพเลอร์สำหรับโครงสร้าง RHS นั้นมีอยู่แล้วในคอมไพเลอร์จึงไม่จำเป็นต้องถือว่าเป็นสิ่งที่แยกวิเคราะห์พิเศษและแยกวิเคราะห์นอก (ยกเว้นการรายงานข้อผิดพลาด)

ในทำนองเดียวกันใน C คุณสามารถจินตนาการกฎการเขียนซ้ำ (เนื่องจากตัวดำเนินการมากไป ฯลฯ มันไม่เป็นความจริงสำหรับ C ++):

f->h ~> (*f).h
f[h] ~> *(f + h)

คุณสามารถจินตนาการการเขียนโปรแกรมทั้งหมดโดยไม่ต้องใช้->หรือ[]ใน C ที่ใช้โครงสร้างนี้ในวันนี้ อย่างไรก็ตามมันจะยากกว่าสำหรับโปรแกรมเมอร์ที่จะใช้มันดังนั้นจึงให้ syntax น้ำตาล (ฉันเดาใน 70 ของมันอาจทำให้การทำงานง่ายขึ้นสำหรับคอมไพเลอร์ด้วย) อาจมีความชัดเจนน้อยลงเนื่องจากคุณสามารถเพิ่มกฎต่อไปนี้ที่ถูกต้องสมบูรณ์แบบและเขียนกฎใหม่ได้:

*f ~> f[0] -- * and [] have the same expressiveness 

ไวยากรณ์มีน้ำตาลไม่ดีหรือไม่ ไม่จำเป็น - มีอันตรายที่มันจะถูกใช้เป็นลัทธิขนส่งสินค้าโดยไม่เข้าใจความหมายที่ลึกกว่า ตัวอย่างเช่นฟังก์ชั่นต่อไปนี้เทียบเท่าใน Haskell แต่ผู้เริ่มต้นส่วนใหญ่จะเขียนแบบฟอร์มแรกโดยไม่เข้าใจว่ามีการใช้ซินแท็กซ์น้ำตาลมากเกินไป:

f1 = do x <- doSomething
        return x
f2 = doSomething

นอกจากนี้ไวยากรณ์ของน้ำตาลอาจมีความซับซ้อนมากเกินไปภาษาหรือแคบเกินไปที่จะอนุญาตให้ใช้รหัสสำนวนทั่วไป มันอาจหมายความว่าภาษานั้นไม่ทรงพลังพอที่จะทำสิ่งต่าง ๆ ได้ง่าย - มันอาจเกิดจากการออกแบบ (ไม่ให้เครื่องมือที่คมชัดแก่นักพัฒนาหรือภาษาเฉพาะที่เฉพาะเจาะจงมาก ๆ รูปแบบให้ไวยากรณ์น้ำตาลในชื่อที่ไม่ดี หากภาษานั้นมีพลังมากพอที่จะใช้สิ่งก่อสร้างอื่น ๆ โดยไม่เพิ่มน้ำตาลไวยากรณ์มันก็ถือว่าใช้งานได้ดีกว่า


3

ฉันคิดว่าตัวอย่างที่ชัดเจนที่สุดคือไวยากรณ์ "+ =" ใน C

i = i + 1;

และ

 i +=  1;

ทำสิ่งเดียวกันและรวบรวมคำสั่งเครื่องชุดเดียวกัน แบบฟอร์มที่สองจะช่วยประหยัดการพิมพ์อักขระสองสามตัว แต่ที่สำคัญกว่านั้นคือชัดเจนว่าคุณกำลังปรับเปลี่ยนค่าตามค่าปัจจุบัน

ฉันจะกล่าวถึงผู้ประกอบการโพสต์ / คำนำหน้า "++" เป็นตัวอย่างที่ยอมรับ แต่รู้ว่านี่เป็นมากกว่าน้ำตาลประโยค ไม่มีวิธีที่จะแสดงความแตกต่างระหว่าง ++ i และ i ++ ในนิพจน์เดียวโดยใช้i = i + 1ไวยากรณ์


+ = มีประโยชน์ในกรณีเช่นa[f(x)] += 1นี้
Florian F

1

ก่อนอื่นฉันจะตอบคำถามอื่น ๆ ด้วยตัวอย่างที่เป็นรูปธรรม C ++ 11 มีพื้นฐานมาจากลูป (คล้ายกับลูป foreach ในภาษาอื่น ๆ )

for (auto value : container) {
    do_something_with(value);
}

เทียบเท่ากับ (เช่นรุ่นที่ sugared)

for (auto iterator = begin(container); iterator != end(container); ++iterator) {
    do_something_with(*iterator);
}

ตอนนี้แม้จะไม่มีการเพิ่มไวยากรณ์หรือความหมายเชิงนามธรรมใหม่ให้กับภาษา แต่ก็มียูทิลิตี้จริง

รุ่นแรกทำให้เจตนา (ไปที่ทุกรายการในที่เก็บ) ชัดเจน นอกจากนี้ยังห้ามพฤติกรรมที่ผิดปกติเช่นการปรับเปลี่ยนภาชนะบรรจุในระหว่างiteratorการเคลื่อนที่หรือเคลื่อนที่ไปข้างหน้าอย่างต่อเนื่องในตัวลูป วิธีนี้จะหลีกเลี่ยงแหล่งที่มาของข้อบกพร่องและลดความยุ่งยากในการอ่านและการใช้เหตุผลเกี่ยวกับรหัส

ตัวอย่างเช่นข้อผิดพลาดหนึ่งอักขระในเวอร์ชันที่สอง:

for (auto iterator = begin(container); iterator <= end(container); ++iterator) {
    do_something_with(*iterator);
}

ให้ข้อผิดพลาดที่เกิดขึ้นครั้งเดียวและพฤติกรรมที่ไม่ได้กำหนด

ดังนั้นรุ่น sugared จึงมีประโยชน์อย่างแม่นยำเพราะมีข้อ จำกัด มากขึ้นและง่ายต่อการเชื่อถือและเข้าใจ


ประการที่สองกับคำถามเดิม:

มีความแตกต่างที่แท้จริงระหว่างวากยสัมพันธ์และวากยสัมพันธ์น้ำตาลไหม?

ไม่ "ซินแทคติคน้ำตาล" คือไวยากรณ์ภาษา (คอนกรีต) ซึ่งถือเป็น "น้ำตาล" เพราะไม่ได้ขยายไวยากรณ์นามธรรมหรือฟังก์ชันการทำงานหลักของภาษา ฉันชอบคำตอบของ Matt Fenwick ในเรื่องนี้

ใครจะสำคัญกับใคร

มันมีความสำคัญต่อผู้ใช้ภาษาเท่าที่มีไวยากรณ์อื่น ๆ และในน้ำตาลนั้นมีไว้เพื่อสนับสนุน (และในความหมายบางอย่าง) เฉพาะสำนวน

ในที่สุดคำถามโบนัส

สัญกรณ์ [] ช่วยให้เกิดสิ่งที่เป็นนามธรรมนี้

ฟังดูเหมือนคำจำกัดความของวากยสัมพันธ์น้ำตาล: มันสนับสนุน (และให้พรของผู้เขียนภาษา) โดยใช้พอยน์เตอร์เป็นอาร์เรย์ p[i]รูปแบบไม่ได้เป็นจริงมากขึ้นกว่าที่เข้มงวด*(p+i)เพื่อให้ความแตกต่างเพียงอย่างเดียวคือการสื่อสารที่ชัดเจนของเจตนา (และกำไรจากการอ่านเล็กน้อย)


ก่อนอื่นคุณพูดว่า "[ช่วงที่ใช้สำหรับลูป] นั้นเทียบเท่ากับ (เช่นเวอร์ชันที่ sugared ของ) [สิ่งอื่น ๆ ]" แต่คุณบอกว่ามันแตกต่างกันโดยที่มันห้ามการดัดแปลงคอนเทนเนอร์ในระหว่างการสำรวจ ... และมีความแตกต่างอื่น ๆ ที่ทำให้มันมากกว่าแค่การแปลงประโยคอย่างง่ายที่คุณอธิบาย (เช่นพฤติกรรมเมื่อ "คอนเทนเนอร์" เป็นชั่วคราว) ความแตกต่างเหล่านี้บ่งบอกว่ามันไม่ใช่แค่น้ำตาลซินแทคติคใช่มั้ย สำหรับฉันแล้วดูเหมือนว่านี่อาจไม่ใช่ตัวอย่างที่ดีของน้ำตาลซินแทคติค
Don Hatch

ฉันไม่ได้บอกว่ามันเทียบเท่ากับ ลูปทั่วไปบางอันฉันบอกว่ามันเทียบเท่ากับลูปเฉพาะที่ระบุ การวนซ้ำที่เฉพาะเจาะจงไม่ได้ปรับเปลี่ยนคอนเทนเนอร์และแสดงถึงสำนวนที่พบบ่อยมาก - แต่คุณยังต้องอ่านทุก ๆ วนรอบอย่างระมัดระวังเพื่อบอกว่ามันกำลังตามหลังสำนวนทั่วไปหรือไม่ การวนซ้ำที่ใหม่กว่านั้นคือน้ำตาลสำหรับสำนวนสามัญนั้นทั้งการใช้คำน้อยและการสื่อสารที่ชัดเจนยิ่งขึ้นเมื่อใช้ มันไม่ได้และฉันไม่เคยอ้างว่ามันเป็นน้ำตาลอย่างใดอย่างหนึ่งสำหรับความคิดทั่วไปของการวนรอบ
ไร้ประโยชน์

0

ไม่ว่าความหมายแฝงดั้งเดิมของคำนี้คืออะไรทุกวันนี้มันเป็นสิ่งที่ดูถูกเหยียดหยามมักจะใช้คำว่า "เพียงแค่" หรือ "เท่านั้น" ในประโยคน้ำตาล มันเป็นเรื่องสำคัญมากสำหรับโปรแกรมเมอร์ที่ชอบทำสิ่งที่ไม่สามารถอ่านได้และต้องการวิธีที่กระชับเพื่อพิสูจน์ว่าเพื่อนร่วมงานของพวกเขา คำจำกัดความโดยผู้ที่ใช้คำว่าวันนี้จากมุมมองของพวกเขาจะเป็นสิ่งที่ต้องการ:

ไวยากรณ์ที่ซ้ำซ้อนกับไวยากรณ์อื่น ๆ ที่ใช้กันอย่างแพร่หลายมากขึ้นเพื่อจัดหา crutch สำหรับโปรแกรมเมอร์ที่ไม่เข้าใจภาษาจริงๆ

นั่นเป็นเหตุผลที่คุณจะได้ข้อสรุปที่ตรงกันข้ามสองประการสำหรับองค์ประกอบวากยสัมพันธ์เดียวกัน ตัวอย่างแรกของคุณเกี่ยวกับสัญกรณ์อาร์เรย์คือการใช้ความหมายเชิงบวกดั้งเดิมของคำศัพท์ซึ่งคล้ายกับคำตอบของ Bart ตัวอย่างที่สองของคุณคือการปกป้องสัญกรณ์อาร์เรย์กับค่าใช้จ่ายของน้ำตาล syntactic ในแง่ที่ดูถูก กล่าวอีกนัยหนึ่งมันเป็นการโต้เถียงว่าไวยากรณ์เป็นนามธรรมที่เป็นประโยชน์มากกว่าไม้ยันรักแร้


ฉันคิดว่าความหมายดูถูกของคำ ("มันเป็นเพียงน้ำตาล syntactic") มาจากข้อเท็จจริงที่ว่าน้ำตาล syntactic ไม่ได้เพิ่มข้อมูลใด ๆ
Giorgio

1
อาจมาจากความคิดที่วากยสัมพันธ์ไม่ได้เพิ่มข้อมูลใด ๆแต่ความคิดนั้นไม่ใช่ความจริง ข้อมูลเกี่ยวกับความตั้งใจ (ตัวอย่างเช่นการใช้สำนวนที่รู้จักกันดี) ยังคงเป็นข้อมูล
ไม่มีประโยชน์

@ ไม่มีประโยชน์: จากข้อมูลฉันหมายถึงโปรแกรมทำงานแบบเดียวกันโดยมีหรือไม่มีน้ำตาลประโยค แน่นอนมันสามารถอ่านได้มากขึ้นด้วยน้ำตาล syntactic (จะเพิ่มข้อมูล / เอกสารสำหรับผู้อ่าน) ซึ่งเป็นข้อได้เปรียบ
Giorgio

ปลอม. น้ำตาลในการสร้างประโยคไม่ใช่เรื่องดูถูก โปรแกรมเมอร์ทุกคนที่มีคุณค่าเกลือของเขาหรือเธอจะสร้างห้องสมุดที่ห่อหุ้มและลดความซับซ้อนของงานที่ซับซ้อนมากกว่าคัดลอกและวางรหัสเดียวกันทั่วทุกที่ สิ่งนี้นำไปสู่โค้ดที่ประพฤติดีและบำรุงรักษาได้ดีกว่า นี่คือสิ่งที่น้ำตาล syntactic ประสบความสำเร็จโดยการทำให้เป็นนามธรรมทั่วไปแม้ว่าจะซับซ้อน แต่รูปแบบเป็นไวยากรณ์ที่ง่ายขึ้น
Craig

ฉันกำลังบอกว่าคนมักจะหมายถึงคำว่าเป็นการดูถูกฉันไม่ได้แสดงความคิดเห็นในการปฏิบัติพื้นฐานตัวเอง การพูดคำว่า "งี่เง่า" เป็นการหลอกลวงที่ไม่ได้หมายความว่าทุกคนเป็นคนงี่เง่า เมื่อคนต้องการพูดคุยเกี่ยวกับการปฏิบัติในเชิงบวกพวกเขามักจะใช้คำเช่น "นามธรรม" หรือ "encapsulation"
Karl Bielefeldt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.