Pengenalan Algebraic Data Types untuk C99
(github.com/Hirrolot)Datatype99
Pustaka yang menyediakan algebraic data types yang aman dan intuitif, dengan pattern matching yang ekshaustif dan fitur ketahanan pada waktu kompilasi. Diimplementasikan dalam C99 murni sehingga tidak memerlukan alat eksternal.
Fitur utama
- Keamanan tipe: perubahan varian dengan tipe yang tidak tepat, pattern matching yang tidak lengkap, akses field yang tidak valid, dan lainnya dideteksi pada waktu kompilasi.
- Portabilitas: cukup dengan kompiler C99 yang patuh standar. Tidak memerlukan pustaka standar, fitur khusus kompiler/platform, VLA, dan sebagainya.
- Prediktabilitas: semantik formal untuk pembangkitan kode telah didefinisikan, sehingga menjamin layout data yang dihasilkan selalu sama.
- Error yang mudah dipahami: tangguh terhadap kode yang salah.
- Terbukti di dunia nyata: digunakan di OpenIPC untuk pengembangan perangkat lunak streaming real-time bagi kamera IP. Termasuk implementasi RTSP 1.0 dan sekitar 50 ribu baris kode privat.
Instalasi
- Datatype99 terdiri dari satu file header
datatype99.hdan satu dependensi, Metalang99. - Jika menggunakan CMake, disarankan mengambilnya melalui
FetchContent. - Jika perlu, Anda dapat menggunakan precompiled header. Ini dapat mengurangi waktu kompilasi.
Cara penggunaan
- Datatype99 adalah sugar syntax sederhana untuk tagged union. Lebih aman dan lebih ringkas.
- Contoh pohon biner:
- Jika diimplementasikan langsung dalam C, Anda perlu menggunakan struct, union, enum, dan sebagainya.
- Dengan Datatype99, definisi dapat dibuat cukup dengan memanggil makro
datatype. - Menggunakan pattern matching untuk menghitung jumlah nilai dalam pohon juga sederhana.
- Keamanan waktu kompilasi: jika mencoba mengakses binding dari varian yang salah, akan terjadi error kompilasi.
- Fleksibilitas: binding bertipe pointer sehingga dapat dimodifikasi, dan nilainya bisa diperoleh dengan melakukan dereferensi.
- Fungsi konstruktor varian dibuat secara otomatis.
- Penjelasan singkat tentang pattern matching:
- Pencocokan kasus default menggunakan
otherwise - Untuk mengabaikan binding, gunakan
_ - Dalam
of,ifLet, penggunaanbreak/continuepada level teratas dilarang. Gunakan labelgoto.
- Pencocokan kasus default menggunakan
Tata bahasa dan semantik
- Tersedia definisi tata bahasa EBNF dan penjelasan semantik.
- Di header pustaka, disarankan menggunakan versi postfix dari makro.
Tipe unit
- Disediakan sebagai
UnitT99danunit_v99.
Opini GN⁺
- Dengan Datatype99, algebraic data types dapat digunakan di C dengan aman dan mudah, yang tampaknya menjadi keunggulan besar. Juga terlihat mudah untuk diintegrasikan ke codebase C yang sudah ada.
- Namun, jika digunakan di C++, kemungkinan ada bagian yang tumpang tindih dengan fitur bawaan bahasa seperti template atau
constexpr. Keuntungannya bisa berkurang dibandingkan di C. - Menjamin keamanan pada waktu kompilasi adalah keunggulan besar, tetapi tampaknya sulit dimanfaatkan ketika tipe data berubah secara dinamis. Ini adalah batasan dari static typing.
- Untuk proyek kecil, implementasi langsung mungkin sudah cukup, tetapi ketika codebase membesar, memanfaatkan pustaka seperti Datatype99 tampaknya akan membantu dari sisi produktivitas dan stabilitas.
- Pustaka yang menyediakan fungsi serupa antara lain LibADT, Kitsune, dan P99.
Belum ada komentar.