Pasukan pembangunan Zig telah memperkenalkan reka bentuk semula yang besar untuk sistem async I/O mereka, mendakwa telah berjaya mengalahkan sepenuhnya function coloring - satu dakwaan kontroversi yang telah mencetuskan perbincangan hangat dalam komuniti pengaturcaraan. Pendekatan baharu ini memperkenalkan antara muka Io yang bersatu yang bertujuan untuk menyelesaikan masalah lama mengenai keviralan fungsi async sambil menyokong pelbagai model pelaksanaan.
Kontroversi Function Coloring
Dakwaan berani pasukan Zig telah menarik tentangan ketara daripada pembangun yang berhujah bahawa masalah asas masih belum diselesaikan. Pengkritik menunjukkan bahawa walaupun Zig telah menghapuskan kata kunci async/await yang eksplisit, fungsi kini dibahagikan kepada yang memerlukan parameter Io dan yang tidak - pada asasnya mewujudkan bentuk coloring yang baharu.
Seorang pembangun menyatakan bahawa lima peraturan daripada catatan blog terkenal What Color is Your Function? masih sebahagian besarnya terpakai pada sistem baharu Zig . Fungsi yang melakukan operasi I/O masih mesti dipanggil secara berbeza, hanya boleh dipanggil daripada fungsi lain yang berkemampuan I/O, dan memerlukan konteks tambahan untuk berfungsi dengan betul. Perbezaan utama ialah konteks ini kini dihantar sebagai parameter eksplisit dan bukannya dibenamkan ke dalam sintaks bahasa.
Walau bagaimanapun, penyokong berhujah bahawa pendekatan ini menawarkan kelebihan tulen berbanding sistem async tradisional. Tidak seperti bahasa di mana fungsi async dikunci secara kekal ke dalam model pelaksanaan tertentu, antara muka Io Zig membenarkan kod yang sama berfungsi dengan blocking I/O, thread pool, green thread, atau stackless coroutine bergantung pada pelaksanaan yang dipilih pada masa runtime.
Pelbagai Model Pelaksanaan Di Bawah Satu Antara Muka
Reka bentuk baharu menyokong beberapa pelaksanaan I/O yang berbeza, setiap satu dengan pertukaran yang berbeza. Pelaksanaan blocking yang paling mudah memetakan terus kepada panggilan sistem tradisional dengan overhed minimum. Pelaksanaan thread pool menggunakan operasi blocking merentasi pelbagai thread OS untuk paralelisme. Green thread memanfaatkan API sistem seperti io_uring pada Linux , walaupun pendekatan ini memerlukan keupayaan stack swapping yang tidak akan berfungsi pada platform seperti WebAssembly .
Pelaksanaan yang paling bercita-cita tinggi melibatkan stackless coroutine yang mengubah badan fungsi kepada mesin keadaan. Pendekatan ini menjanjikan keserasian dengan WebAssembly dan persekitaran terkekang lain, tetapi ia bergantung pada pengoptimuman kompiler yang belum dilaksanakan sepenuhnya.
Pilihan Pelaksanaan I/O Zig:
- I/O Penyekat: Pemetaan terus kepada panggilan sistem dengan overhed yang minimum
- Kumpulan Thread: Operasi penyekat yang dimultipleks merentasi thread OS
- Green Threads: Menggunakan
io_uring
( Linux ) dengan pertukaran stack, tidak serasi dengan WebAssembly - Stackless Coroutines: Transformasi mesin keadaan, serasi dengan WebAssembly (dirancang)
Kebimbangan Prestasi dan Pengoptimuman
Penggunaan polimorfisme runtime melalui panggilan fungsi maya telah menimbulkan keraguan dalam kalangan pembangun yang mementingkan prestasi. Ada yang mempersoalkan sama ada bahasa sistem patut mengenakan overhed ini pada operasi I/O asas, walaupun kosnya biasanya diabaikan berbanding dengan latensi I/O sebenar.
Pembangun Zig membalas bahawa model unit kompilasi tunggal mereka membolehkan devirtualization yang dijamin apabila hanya satu pelaksanaan Io digunakan sepanjang program. Pengoptimuman ini menghapuskan overhed panggilan maya dalam kebanyakan senario praktikal sambil mengekalkan fleksibiliti reka bentuk antara muka.
Komuniti kekal berpecah mengenai sama ada green thread mewakili langkah ke belakang, memandangkan bahasa lain seperti Rust mengeluarkan ciri serupa kerana kebimbangan prestasi. Keputusan pasukan Zig untuk menyokong pelbagai model secara serentak nampaknya merupakan lindung nilai terhadap mana-mana pendekatan tunggal yang terbukti tidak mencukupi.
Implikasi Praktikal untuk Pembangun
Walaupun terdapat perdebatan teori, ramai pembangun menghargai faedah praktikal kebolehgunaan semula kod yang dimungkinkan oleh sistem baharu. Perpustakaan yang ditulis terhadap antara muka Io boleh berfungsi dengan lancar dengan mana-mana model pelaksanaan, menghapuskan keperluan untuk mengekalkan versi sync dan async yang berasingan bagi fungsi yang sama.
Penghantaran parameter eksplisit, walaupun menambah sedikit overhed sintaktik, memberikan keterlihatan yang jelas ke dalam bahagian mana kod yang melakukan operasi I/O. Ketelusan ini sejajar dengan falsafah Zig untuk menjadikan tingkah laku sistem eksplisit dan bukannya menyembunyikannya di sebalik abstraksi bahasa.
Semasa Zig terus menuju ke arah keluaran 1.0, reka bentuk semula ini mewakili pertaruhan penting pada pendekatan bersatu terhadap I/O dan konkurensi. Sama ada ia benar-benar menyelesaikan function coloring atau hanya membungkus semula masalah dalam bentuk yang lebih boleh diterima masih belum dapat dipastikan kerana pembangun memperoleh pengalaman langsung dengan sistem baharu.
Rujukan: Zig's New Async I/O