Mengapa SQLite ditulis dalam C
(sqlite.org)- SQLite dikembangkan dalam bahasa C sejak awal (tahun 2000) karena alasan kinerja, kompatibilitas, dependensi yang minim, dan stabilitas
- C dapat digunakan di hampir semua OS dan bahasa, serta sangat mendukung operasi cepat terutama sebagai library tingkat rendah
- Alasan memilih C alih-alih bahasa berorientasi objek adalah skalabilitas, kemudahan dipanggil dari berbagai bahasa, serta ketidakmatangan C++ dan Java pada saat pengembangan dimulai
- SQLite memiliki struktur satu berkas dengan hampir tanpa dependensi, dan hanya memakai fungsi minimum dari pustaka standar C
- Ada pembahasan tentang penulisan ulang dalam "bahasa aman" seperti Rust dan Go, tetapi dari sisi pengelolaan kualitas, kinerja, dan kemudahan dipanggil sebagai library, C masih unggul
1. Mengapa C adalah pilihan terbaik
- SQLite tetap dipertahankan dalam bahasa C sejak pertama kali dikembangkan pada 29 Mei 2000 hingga sekarang
- Saat ini belum ada rencana untuk menulis ulang ke bahasa lain
- C memiliki kendali yang dekat dengan perangkat keras sekaligus portabilitas yang sangat baik, sehingga sering disebut sebagai “bahasa assembly yang portabel”
- Bahasa lain boleh saja mengklaim “secepat C”, tetapi tidak ada bahasa yang mengklaim lebih cepat dari C
1.1. Kinerja
- Library tingkat rendah seperti SQLite sering dipanggil, sehingga harus mampu berjalan sangat cepat
- Bahasa C cocok untuk menulis kode yang cepat, dengan portabilitas tinggi sambil tetap memungkinkan akses yang dekat ke perangkat keras
- Bahasa modern lain juga mengklaim ‘secepat C’, tetapi dalam pemrograman umum tidak ada bahasa yang dengan yakin dapat disebut lebih cepat dari C
- C memungkinkan kontrol rinci atas memori dan sumber daya CPU, sehingga kadang dapat menunjukkan kinerja 35% lebih cepat daripada sistem berkas
- Contoh: Internal vs External BLOBs
1.2. Kompatibilitas
- Hampir semua sistem dapat memanggil library yang ditulis dalam C
- Misalnya, bahkan di Android (berbasis Java), SQLite bisa digunakan melalui adaptor
- Jika SQLite ditulis dalam Java, maka di iPhone (Objective-C, Swift) SQLite tidak akan bisa dipakai, sehingga sifat serbagunanya akan sangat berkurang
1.3. Dependensi rendah
- Karena dikembangkan sebagai library C, dependensi runtime-nya sangat sedikit
- Pada konfigurasi minimum, SQLite hanya menggunakan fungsi-fungsi paling dasar dari pustaka standar C (memcmp(), memcpy(), memmove(), memset(), strcmp(), strlen(), strncmp())
- Bahkan pada build yang lebih lengkap, dependensinya tetap hanya sedikit, seperti malloc(), free(), dan input/output berkas
- Bahasa modern sering kali membutuhkan runtime besar dalam jumlah banyak dan ribuan antarmuka
1.4. Stabilitas
- C adalah bahasa lama, membosankan, dan jarang berubah, tetapi justru itu berarti dapat diprediksi dan stabil
- Untuk membuat mesin basis data yang kecil, cepat, dan andal seperti SQLite, bahasa yang spesifikasinya tidak sering berubah lebih cocok
- Jika spesifikasi atau implementasi bahasa sering berubah, hal itu merugikan stabilitas SQLite
2. Mengapa tidak ditulis dengan bahasa berorientasi objek
- Sebagian pengembang menganggap sistem kompleks seperti SQLite sulit diimplementasikan tanpa paradigma berorientasi objek, tetapi dibanding C, library yang dibuat dengan C++ atau Java lebih sulit dipanggil dari bahasa lain
- Demi mendukung berbagai bahasa seperti Haskell, Java, dan lainnya, pilihan library C adalah keputusan yang masuk akal
- Berorientasi objek adalah pola desain, bukan bahasa, sehingga tidak terbatas pada bahasa tertentu
- Bahkan di C, pola berorientasi objek bisa diimplementasikan dengan struct dan function pointer
- Berorientasi objek tidak selalu merupakan struktur terbaik; kode prosedural kadang lebih jelas, lebih mudah dikelola, dan bisa menghasilkan performa yang lebih baik
- Pada masa awal pengembangan SQLite (sekitar tahun 2000)
- Java masih belum matang
- C++ memiliki masalah kompatibilitas yang serius antar-compiler
→ Saat itu, C adalah pilihan yang paling praktis dan aman
- Bahkan sekarang pun, manfaat untuk menulis ulang SQLite masih belum cukup besar
3. Mengapa tidak ditulis dalam "bahasa aman"
- Belakangan minat terhadap bahasa pemrograman aman seperti Rust dan Go memang meningkat, tetapi pada saat SQLite pertama kali dikembangkan (bahkan selama 10 tahun pertamanya), bahasa-bahasa itu belum ada
- Jika ditulis ulang dalam Go atau Rust, ada kemungkinan bug justru lebih banyak muncul atau kinerjanya menurun
- Bahasa-bahasa ini menyisipkan kode percabangan (branch) tambahan untuk pengecekan memori dan sebagainya, sementara dalam strategi kualitas SQLite, branch coverage 100% sangat penting, dan bagian ini belum terpenuhi
- Bahasa aman umumnya menghentikan program saat terjadi kondisi out-of-memory, sedangkan SQLite dirancang agar bisa pulih bahkan dalam kondisi kekurangan memori
- Rust, Go, dan bahasa sejenisnya masih merupakan bahasa yang relatif baru dan masih memerlukan pengembangan berkelanjutan
- Karena itu, tim pengembang SQLite mendukung perkembangan bahasa aman, tetapi untuk implementasi SQLite mereka tetap mengutamakan stabilitas C yang telah teruji
Meski begitu, suatu hari nanti kemungkinan ditulis ulang dalam Rust tetap ada. Kemungkinan ditulis dalam Go rendah karena Go tidak menyukai assert()
- Namun, ada prasyarat agar dapat ditulis dalam Rust:
- Rust harus menjadi lebih matang, dengan siklus perubahan yang lebih lambat, hingga menjadi “bahasa lama dan membosankan”
- Harus terbukti bisa membuat library umum yang dapat dipanggil dari berbagai bahasa
- Harus bisa menghasilkan object code yang berjalan bahkan pada perangkat tanpa OS seperti sistem embedded
- Harus tersedia alat uji branch coverage 100% untuk biner hasil kompilasi
- Harus dapat pulih dari error OOM (kehabisan memori)
- Rust harus mampu melakukan semua hal yang ditangani C di SQLite tanpa penurunan kinerja
- Jika seorang penggemar Rust (rustacean) menganggap syarat-syarat di atas sebenarnya sudah terpenuhi dan SQLite memang perlu ditulis ulang dalam Rust, ia dianjurkan untuk langsung menghubungi pengembang SQLite dan menyampaikan pendapatnya
2 komentar
Komentar Hacker News
if (i >= array_length) panic("index out of bounds"), dan saya rasa kode itu sendiri sudah diuji dengan baik oleh compiler Rust, jadi tidak perlu dikhawatirkan. Saya penasaran apakah saya memahami logika ini dengan benarget_unchecked()di Rust, akses tanpa bounds check juga dimungkinkan, sehingga keamanan tetap terjaga sambil meningkatkan performa dokumentasi get_uncheckedif condition { panic(err) }sebagai semacam fungsi assertFrasa bahwa
Cjuga merupakan risiko keamanan bagi SQLite, apakah itu tetap berlaku bahkan jika pengujian ditulis dengan sangat baik dan pengembangnya sangat berpengalaman? Logika dan proses pengembangan mungkin bisa menjadi masalah, tetapi sulit dipahami bahwa bahasanya sendiri merupakan kerentanan keamanan. Faktanya, hampir tidak ada program yang tidak bergantung pada infrastruktur yang ditulis dalamC.