ข้อกำหนดล่าสุดของภาษาโปรแกรม C คือ C23 ได้นำเสนอโมเดลหน่วยความจำ provenance ที่มุ่งหวังจะปรับปรุงการเพิ่มประสิทธิภาพของคอมไพเลอร์และความปลอดภัยของโปรแกรม อย่างไรก็ตาม การอภิปรายทางเทคนิคได้ถูกบดบังด้วยความกังวลของชุมชนเกี่ยวกับชื่อตัวแปร Unicode และปัญหาการจัดรูปแบบที่รุนแรงในการนำเสนอบทความต้นฉบับ
ตัวระบุ Unicode สร้างความขัดแย้ง
การใช้อักขระ Unicode ในชื่อตัวแปรของบทความได้จุดประกายการถกเถียงอย่างรุนแรงในหมู่โปรแกรมเมอร์ C แม้ว่า C23 จะรองรับตัวระบุ Unicode อย่างเป็นทางการผ่านการใช้สัญลักษณ์ escape แต่นักพัฒนาจำนวนมากแสดงความคัดค้านอย่างแรงต่อฟีเจอร์นี้ ชุมชนยังคงแบ่งแยกกันเรื่องว่าชื่อตัวแปร Unicode จะช่วยปรับปรุงความสามารถในการอ่านโค้ดสำหรับนิพจน์ทางคณิตศาสตร์หรือสร้างความซับซ้อนที่ไม่จำเป็น
การรองรับการใช้งานแตกต่างกันอย่างมากระหว่างคอมไพเลอร์ GCC ยอมรับตัวระบุ Unicode โดยไม่มีข้อร้องเรียน ในขณะที่ Clang สร้างคำเตือน ความไม่สอดคล้องกันนี้เพิ่มความหงุดหงิดให้กับนักพัฒนา เนื่องจากการพกพาโค้ดกลายเป็นปัญหาเมื่อใช้ฟีเจอร์ใหม่เหล่านี้
การรองรับ Unicode Identifier ใน C23 โดย Compiler:
- GCC: รองรับอย่างเต็มรูปแบบ รับ Unicode identifier โดยไม่มีคำเตือน
- Clang: รองรับอย่างจำกัด สร้างคำเตือนสำหรับ Unicode identifier
- มาตรฐาน: รองรับ Unicode ผ่าน \u และ \U escape notation ตั้งแต่ C99 และรองรับ explicit encoding ตั้งแต่ C23
เนื้อหาทางเทคนิคเสียหายจากปัญหาการจัดรูปแบบ
บทความต้นฉบับประสบปัญหาการจัดรูปแบบที่รุนแรงจนทำให้อ่านไม่ได้สำหรับผู้ใช้จำนวนมาก บล็อกโค้ดไม่สามารถปิดได้อย่างถูกต้อง HTML entities ปรากฏเป็นข้อความดิบ และย่อหน้าหลายย่อหน้าเกิดการปะปนกัน ปัญหาเหล่านี้บังคับให้สมาชิกชุมชนต้องหารูปแบบทางเลือก โดยบางคนใช้เครื่องมือ AI เพื่อเขียนเนื้อหาใหม่ในรูปแบบที่เข้าถึงได้มากขึ้น
บล็อกโค้ดอ่านได้ยากมากในหน้านี้ ผมให้ ChatGPT O3 เขียนใหม่ในรูปแบบที่เข้าถึงได้มากขึ้น
ปัญหาการจัดรูปแบบส่งผลกระทบต่อคำอธิบายทางเทคนิคของโมเดล provenance เป็นพิเศษ ซึ่งต้องอาศัยตัวอย่างโค้ดเป็นหลักในการอธิบายแนวคิด ความขัดแย้งนี้ไม่ได้หลุดพ้นจากสายตาผู้อ่าน เนื่องจากบทความเกี่ยวกับมาตรฐานการโปรแกรม C กลับกลายเป็นบทความที่อ่านยากเพราะปัญหาการนำเสนอขั้นพื้นฐาน
คำมั่นสัญญาทางเทคนิคของโมเดล Provenance
แม้จะมีปัญหาการนำเสนอ แต่เนื้อหาทางเทคนิคพื้นฐานได้กล่าวถึงแนวคิดสำคัญในการโปรแกรม C สมัยใหม่ โมเดล provenance ปฏิบัติต่อการจัดสรรหน่วยความจำเหมือนระบบความสามารถมากกว่าการคำนวณที่อยู่แบบง่าย ๆ แนวทางนี้สัญญาว่าจะให้พฤติกรรมที่มีการกำหนดได้มากขึ้นและโอกาสในการเพิ่มประสิทธิภาพคอมไพเลอร์ที่ดีกว่า
โมเดลนี้มุ่งหวังที่จะแก้ไขปัญหาที่มีมายาวนานเกี่ยวกับ pointer aliasing และพฤติกรรมที่ไม่ได้กำหนดไว้ซึ่งรบกวนโปรแกรม C มาเป็นทศวรรษ ด้วยการติดตามที่มาหรือต้นกำเนิดของ pointers คอมไพเลอร์สามารถสร้างสมมติฐานที่แข็งแกร่งขึ้นเกี่ยวกับรูปแบบการเข้าถึงหน่วยความจำและดำเนินการเพิ่มประสิทธิภาพแบบก้าวร้าวได้อย่างปลอดภัย
แนวคิดหลักของ Provenance Model:
- หน่วยความจำในฐานะความสามารถ: malloc ทำหน้าที่เป็นผู้ออก capability มากกว่าการเป็นตัวสร้าง address
- การควบคุมการเข้าถึง: การตรวจสอบความถูกต้องโดยอิงจาก pointer provenance มากกว่าการตรวจสอบช่วง address
- ประโยชน์ด้านการเพิ่มประสิทธิภาพ: ช่วยให้ compiler สามารถทำการเพิ่มประสิทธิภาพได้อย่างรุนแรงมากขึ้นผ่านสมมติฐาน aliasing ที่แข็งแกร่งกว่า
- การลดลงของ Undefined Behavior: แก้ไขปัญหาที่มีมายาวนานเกี่ยวกับ pointer aliasing ในโปรแกรม C
ชุมชนแสวงหาโซลูชันที่ปฏิบัติได้
นอกเหนือจากการถกเถียงทางเทคนิค นักพัฒนาจำนวนมากแสดงความสนใจในการทำให้ C ทันสมัยสำหรับการพัฒนาซอฟต์แวร์ร่วมสมัย สมาชิกชุมชนบางคนแนะนำภาษาทางเลือกเช่น Zig เป็นโซลูชันที่มีศักยภาพที่ให้ประสิทธิภาพเหมือน C พร้อมฟีเจอร์ความปลอดภัยที่ปรับปรุงแล้ว คนอื่น ๆ สนับสนุนเครื่องมือเช่น TySan (Type-Based Aliasing sanitizer) ของ LLVM เพื่อช่วยตรวจจับรูปแบบโค้ดที่มีปัญหา
การอภิปรายสะท้อนความตึงเครียดที่กว้างขึ้นในชุมชน C ระหว่างการรักษาความเข้ากันได้แบบย้อนหลังและการยอมรับแนวปฏิบัติการโปรแกรมสมัยใหม่ ในขณะที่นักพัฒนาบางคนต้อนรับการรองรับ Unicode สำหรับสัญลักษณ์ทางคณิตศาสตร์ในความคิดเห็นและตัวระบุ คนอื่น ๆ ชอบซอร์สโค้ดที่เป็น ASCII เท่านั้นเพื่อความสามารถในการพกพาสูงสุด
โมเดลหน่วยความจำ provenance แสดงถึงก้าวสำคัญไปข้างหน้าสำหรับวิวัฒนาการของ C แต่การยอมรับจะขึ้นอยู่กับว่าผู้จำหน่ายคอมไพเลอร์ใช้ข้อกำหนดได้ดีเพียงใดและชุมชนสามารถบรรลุฉันทามติในฟีเจอร์ที่ก่อให้เกิดความขัดแย้งเช่นตัวระบุ Unicode ได้หรือไม่
อ้างอิง: The provenance memory model for C