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 เป็นต้น

ยังไม่มีความคิดเห็น

ยังไม่มีความคิดเห็น