การนำ Algebraic Data Types มาสู่ C99
(github.com/Hirrolot)Datatype99
ไลบรารีที่มอบ algebraic data types ที่ปลอดภัยและเข้าใจได้ง่าย พร้อมรองรับ exhaustive pattern matching และความทนทานในระดับคอมไพล์ไทม์ พัฒนาด้วย C99 ล้วน ๆ จึงไม่ต้องพึ่งเครื่องมือภายนอก
คุณสมบัติหลัก
- ความปลอดภัยของชนิดข้อมูล: ตรวจจับการใช้ตัวแปรแบบชนิดไม่เหมาะสม, pattern matching ที่ไม่ครบถ้วน, การเข้าถึงฟิลด์ที่ไม่ถูกต้อง ฯลฯ ได้ตั้งแต่คอมไพล์ไทม์
- ความสามารถในการพกพา: ต้องการเพียงคอมไพเลอร์ C99 ที่เป็นไปตามมาตรฐานเท่านั้น ไม่ต้องใช้ standard library หรือความสามารถเฉพาะของคอมไพเลอร์/แพลตฟอร์ม รวมถึงไม่ต้องใช้ VLA
- ความคาดเดาได้: มีการกำหนด semantics ของการสร้างโค้ดอย่างเป็นทางการ จึงรับประกันได้ว่า data layout ที่สร้างขึ้นจะเหมือนเดิมเสมอ
- ข้อความผิดพลาดที่เข้าใจง่าย: มีความทนทานต่อโค้ดที่ผิดพลาด
- ผ่านการใช้งานจริงมาแล้ว: ถูกใช้ใน OpenIPC สำหรับพัฒนาซอฟต์แวร์สตรีมมิงแบบเรียลไทม์สำหรับกล้อง IP รวมถึงมี implementation ของ RTSP 1.0 และโค้ดปิดราว 50,000 บรรทัด
การติดตั้ง
- Datatype99 ประกอบด้วยไฟล์เฮดเดอร์เดียว
datatype99.hและ dependency หนึ่งรายการคือ Metalang99 - หากใช้ CMake แนะนำให้นำเข้าผ่าน
FetchContent - หากต้องการสามารถใช้ precompiled headers ได้ ซึ่งช่วยลดเวลาในการคอมไพล์
วิธีใช้งาน
- Datatype99 เป็นเพียง syntax sugar แบบเรียบง่ายสำหรับ tagged unions ที่ปลอดภัยและกระชับกว่า
- ตัวอย่างไบนารีทรี:
- หากเขียนด้วย C โดยตรง ต้องใช้ struct, union, enum ฯลฯ
- แต่ถ้าใช้ Datatype99 สามารถกำหนดได้ง่าย ๆ ด้วยการเรียกแมโคร
datatype - การใช้ pattern matching เพื่อหาผลรวมของทรีก็ทำได้ง่าย
- ความปลอดภัยระดับคอมไพล์ไทม์: หากเข้าถึง binding ของตัวแปรแบบที่ไม่ถูกต้อง จะเกิดข้อผิดพลาดขณะคอมไพล์
- ความยืดหยุ่น: binding เป็นชนิดพอยน์เตอร์จึงแก้ไขได้ และสามารถ dereference เพื่ออ่านค่าได้
- ฟังก์ชัน constructor ของแต่ละตัวแปรแบบจะถูกสร้างให้อัตโนมัติ
- คำอธิบายสั้น ๆ เกี่ยวกับ pattern matching:
- การแมตช์เคสพื้นฐานใช้
otherwise - ใช้
_เมื่อต้องการละเลย binding - ใน
of,ifLetห้ามใช้break/continueระดับบนสุด ให้ใช้ป้ายgotoแทน
- การแมตช์เคสพื้นฐานใช้
ไวยากรณ์และ semantics
- มีทั้งนิยามไวยากรณ์แบบ EBNF และคำอธิบาย semantics
- ในเฮดเดอร์ของไลบรารี แนะนำให้ใช้แมโครเวอร์ชัน postfix
Unit type
- มีให้ใช้งานผ่าน
UnitT99และunit_v99
ความเห็นของ GN⁺
- Datatype99 ทำให้สามารถใช้ algebraic data types ใน C ได้อย่างปลอดภัยและสะดวก จึงดูเป็นข้อได้เปรียบที่สำคัญ และน่าจะผนวกรวมเข้ากับโค้ดเบส C เดิมได้ง่าย
- อย่างไรก็ตาม หากใช้กับ C++ ก็อาจมีส่วนที่ทับซ้อนกับความสามารถของภาษาเอง เช่น template หรือ constexpr ทำให้ข้อได้เปรียบเมื่อเทียบกับ C ลดลง
- แม้การรับประกันความปลอดภัยในระดับคอมไพล์ไทม์จะเป็นข้อดีมาก แต่หากเป็นกรณีที่ชนิดข้อมูลเปลี่ยนแบบไดนามิก ก็ดูจะนำไปใช้ได้ยาก ซึ่งเป็นข้อจำกัดของ static typing
- หากเป็นโปรเจกต์ขนาดเล็ก อาจเขียนเองโดยตรงก็ได้ แต่เมื่อโค้ดเบสใหญ่ขึ้น การใช้ไลบรารีอย่าง Datatype99 น่าจะช่วยทั้งด้านผลิตภาพและความเสถียร
- ไลบรารีที่มีความสามารถใกล้เคียงกันได้แก่ LibADT, Kitsune, P99 เป็นต้น
ยังไม่มีความคิดเห็น