- Bahasa Zig memperkenalkan model baru berbasis antarmuka
Io untuk mengurangi kompleksitas desain I/O asinkron yang ada
- Model ini mempertahankan struktur fungsi yang sama tanpa membedakan kode sinkron dan asinkron, serta menyediakan dua implementasi:
Io.Threaded dan Io.Evented
Io.Threaded pada dasarnya menjalankan eksekusi sinkron, sedangkan Io.Evented melakukan eksekusi asinkron berbasis event loop
- Pengembang dapat mengontrol eksekusi paralel melalui fungsi
async() dan concurrent(), sehingga optimasi performa dimungkinkan tanpa mengubah kode
- Pendekatan ini menyelesaikan masalah function coloring sambil tetap mempertahankan kesederhanaan dan kemampuan kontrol khas Zig untuk meraih performa asinkron
Perubahan Desain Asinkron di Zig
- Zig mencari pendekatan baru karena desain asinkron sebelumnya kurang selaras dengan filosofi minimalisme bahasa tersebut
- Desain lama memiliki tingkat integrasi yang rendah dengan fitur lain
- Model baru memungkinkan I/O sinkron dan asinkron ditangani dengan struktur kode yang sama
- Desain baru berpusat pada antarmuka generik
Io
- Semua fungsi I/O dijalankan dengan menerima instance
Io sebagai parameter
- Strukturnya mirip dengan antarmuka
Allocator, sehingga I/O dapat dikendalikan dengan cara yang serupa seperti alokasi memori
Struktur Antarmuka Io
- Pustaka standar menyertakan dua implementasi dasar
Io.Threaded: pada dasarnya eksekusi sinkron, dengan pemrosesan paralel berbasis thread bila diperlukan
Io.Evented: eksekusi asinkron berbasis event loop (menggunakan io_uring, kqueue, dan lain-lain)
- Pengguna juga dapat menulis implementasi
Io baru sendiri, sehingga bisa mengontrol cara eksekusi dengan lebih rinci
Contoh Kode dan Cara Kerjanya
- Fungsi contoh
saveFile() membuat file, menulis isinya, lalu menutupnya
- Saat menggunakan
Io.Threaded, fungsi ini berjalan lewat system call biasa
- Saat menggunakan
Io.Evented, fungsi ini dijalankan melalui backend asinkron
- Dalam kedua kasus, penyelesaian pekerjaan dijamin pada saat pemanggilan
writeAll()
- Kode yang sama berjalan identik baik di lingkungan sinkron maupun asinkron
- Penulis library tidak perlu memikirkan metode eksekusinya
Eksekusi Paralel dan async() / concurrent()
- Fungsi
async() meminta eksekusi asinkron, tetapi pada Io.Threaded bisa saja dijalankan segera
- Pada
Io.Evented, dua file benar-benar dapat disimpan secara bersamaan lewat eksekusi asinkron
- Fungsi
concurrent() digunakan ketika eksekusi paralel yang nyata memang diperlukan
Io.Threaded memanfaatkan thread pool
Io.Evented menanganinya dengan cara yang sama seperti async()
- Pemilihan fungsi yang salah (
async alih-alih concurrent) dianggap sebagai bug, dan tidak bisa dicegah di tingkat bahasa
Gaya Kode dan Integrasi Bahasa
- Gaya kode Zig biasa tetap dipertahankan tanpa sintaks khusus untuk asinkron
- Sintaks alur kontrol yang ada seperti
try, defer, dan lainnya tetap digunakan apa adanya
- Andrew Kelley menyebutnya “terbaca seperti kode Zig standar”
- Sebagai contoh, ditunjukkan implementasi lookup DNS asinkron
- Tidak seperti
getaddrinfo(), implementasi ini hanya mengembalikan respons sukses pertama dan membatalkan permintaan lainnya
Rencana Ke Depan dan Status Pengembangan
Io.Evented masih berada pada tahap eksperimental, dan belum mendukung sebagian OS
- Implementasi
Io yang kompatibel dengan WebAssembly sedang direncanakan dan memerlukan pengembangan fitur terkait
- Ada 24 item pekerjaan lanjutan terkait
Io, dan sebagian besar masih belum selesai
- Zig masih belum mencapai versi 1.0, dan I/O asinkron serta pembuatan kode native adalah tugas besar yang masih tersisa
- Dengan desain ini, diharapkan frekuensi penulisan ulang kode akibat perubahan antarmuka I/O akan berkurang
Ringkasan Diskusi Komunitas
- Sejumlah komentar menilai pendekatan Zig lebih sederhana dan fleksibel dibanding model async/await Rust
- Rust menjadi lebih kompleks ketika beberapa executor digunakan bersamaan
- Zig melalui antarmuka
Io membuka kemungkinan koeksistensi banyak executor
- Sebagian pihak menyoroti bahwa kodenya bisa menjadi agak lebih bertele-tele
- Namun, desain API yang eksplisit meningkatkan kemampuan kontrol atas keamanan, performa, dan pengujian
- Diskusi teknis juga berlanjut mengenai perbedaan eksekusi asinkron dan berbasis thread, serta pendekatan implementasi stackful vs stackless coroutine
Io di Zig diimplementasikan sebagai perluasan pustaka standar tanpa perlakuan khusus di tingkat bahasa
- Ke depan, fitur stackless coroutine akan ditambahkan
Kesimpulan
- Model asinkron baru Zig bertujuan menyeimbangkan kesederhanaan bahasa dan I/O berperforma tinggi
- Dengan menyelesaikan masalah function coloring, menyatukan kode sinkron dan asinkron, serta menyediakan struktur kontrol yang eksplisit, ini dinilai sebagai langkah kunci menuju stabilisasi Zig 1.0
Belum ada komentar.