Rilis Zig 0.12.0 yang akan datang memperkenalkan pendekatan baru untuk asynchronous I/O yang menimbulkan diskusi signifikan di komunitas pemrograman. Tidak seperti implementasi async/await tradisional di bahasa lain, desain Zig memperlakukan operasi async sebagai antarmuka yang dapat dipasang (pluggable) alih-alih konstruksi tingkat bahasa, menciptakan baik kegembiraan maupun kekhawatiran di kalangan pengembang mengenai arah dan filosofi bahasa.
Pendekatan Berbeda untuk Pemrograman Asinkron
Inovasi inti dalam sistem async I/O baru Zig terletak pada pemisahan concern antara mengekspresikan asinkronitas dan mengimplementasikannya. Daripada memberi warna fungsi dengan kata kunci async yang mengubahnya menjadi state machine, Zig memperkenalkan parameter antarmuka io yang dapat diteruskan ke fungsi. Hal ini memungkinkan berbagai implementasi I/O - dari pendekatan threaded sederhana hingga sistem coroutine yang canggih - untuk bekerja dengan kode aplikasi yang sama. Desain ini menekankan keamanan pembatalan dan manajemen sumber daya melalui primitif seperti nocancel yang secara otomatis menangani pembersihan ketika operasi gagal atau dibatalkan.
Salah seorang komentator mencatat perbedaan mendasar dari bahasa lain: Di Zig, kompilator dulu mendukung coroutine tetapi ini dihapus. Dalam desain baru, async dan await hanyalah fungsi. Dalam implementasi threaded yang digunakan dalam demo, await hanya memblokir thread sampai operasi selesai.
Primitif Async I/O Utama di Zig:
io.async: Menjalankan fungsi di latar belakang, berjalan segera jika tidak ada konkurensi yang tersediaawait: Memblokir hingga operasi async selesainocancel: Seperti await tetapi juga meminta pembatalan- Baik
awaitmaupunnocancelbersifat idempoten satu sama lain
Kekhawatiran Komunitas Tentang Kompleksitas dan Desain
Komunitas pemrograman menunjukkan reaksi beragam terhadap arah baru ini. Beberapa pengembang khawatir Zig sedang menjauh dari filosofi aslinya sebagai bahasa sederhana dan tingkat rendah. Pengenalan yang tampaknya merupakan sistem efek untuk I/O dan alokasi telah memunculkan pertanyaan tentang apakah kompleksitas ini selaras dengan nilai inti Zig. Para kritikus menunjukan bahwa antarmuka IO menyerupai pemrograman berorientasi objek tetapi mungkin melanggar prinsip seperti prinsip substitusi Liskov, menciptakan interaksi yang tidak terduga ketika objek IO dibagikan melintasi batas pustaka.
Saya merasa arah Zig membingungkan. Apakah seharusnya menjadi bahasa yang sederhana atau kompleks? Tingkat rendah atau tingkat tinggi? Fitur ini bagi saya adalah campuran aneh dari fungsionalitas tingkat tinggi dan rendah dan cukup kompleks.
Diskusi ini menyoroti ketegangan dalam desain bahasa: bagaimana menyediakan abstraksi yang kuat sambil mempertahankan kesederhanaan dan prediktabilitas. Beberapa pengembang menghargai bahwa Zig bereksperimen dengan alternatif untuk async/await tradisional, sementara yang lain khawatir tentang kurva pembelajaran dan potensi alur kontrol tersembunyi.
Distribusi Sentimen Komunitas:
- Mendukung inovasi: ~40%
- Khawatir tentang kompleksitas: ~35%
- Netral/mengamati: ~25%
- Kekhawatiran utama: Konsistensi pustaka standar, alur kontrol tersembunyi, keselarasan filosofis
Debat Pustaka Standar dan Evolusi Bahasa
Di luar diskusi async I/O, komentar mengungkapkan debat yang sedang berlangsung tentang filosofi desain pustaka standar Zig. Beberapa anggota komunitas menemukan pustaka standar tidak konsisten, menggambarkannya sebagai kumpulan paket kecil, bukan unit yang koheren. Kurangnya modifier visibilitas dan pemisahan yang jelas antara antarmuka publik dan detail implementasi internal telah membuat frustrasi pengembang yang menginginkan jaminan enkapsulasi yang lebih kuat.
Pada saat yang sama, pengembang lain menghargai kemampuan untuk mengakses detail implementasi internal ketika diperlukan. Seorang komentator berbagi: Sejujurnya bisa mengutak-atik detail implementasi internal adalah bagian favorit saya dalam menggunakan pustaka standar Zig. Ini mencerminkan filosofi Zig untuk memberikan kontrol maksimal kepada programmer, bahkan jika itu berarti menerima lebih banyak tanggung jawab untuk penggunaan yang benar.
Masa Depan Cerita Konkurensi Zig
Ke depannya, cerita async I/O Zig masih berkembang. Implementasi saat ini menggunakan thread, tetapi ada rencana untuk coroutine stackful menggunakan io_uring dan kqueue, serta potensi coroutine stackless. Namun, tantangan teknis yang signifikan masih ada, khususnya seputar perhitungan ukuran stack statis untuk coroutine stackful. Ini akan memerlukan pelarangan atau pelacakan yang cermat terhadap rekursi dan panggilan fungsi dinamis - kendala yang tidak sepele untuk bahasa pemrograman sistem.
Komunitas tampak terbelah mengenai apakah rencana ambisius ini akan terwujud dengan sukses. Beberapa melihat potensi untuk inovasi yang menggemparkan, sementara yang lain khawatir tentang vaporware mengingat kompleksitas masalah yang sedang dipecahkan. Diskusi seputar menghilangkan stack overflow melalui analisis statis sangat ambisius dan dapat memberikan manfaat signifikan untuk sistem embedded jika berhasil diimplementasikan.
Implementasi I/O yang Direncanakan:
- Threaded (implementasi saat ini)
- Stackful coroutines menggunakan io_uring/kqueue
- Stackless coroutines (fase desain)
- Semua implementasi bekerja dengan kode aplikasi yang sama melalui antarmuka io
Kesimpulan
Desain async I/O baru Zig mewakili eksperimen berani dalam desain bahasa yang menantang pendekatan konvensional terhadap konkurensi. Dengan memperlakukan async sebagai antarmuka yang dapat dipasang alih-alih fitur bahasa, Zig bertujuan untuk menghindari masalah pewarnaan fungsi yang melanda bahasa lain sambil memberikan fleksibilitas dalam implementasi. Namun, pendekatan ini datang dengan kompleksitasnya sendiri dan pertanyaan filosofis tentang seperti apa bahasa Zig seharusnya.
Seperti yang disimpulkan dengan tepat oleh seorang komentator, Zig tidak hanya penuh dengan ide-ide hebat, ada seluruh kuburan ide-ide yang dibuang. Proposal async I/O saat ini melanjutkan tradisi evaluasi desain yang ketat ini. Apakah ide khusus ini akan berkembang atau bergabung dengan kuburan itu masih harus dilihat, tetapi diskusi komunitas yang hidup memastikan bahwa evolusi Zig akan terus dipikirkan dengan matang dan disengaja.
Referensi: Zig's New Async I/O (Text Version)
