CXXStateTree เผชิญความท้าทายจากชุมชนเกี่ยวกับการอ้างสิทธิ์การจัดสรรหน่วยความจำและการแข่งขันกับ Boost SML

ทีมชุมชน BigGo
CXXStateTree เผชิญความท้าทายจากชุมชนเกี่ยวกับการอ้างสิทธิ์การจัดสรรหน่วยความจำและการแข่งขันกับ Boost SML

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

คุณสมบัติหลักของไลบรารี

  • Fluent builder API พร้อม lambda-based DSL
  • การเปลี่ยนสถานะแบบ event-based
  • guards และ actions เสริมสำหรับการเปลี่ยนสถานะ (ไม่บังคับ)
  • รองรับการทำงานร่วมกับ Google Test
  • รองรับ code coverage ด้วย Codecov
  • การใช้งานแบบ header-only
  • ใช้สัญญาอนุญาต MPL2.0

ความขัดแย้งเรื่องการจัดสรรหน่วยความจำจุดประกายความกังวลในการพัฒนาระบบฝังตัว

การอ้างสิทธิ์ของไลบรารีว่าไม่มีการจัดสรร heap allocation เลยได้ดึงดูดการตรวจสอบอย่างละเอียดจากนักพัฒนาที่สังเกตเห็นว่าโค้ดใช้ standard containers เช่น lists และ unordered maps ผู้ดูแลโปรเจ็กต์ได้ชี้แจงว่าสิ่งนี้หมายถึงการไม่มีการจัดสรรหลังจากการสร้าง state tree แต่ความแตกต่างนี้ได้ทำให้เกิดคำถามสำคัญสำหรับนักพัฒนาระบบฝังตัว แอปพลิเคชันที่มีความสำคัญต่อความปลอดภัย โดยเฉพาะอย่างยิ่งที่ปฏิบัติตามแนวทาง MISRA มักต้องการการกำจัด heap allocation อย่างสมบูรณ์และการจัดสรรหน่วยความจำล่วงหน้าตอนเริ่มต้นระบบ สิ่งนี้ได้นำไปสู่การร้องขอฟีเจอร์สำหรับเวอร์ชันที่ไม่มีการจัดสรรจริงๆ ซึ่งจะเหมาะสำหรับอุปกรณ์ฝังตัวที่มีทรัพยากรจำกัด

MISRA: แนวทาง Motor Industry Software Reliability Association สำหรับความปลอดภัยของซอฟต์แวร์ยานยนต์

การแข่งขันกับไลบรารีที่มีชื่อเสียงทำให้เกิดคำถามเรื่องความแตกต่าง

สมาชิกชุมชนได้ตั้งคำถามว่า CXXStateTree แตกต่างจากทางเลือกที่มีชื่อเสียงแล้วเช่น Boost.Ext.SML (State Machine Language) อย่างไร การเปรียบเทียบนี้ได้จุดประกายการอภิปรายทางเทคนิคเกี่ยวกับแนวทางการใช้งาน โดยนักพัฒนาบางคนสังเกตเห็นความแตกต่างที่น่าสนใจในวิธีที่ไลบรารีเหล่านี้จัดการกับ string literals และการปรับแต่งให้เหมาะสมในเวลาคอมไพล์ ในขณะที่ SML ใช้ user-defined literals ที่ซับซ้อนเพื่อประมวลผล strings ในเวลาคอมไพล์ CXXStateTree ดูเหมือนจะใช้แนวทางที่ตรงไปตรงมากว่าซึ่งอาจมีลักษณะประสิทธิภาพที่แตกต่างกัน

การอภิปรายมาตรฐานโค้ดเกิดขึ้นเรื่องการใช้ Pragma Once

การอภิปรายที่ไม่คาดคิดแต่เต็มไปด้วยความหลงใหลได้เกิดขึ้นรอบการใช้ #pragma once ของไลบรารีสำหรับ include guards ชุมชนแบ่งออกเป็นสองฝ่ายระหว่างผู้ที่มองว่าเป็นมาตรฐานสมัยใหม่ที่รองรับโดยคอมไพเลอร์หลักทั้งหมด (GCC, Clang, MSVC) และผู้ที่ยึดมั่นในประเพณีที่ชอบ include guards ที่สอดคล้องกับมาตรฐาน การอภิปรายนี้สะท้อนความตึงเครียดที่กว้างขึ้นในชุมชน C++ ระหว่างความสะดวกในทางปฏิบัติและการปฏิบัติตามมาตรฐานอย่างเคร่งครัด โดยนักพัฒนาบางคนโต้แย้งว่าฟีเจอร์ที่ไม่ใช่มาตรฐานสร้างความเสี่ยงที่ไม่จำเป็น

ข้อกำหนดของคอมไพเลอร์

  • ต้องการการรองรับคอมไพเลอร์ C++20
  • GCC >= 10
  • Clang >= 11
  • MSVC >= 2019
  • GoogleTest (ดาวน์โหลดอัตโนมัติผ่าน CMake )

การพัฒนาในอนาคตและการมีส่วนร่วมของชุมชน

ผู้ดูแลโปรเจ็กต์ได้แสดงการตอบสนองต่อฟีดแบ็กของชุมชน โดยสนับสนุนให้ผู้ใช้เปิด GitHub issues สำหรับข้อเสนอแนะต่างๆ รวมถึง vcpkg packaging, Python bindings และ compilation switches สำหรับ embedded targets แผนงานของไลบรารีแสดงแผนการที่ทะเยอทะยานรวมถึงการรองรับ coroutine และเอกสารฉบับสมบูรณ์ ซึ่งบ่งบอกถึงการพัฒนาที่กระตือรือร้นแม้จะมีความท้าทายในปัจจุบัน

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

อ้างอิง: CXXStateTree