1 điểm bởi GN⁺ 2024-05-10 | Chưa có bình luận nào. | Chia sẻ qua WhatsApp

Datatype99

Đây là một thư viện cung cấp algebraic data types an toàn và trực quan, đồng thời hỗ trợ pattern matching đầy đủ và khả năng chống lỗi ở thời điểm biên dịch. Được triển khai bằng C99 thuần túy nên không cần công cụ bên ngoài.

Các đặc điểm chính

  • An toàn kiểu: Các biến thể với kiểu không phù hợp, pattern matching không đầy đủ, truy cập trường không hợp lệ, v.v. đều được phát hiện ở thời điểm biên dịch.
  • Tính di động: Chỉ cần một trình biên dịch C99 tuân thủ tiêu chuẩn. Không cần thư viện chuẩn, tính năng đặc thù của trình biên dịch/nền tảng hay VLA.
  • Tính dự đoán được: Có định nghĩa ngữ nghĩa sinh mã chính thức, bảo đảm layout dữ liệu được tạo ra luôn giống nhau.
  • Lỗi dễ hiểu: Có độ bền vững cao trước mã sai.
  • Đã được kiểm chứng thực tế: Được dùng trong OpenIPC để phát triển phần mềm streaming thời gian thực cho camera IP. Bao gồm triển khai RTSP 1.0 và khoảng 50 nghìn dòng mã riêng tư.

Cài đặt

  • Datatype99 gồm một file header datatype99.h và một dependency là Metalang99.
  • Nếu dùng CMake thì nên lấy về qua FetchContent.
  • Nếu cần, có thể dùng precompiled header. Điều này có thể giúp giảm thời gian biên dịch.

Cách dùng

  • Datatype99 là một dạng cú pháp rút gọn đơn giản cho tagged union. An toàn hơn và ngắn gọn hơn.
  • Ví dụ cây nhị phân:
    • Nếu tự triển khai trực tiếp bằng C thì phải dùng struct, union, enum, v.v.
    • Với Datatype99, có thể định nghĩa đơn giản bằng lời gọi macro datatype
    • Việc dùng pattern matching để tính tổng của cây cũng rất đơn giản
      • An toàn ở thời điểm biên dịch: nếu truy cập binding của biến thể sai thì sẽ phát sinh lỗi biên dịch
      • Tính linh hoạt: binding có kiểu con trỏ nên có thể thay đổi, và có thể dereference để lấy giá trị
    • Hàm constructor cho biến thể được tự động sinh ra
  • Giải thích ngắn gọn về pattern matching:
    • So khớp trường hợp mặc định dùng otherwise
    • Bỏ qua binding dùng _
    • Trong of, ifLet không được dùng break/continue ở cấp cao nhất. Hãy dùng nhãn goto.

Cú pháp và ngữ nghĩa

  • Có cung cấp định nghĩa ngữ pháp EBNF và giải thích ngữ nghĩa.
  • Trong header của thư viện, nên dùng phiên bản hậu tố của macro.

Kiểu đơn vị

  • Được cung cấp dưới dạng UnitT99unit_v99.

Ý kiến của GN⁺

  • Dùng Datatype99 giúp có thể sử dụng algebraic data types trong C một cách an toàn và tiện lợi, đây có vẻ là một ưu điểm lớn. Có lẽ cũng dễ tích hợp vào codebase C hiện có.
  • Tuy nhiên, nếu dùng trong C++ thì có thể sẽ trùng lặp với các tính năng sẵn có của ngôn ngữ như template hay constexpr. So với C, lợi ích có thể sẽ giảm đi.
  • Bảo đảm an toàn ở thời điểm biên dịch là một ưu điểm lớn, nhưng có vẻ sẽ khó áp dụng trong những trường hợp kiểu dữ liệu thay đổi động. Đây là giới hạn của static typing.
  • Với dự án nhỏ thì có thể tự triển khai cũng được, nhưng khi codebase lớn lên, việc tận dụng một thư viện như Datatype99 có vẻ sẽ giúp ích về năng suất và độ ổn định.
  • Các thư viện cung cấp tính năng tương tự có thể kể đến LibADT, Kitsune, P99.

Chưa có bình luận nào.

Chưa có bình luận nào.