คำศัพท์“ sugar”,“ desugar” ในบริบทของ Java 8 คืออะไร?


107

ฉันได้ยินเกี่ยวกับ 'sugaring' และ 'desugaring' บ่อยขึ้นใน Java 8 คำศัพท์เหล่านี้หมายความว่าอย่างไร เป็นแนวความคิดหรือเชิงสังเคราะห์

ตัวอย่างบางส่วน:

เริ่มต้นการวนซ้ำที่เริ่มต้นการคืนค่าเป็น java

ข้อสังเกตเกี่ยวกับน้ำตาลวากยสัมพันธ์ในการรวบรวม.

คำตอบ:


136

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

Wikipedia มีคำจำกัดความของ น้ำตาลวากยสัมพันธ์แต่คุณควรสังเกตว่าในสาระสำคัญไม่ใช่น้ำตาลทั้งหมดคือ syntactical (ไม่ใช่แค่การเพิ่มความหวานล่าสุดทั้งหมดเป็นเพียงการเปลี่ยนแปลงของคอมไพเลอร์)

นี่คือตัวอย่างบางส่วน:

  • postfix และตัวดำเนินการส่วนเพิ่มคำนำหน้า ( i++และ++i ) จุดประสงค์เดียวของพวกเขาคือหลีกเลี่ยงการเขียนข้อความเพิ่มเติม เป็นน้ำตาลบริสุทธิ์
  • +=, |= , &=และอื่น ๆ ที่ทำจากชนิดเดียวกันของน้ำตาล
  • การแปลงโดยนัยระหว่างประเภทดั้งเดิมและวัตถุคือน้ำตาลด้วย
  • การอนุมานประเภทคือน้ำตาลด้วย
  • แลมด้านิพจน์ที่มาพร้อมกับ Java 8 เป็นน้ำตาลชนิดอื่น ๆ (อันนี้ไม่ใช่แค่การสังเคราะห์ )

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

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

ที่ถูกกล่าวว่าdesugaringหมายถึงอย่างใดอย่างหนึ่ง

  • กระบวนการที่คุณลบทั้งหมดที่ซ้ำซ้อนในภาษา
  • กระบวนการที่ตัวประมวลผลโค้ดพบว่ามีอะไรอยู่เบื้องหลังคำสั่ง sugared (ตัวอย่างเช่นอาจเกี่ยวข้องกับการอนุมานประเภท)

6
+1 นอกจากนี้คุณยังสามารถพูดถึงส่วน desugar ได้อีกด้วยซึ่งจะทำให้คำตอบที่ OP ถามเสร็จสมบูรณ์! :)
Rahul Tripathi

6
@justhalf คิดว่าโปรแกรมของคุณจะบางลงแค่ไหนเมื่อคุณสามารถลบอินเทอร์เฟซทั้งหมดที่คุณสร้างขึ้นเพื่อให้สามารถส่งผ่านฟังก์ชันได้
Denys Séguret

42
"น้ำตาลสังเคราะห์ทำให้เกิดมะเร็งที่เซมิโคลอน" - Alan Perlis
Stuart Marks

12
ตัวดำเนินการ Postfix และคำนำหน้าเคยในช่วงแรก ๆ ของ C ไม่ใช่น้ำตาลซินแทติก คอมไพเลอร์ในยุคแรกเป็นเรื่องโง่ตามมาตรฐานในปัจจุบันและตัวดำเนินการเหล่านั้นสามารถใช้งานได้ด้วยคำสั่งรหัสเครื่องเดียว แต่ไม่สามารถใช้คำสั่งการมอบหมายที่เทียบเท่าได้ ดังนั้นพวกเขาจึงเปิดใช้งานการเขียนโปรแกรมที่มีประสิทธิภาพมากขึ้น
Raedwald

3
@justhalf คำถามนี้ได้รับความสนใจเป็นอย่างมาก ไม่ใช่เรื่องยากในกรณีเหล่านี้ที่ผู้ดูแลระบบจะลบความคิดเห็นที่ดูเหมือนไม่สร้างสรรค์ ฉันไม่คิดว่าความคิดเห็นของคุณจะต้องถูกลบ แต่ก็ไม่ได้นำมาซึ่งอะไรมากมาย
Denys Séguret

18

"Desugaring" ดูเหมือนจะมีความหมายที่เฉพาะเจาะจงมากใน Java 8 ดูเหมือนว่าจะเป็นคำที่จับได้ทั้งหมดเพื่อแสดงวิธีต่างๆที่นิพจน์แลมบ์ดาอาจถูกผูกไว้กับการเรียกวิธีการที่เป็นรูปธรรมจริง

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

วลีสำคัญจากเอกสาร:

ขั้นตอนแรกของการแปล lambdas เป็น bytecode คือการแยกร่างกายแลมด้าให้เป็นวิธีการ


6

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

  • สำหรับแต่ละลูป "desugared" เป็นสไตล์ C สำหรับลูป
  • การยืนยันเป็น "สมควร" สำหรับประโยค if
  • ชั้นเรียนภายในจะแสดงเป็นชั้นเรียนแบบสแตนด์อโลน

คุณสามารถตรวจสอบสิ่งที่เกิดขึ้นกับสวิตช์ String พิมพ์ erasure ...


0

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

แนวคิดเหล่านี้เกิดขึ้นบ่อยสำหรับ Java ในบริบทของ Android Android ไม่มี JDK ใด ๆ แต่เป็นการใช้งานรันไทม์ Java ซ้ำแทน ดังนั้นการสนับสนุนคุณลักษณะภาษา Java ใหม่จึงขึ้นอยู่กับ Android ที่สนับสนุนคุณลักษณะภาษาใหม่ ในปัจจุบันแอป Android ทั้งหมดสามารถรองรับคุณสมบัติ Java 7 ทั้งหมดและคุณสมบัติย่อยของ Java 8 โดยใช้การแยกส่วน โปรดดู"ใช้คุณลักษณะและ API ภาษา Java 8"สำหรับรายละเอียด

ต่อไปนี้เป็นบทความโดยละเอียดเกี่ยวกับรายละเอียดเกี่ยวกับคุณสมบัติ Java ใน Android: "การสนับสนุน Java 8 ของ Android"ของ" จากบทความนั้น lambdas มักจะถูกออกแบบมาในไบนารีของ Android ("นี่คือเหตุผลที่ความสิ้นหวังมักเกิดขึ้นในเวลาคอมไพล์โดยไม่คำนึงถึงระดับ API ขั้นต่ำของคุณ")

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.