มาตรฐาน C2y เตรียมเพิ่มฟีเจอร์ Defer ดั้งเดิม ขณะที่คอมไพเลอร์หลายตัวเริ่มพัฒนาการรองรับ

ทีมชุมชน BigGo
มาตรฐาน C2y เตรียมเพิ่มฟีเจอร์ Defer ดั้งเดิม ขณะที่คอมไพเลอร์หลายตัวเริ่มพัฒนาการรองรับ

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

ความคืบหน้าการมาตรฐานอย่างเป็นทางการ

ฟีเจอร์ defer สำหรับ C2y มีต้นกำเนิดจากข้อกำหนดทางเทคนิค TS25755 ซึ่งพัฒนามาจากข้อเสนอก่อนหน้านี้รวมถึง N3434 การแก้ไขล่าสุดที่บันทึกเป็น N3687 อธิบายว่า defer จะทำงานเป็นฟีเจอร์ภาษามาตรฐานแทนที่จะเป็นส่วนขยายเฉพาะคอมไพเลอร์ นี่แสดงถึงก้าวสำคัญสำหรับความสามารถในการจัดการทรัพยากรของ C

ต่างจากการใช้งานแบบ macro ทดลองที่อาศัยฟีเจอร์เฉพาะของ GCC เวอร์ชันมาตรฐานจะให้ฟังก์ชัน defer ที่สามารถพกพาได้ข้ามคอมไพเลอร์ต่างๆ ฟีเจอร์นี้ถูกออกแบบให้รันโค้ดทำความสะอาดโดยอัตโนมัติเมื่อตัวแปรออกจากขอบเขต คล้ายกับที่ภาษาอย่าง Go นำเสนอ

ข้อมูลจำเพาะทางเทคนิคหลัก:

  • มาตรฐาน: C2y พร้อมข้อกำหนดทางเทคนิค TS25755
  • การแก้ไขล่าสุด: N3687 (อัปเดตจาก N3488)
  • ขอบเขต: การทำความสะอาด Lexical scope (ทำงานเมื่อสิ้นสุดบล็อก)
  • ความปลอดภัย: หลีกเลี่ยงปัญหา executable stack ของการใช้งาน macro ปัจจุบัน

สถานะการพัฒนาคอมไพเลอร์

โปรเจกต์คอมไพเลอร์หลายตัวได้เริ่มพัฒนาฟีเจอร์ defer ก่อนการมาตรฐานอย่างเป็นทางการ GCC มีแพตช์อยู่ระหว่างการตรวจสอบ ขณะที่คอมไพเลอร์ทางเลือกอย่าง onramp และ slimcc ได้เพิ่มการรองรับแล้ว การยอมรับในช่วงแรกนี้แสดงให้เห็นความสนใจอย่างมากจากอุตสาหกรรม

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

สถานะการพัฒนาคอมไพเลอร์ในปัจจุบัน:

  • GCC: แพตช์อยู่ระหว่างการตรวจสอบ (patchwork.ozlabs.org/project/gcc/list/?series=470822)
  • onramp: ดำเนินการเสร็จสิ้นแล้ว (github.com/ludocode/onramp)
  • slimcc: ดำเนินการเสร็จสิ้นแล้ว (github.com/fuhsnn/slimcc)

ข้อพิจารณาด้านความปลอดภัยและประสิทธิภาพ

การพัฒนาทดลองปัจจุบันที่ใช้ฟังก์ชันซ้อนของ GCC ทำให้เกิดความกังวลด้านความปลอดภัยเนื่องจากการพึ่งพา executable stack trampolines อย่างไรก็ตาม แนวทาง always-inline ที่ใช้ในการพัฒนา macro ล่าสุดหลีกเลี่ยงปัญหานี้ได้โดยสิ้นเชิงด้วยการกำจัดความจำเป็นในการเรียกฟังก์ชัน

คีย์เวิร์ด always_inline จัดการเรื่องนั้นได้ที่นี่

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

ผลกระทบที่กว้างขึ้นต่อการพัฒนา C

การเพิ่ม defer เข้าใน C2y แก้ไขความท้าทายที่มีมานานในการเขียนโปรแกรม C: การทำความสะอาดทรัพยากรที่เชื่อถือได้ข้ามจุดออกหลายจุด แม้ว่านักพัฒนาบางคนจะย้ายไปใช้การจัดการหน่วยความจำแบบ arena เพื่อหลีกเลี่ยงปัญหาการทำความสะอาด defer ยังคงมีค่าสำหรับการจัดการ file descriptors, mutexes และทรัพยากรอื่นๆ ที่ไม่ใช่หน่วยความจำ

ฟีเจอร์นี้ยังให้ทางเลือกแทนโซลูชันที่ซับซ้อนมากขึ้นอย่างการปรับปรุง RAII ให้เข้ากับ C ซึ่งจะต้องมีการเปลี่ยนแปลงอย่างมากในระบบประเภทและความหมายของภาษา Defer นำเสนอแนวทางที่เบากว่าซึ่งเข้ากันได้ดีกว่ากับปรัชญาการออกแบบที่มีอยู่ของ C

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

อ้างอิง: Defer: Resource cleanup in C with GCCs magic