คณะกรรมการ C++ เลือก Profiles แทนข้อเสนอ Safe C++ ก่อให้เกิดการถ่ายเทในชุมชนเกี่ยวกับทิศทางความปลอดภัยของภาษา

ทีมชุมชน BigGo
คณะกรรมการ C++ เลือก Profiles แทนข้อเสนอ Safe C++ ก่อให้เกิดการถ่ายเทในชุมชนเกี่ยวกับทิศทางความปลอดภัยของภาษา

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

ข้อเสนอ Safe C++ ที่เปิดตัวเมื่อปีที่แล้ว มีเป้าหมายที่จะนำการรับประกันความปลอดภัยแบบ Rust มาสู่ C++ ผ่านระบบ safe context แบบ opt-in ข้อเสนอนี้สัญญาว่าจะให้ความปลอดภัยหน่วยความจำที่แข็งแกร่ง ความปลอดภัยของประเภทข้อมูล และความปลอดภัยของเธรดโดยไม่ทำลายโค้ดที่มีอยู่ นักพัฒนาสามารถทำเครื่องหมายส่วนเฉพาะของโค้ดให้ปลอดภัยในขณะที่ปล่อยให้ส่วน legacy ไม่เปลี่ยนแปลง สร้างเส้นทางการย้ายแบบค่อยเป็นค่อยไปสู่แนวทางการเขียนโปรแกรมที่ปลอดภัยกว่า

การเปรียบเทียบ Safe C++ กับ Profiles

ด้าน ข้อเสนอ Safe C++ แนวทาง Profiles
ระดับความปลอดภัย รับประกันความปลอดภัยเทียบเท่า Rust จำกัด เป็นเพียงการตรวจสอบแบบ linter
การนำไปใช้ syntax และโครงสร้างภาษาใหม่ ข้อจำกัดในฟีเจอร์ที่มีอยู่
เส้นทางการย้าย เลือกใช้ safe contexts ข้อจำกัดในเวลา compile
ความเข้ากันได้แบบย้อนหลัง เข้ากันได้เต็มรูปแบบกับโค้ดที่มีอยู่ เข้ากันได้เต็มรูปแบบกับโค้ดที่มีอยู่
สถานะของคณะกรรมการ ถูกยกเลิก ดำเนินการอย่างแข็งขัน
ความซับซ้อนทางเทคนิค สูง (borrow checker, lifetimes) ปานกลาง (ตามข้อจำกัด)

คณะกรรมการให้ความสำคัญกับความเข้ากันได้แบบย้อนหลังมากกว่าการเปลี่ยนแปลงที่ปฏิวัติ

Sean Baxter หนึ่งในผู้เขียน Safe C++ คนแรก ยืนยันว่ากลุ่มงาน Safety and Security ได้ลงคะแนนให้ความสำคัญกับ Profiles มากกว่าข้อเสนอที่ทะเยอทะยานมากกว่า ความต้านทานของคณะกรรมการต่อการนำกลไกความปลอดภัยแบบ Rust มาใช้สะท้อนถึงความตึงเครียดทางวัฒนธรรมที่ลึกซึ้งภายในชุมชน C++ สมาชิกคณะกรรมการหลายคนมองว่าแบบจำลองความปลอดภัยของ Rust เป็นการออกห่างจากปรัชญาดั้งเดิมของ C++ อย่างรุนแรงเกินไป

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

ข้อจำกัดทางเทคนิคก่อให้เกิดความสงสัย

ความสามารถทางเทคนิคของ Profiles ได้รับการวิพากษ์วิจารณ์อย่างรุนแรงจากผู้สนับสนุนความปลอดภัย ไม่เหมือนกับ Safe C++ หรือ borrow checker ของ Rust, Profiles ไม่สามารถให้การรับประกันทางคณิตศาสตร์ในระดับเดียวกันเกี่ยวกับความปลอดภัยหน่วยความจำ ระบบนี้ทำหน้าที่เป็น linter ขั้นสูงมากกว่าจะเป็นกลไกความปลอดภัยพื้นฐาน

เทคโนโลยี profiles ไม่ค่อยดีนัก แต่นั่นไม่สำคัญเมื่อเทียบกับปัญหาวัฒนธรรม เมื่อคุณตัดสินใจทำให้เพลง bagpipe ที่เศร้าโศกยาวสิบห้านาทีเป็นซิงเกิลหลัก มันไม่สำคัญหรอกว่าคุณจะใช้ไวนิลสีหรือไม่

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

ข้อจำกัดทางเทคนิคหลักของ Profiles

  • ไม่สามารถจัดการกับ non-owning reference types ได้อย่างปลอดภัย
  • ไม่มีความสามารถในการติดตาม lifetime
  • จำกัดเพียงข้อจำกัดในเวลา compile-time บนฟีเจอร์ที่มีอยู่
  • มีปัญหากับรูปแบบทั่วไปเช่น string_view
  • ให้การรับประกันที่อ่อนแอกว่าระบบพิสูจน์ทางคณิตศาสตร์
  • ทำงานเหมือน advanced static analyzer มากกว่าระบบความปลอดภัย

ชุมชนแบ่งแยกเกี่ยวกับเส้นทางไปข้างหน้า

การตัดสินใจนี้ได้เปิดเผยการแบ่งแยกพื้นฐานในชุมชน C++ ผู้ที่หลงใหล C++ มายาวนานที่ทำหน้าที่ในคณะกรรมการมาตรฐานมีแนวโน้มที่จะต่อต้านการเปลี่ยนแปลงอย่างมากที่อาจทำให้ผู้ใช้ที่มีอยู่รู้สึกห่างเหิน ในขณะเดียวกัน นักพัฒนาที่ทำงานกับแอปพลิเคชันที่สำคัญด้านความปลอดภัยพบว่าตัวเองถูกบังคับให้พิจารณาทางเลือกอื่นเช่น Rust มากขึ้น

สมาชิกชุมชนบางคนแนะนำให้ทำตามแบบจำลอง HTML5 ที่ผู้ผลิตเบราว์เซอร์ข้ามองค์กรมาตรฐาน W3C อย่างเป็นหลักเพื่อสร้าง WHATWG อย่างไรก็ตาม ไม่เหมือนกับเว็บเบราว์เซอร์ที่บริษัทใหญ่ไม่กี่แห่งควบคุมการดำเนินการ คอมไพเลอร์ C++ ได้รับการพัฒนาโดยกลุ่มที่หลากหลายซึ่งมีลำดับความสำคัญและทรัพยากรที่แตกต่างกัน

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

มองไปข้างหน้า: ความก้าวหน้าแบบค่อยเป็นค่อยไปหรือโอกาสที่พลาดไป?

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

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

ในตอนนี้ นักพัฒนาที่แสวงหาการรับประกันความปลอดภัยที่แข็งแกร่งอาจต้องมองไปไกลกว่ามาตรฐาน C++ อย่างเป็นทางการไปยังเครื่องมือทดลอง การดำเนินการทางเลือก หรือภาษาที่แตกต่างกันโดยสิ้นเชิง การละทิ้งข้อเสนอ Safe C++ ไม่ได้เป็นเพียงการตัดสินใจทางเทคนิค แต่เป็นการเลือกเชิงปรัชญาเกี่ยวกับทิศทางอนาคตของภาษา

อ้างอิง: Safe C++ proposal is not being continued