- Penulis mencoba pendekatan baru saat mempelajari bahasa Zig sambil mengerjakan proyek penulisan ulang indeks AcoustID, dipicu oleh keterbatasan dalam pemrograman jaringan
- Untuk menghadirkan model I/O asinkron dan konkurensi yang sebelumnya digunakan di C++ dan Go ke Zig, ia memutuskan mengembangkan pustakanya sendiri
- Hasilnya, ia membuat pustaka Zio yang mengimplementasikan model konkurensi bergaya Go agar sesuai dengan Zig, sehingga memungkinkan penulisan kode asinkron yang terlihat seperti sinkron tanpa callback
- Zio mendukung I/O jaringan dan berkas asinkron, channel, primitive sinkronisasi, pemantauan sinyal dan lainnya, serta menunjukkan performa lebih cepat daripada Go atau Tokio milik Rust dalam mode single-thread
- Proyek ini menunjukkan kemungkinan menggabungkan performa tingkat sistem Zig dengan model konkurensi modern, dan dinilai sebagai titik balik penting dalam perluasan ekosistem Zig
Bahasa Zig dan motivasi awal
- Penulis sebelumnya telah mengamati Zig, yang awalnya dirancang sebagai bahasa tingkat rendah untuk perangkat lunak audio, tetapi belum merasa ada kebutuhan praktis untuk menggunakannya
- Ia mulai tertarik setelah melihat Andrew Kelley, pencipta Zig, mengimplementasikan ulang algoritme Chromaprint milik penulis dalam Zig
- Ia menjadikan proyek penulisan ulang inverted index di AcoustID sebagai kesempatan untuk belajar Zig, dan pada akhirnya berhasil mencapai implementasi yang lebih cepat dan lebih skalabel dibanding versi C++
- Namun, pada tahap penambahan antarmuka server, ia menghadapi masalah kurangnya dukungan jaringan asinkron
Pendekatan sebelumnya dan keterbatasannya
- Pada versi C++ sebelumnya, framework Qt digunakan untuk menangani I/O asinkron; walaupun berbasis callback, pendekatan ini tetap dapat dipakai berkat dukungannya yang kaya
- Dalam prototipe berikutnya, ia memanfaatkan kemudahan jaringan dan konkurensi dari bahasa Go, tetapi Zig tidak memiliki abstraksi pada tingkat yang setara
- Untuk mengimplementasikan server TCP dan lapisan klaster di Zig, muncul inefisiensi karena harus membuat banyak thread
- Untuk mengatasinya, ia menulis sendiri klien Zig untuk sistem pesan NATS (
nats.zig) sambil mendalami fitur jaringan di Zig
Munculnya pustaka Zio
- Berdasarkan pengalaman tersebut, ia merilis Zio: pustaka I/O asinkron dan konkurensi untuk Zig
- Zio bertujuan memungkinkan penulisan kode asinkron tanpa callback, dengan struktur yang secara internal bekerja secara asinkron tetapi dari luar terlihat seperti sinkron
- Zio mengimplementasikan model konkurensi bergaya Go secara terbatas agar sesuai dengan Zig
- Task di Zio berbentuk stackful coroutine dengan stack berukuran tetap
- Saat
stream.read() dipanggil, operasi I/O dijalankan di latar belakang, lalu task dilanjutkan kembali setelah selesai untuk mengembalikan hasil
- Pendekatan ini sekaligus memberikan penyederhanaan pengelolaan state dan peningkatan keterbacaan kode
Susunan fitur dan struktur runtime
- Zio mendukung I/O jaringan dan berkas asinkron penuh, primitive sinkronisasi (mutex, condition variable, dll.), channel bergaya Go, pemantauan sinyal OS, dan lainnya
- Task dapat dijalankan dalam mode single-thread maupun multi-thread
- Dalam mode multi-thread, task dapat berpindah antar-thread, sehingga memberikan efek penurunan latensi dan peningkatan penyeimbangan beban
- Zio mengimplementasikan antarmuka Reader/Writer standar untuk memastikan kompatibilitas dengan pustaka eksternal
Performa dan perbandingan
- Penulis belum merilis benchmark resmi, tetapi menyebut telah mengonfirmasi performa yang lebih cepat daripada Go dan Tokio milik Rust dalam mode single-thread
- Biaya context switching turun hingga setara pemanggilan fungsi, sehingga kecepatan perpindahannya nyaris gratis
- Mode multi-thread masih belum sekuat Go/Tokio, tetapi menunjukkan performa serupa atau sedikit lebih cepat
- Di masa depan, penambahan fitur fairness dapat membuat performanya sedikit menurun
Contoh kode dan pemanfaatan
- Dokumentasi mencakup contoh kode server HTTP berbasis Zio
- Menggunakan
zio.net.Stream untuk menerima koneksi dan menangani tiap koneksi sebagai task terpisah
zio.Runtime mengelola eksekusi task dan penjadwalan I/O
- Struktur ini memungkinkan penulisan I/O asinkron seperti kode sinkron, sekaligus menghadirkan kontrol alur yang jelas dan pengelolaan pelepasan sumber daya
Rencana ke depan dan makna proyek
- Melalui Zio, penulis menilai bahwa Zig dapat berkembang melampaui sekadar bahasa untuk kode sistem berperforma tinggi, menjadi bahasa untuk pengembangan aplikasi jaringan yang lengkap
- Sebagai langkah berikutnya, ia berencana menulis ulang klien NATS berbasis Zio dan mengembangkan pustaka klien/server HTTP berbasis Zio
- Proyek ini dinilai mendorong perluasan infrastruktur jaringan dan konkurensi dalam ekosistem Zig, serta sebagai upaya membangun model runtime modern yang sebanding dengan Go atau Rust
Belum ada komentar.