- Zig dili, mevcut asenkron I/O tasarımındaki karmaşıklığı azaltmak amacıyla yeni bir
Io arayüzü tabanlı model benimsiyor
- Bu model, senkron ve asenkron kod ayrımı yapmadan aynı fonksiyon yapısını koruyor ve
Io.Threaded ile Io.Evented olmak üzere iki uygulama sunuyor
Io.Threaded varsayılan olarak senkron çalıştırma yaparken, Io.Evented olay döngüsü tabanlı asenkron çalıştırma gerçekleştirir
- Geliştiriciler
async() ve concurrent() işlevleriyle eşzamanlı yürütmeyi kontrol edebilir ve kodu değiştirmeden performans optimizasyonu yapabilir
- Bu yaklaşım, fonksiyon renklendirme sorununu çözerken, Zig’in sadelik ve kontrol edilebilirliğini koruyarak asenkron performans sağlamayı hedefliyor
Zig'in Asenkron Tasarımındaki Değişim
- Zig, mevcut asenkron tasarımın dilin minimalist felsefesi ile iyi örtüşmediğini görerek yeni bir yaklaşım aradı
- Eski tasarımın diğer özelliklerle entegrasyon seviyesi düşüktü
- Yeni model, senkron/asenkron I/O'yu aynı kod yapısıyla işleyebilir
- Yeni tasarım,
Io jenerik arayüzü etrafında çalışıyor
- Tüm I/O işlevleri bir
Io örneğini parametre olarak alır
Allocator arayüzüne benzer şekilde, bellek tahsisi gibi bir modelle I/O kontrol edilebilir
Io Arayüzünün Yapısı
- Standart kütüphanede iki temel uygulama bulunuyor
Io.Threaded: Varsayılan olarak senkron çalıştırma, gerektiğinde iş parçacığıyla paralel işleme
Io.Evented: Olay döngüsü tabanlı asenkron çalıştırma (io_uring, kqueue gibi)
- Kullanıcılar doğrudan yeni
Io uygulamaları yazabilir, böylece yürütme biçimi üzerinde ayrıntılı kontrol sağlayabilir
Kod Örneği ve Çalışma Şekli
- Örnek
saveFile() işlevi dosya oluşturma, yazma ve kapatma adımlarını gerçekleştirir
Io.Threaded kullanıldığında normal sistem çağrılarıyla çalışır
Io.Evented kullanıldığında asenkron bir arka uçla çalışır
- İki durumda da
writeAll() çağrısı yapılınca işin tamamlandığı garanti edilir
- Aynı kod, senkron ve asenkron ortamların her ikisinde de aynı şekilde çalışır
- Kütüphane yazarı çalıştırma biçimiyle ilgilenmek zorunda kalmaz
Paralel Yürütme ve async() / concurrent()
async() işlevi asenkron çalıştırmayı talep eder ancak Io.Threaded içinde anında da çalıştırılabilir
Io.Evented içinde ise gerçek asenkron çalıştırma ile iki dosya aynı anda kaydedilebilir
concurrent() işlevi gerçek paralel çalıştırmanın gerektiği durumlarda kullanılır
Io.Threaded iş parçacığı havuzunu kullanır
Io.Evented async() ile aynı şekilde davranır
- Yanlış fonksiyon seçimi (
async yerine concurrent) hata olarak kabul edilir ve dil düzeyinde engellenmesi mümkün değildir
Kod Stili ve Dil Bütünleşmesi
- Asenkrona özel bir sözdizimi olmadan normal Zig kod stili korunur
try, defer gibi mevcut kontrol akışı sözdizimleri aynen kullanılır
- Andrew Kelley, bunun “standart bir Zig kodu gibi okunduğunu” belirtiyor
- Örnek olarak asenkron DNS sorgusu gösterildi
getaddrinfo() yerine ilk başarılı yanıt döndürülür ve kalan istekler iptal edilir
Gelecek Planlar ve Geliştirme Durumu
Io.Evented henüz deneysel, bazı işletim sistemlerinde desteklenmiyor
- WebAssembly uyumlu bir
Io uygulaması planlanıyor ve ilgili işlevlerin geliştirilmesi gerekiyor
Io ile ilgili 24 takip görevi var ve çoğu hâlâ tamamlanmamış durumda
- Zig henüz 1.0'a gelmedi; asenkron I/O ve yerel kod üretimi hâlâ ana kalan meselelerdir
- Bu modelle I/O arayüzü değişiklikleri nedeniyle kod yeniden yazma sıklığının azalması bekleniyor
Topluluk Tartışmasının Özeti
- Yorumlarda birçok kişi, Zig’in yaklaşımının Rust’ın async/await modelinden daha basit ve esnek olduğunu değerlendirdi
- Rust’ta farklı executor’ların birlikte kullanımıyla karmaşıklık artabiliyor
- Zig,
Io arayüzüyle çoklu executor’ların bir arada var olmasını mümkün kılıyor
- Bazıları kodun biraz uzun olabileceğini eleştirdi
- Ancak açık API tasarımıyla güvenlik, performans ve test kontrolünün iyileşmesi hedefleniyor
- Asenkron çalıştırma ile iş parçacığı çalıştırmasının farkı, stackful vs stackless coroutine gibi teknik konular da tartışılıyor
- Zig’in
Io uygulaması dil düzeyinde özel bir işleme ihtiyaç duymadan standart kütüphane genişlemesi biçiminde uygulanıyor
- İleride stackless coroutine özelliğinin eklenmesi planlanıyor
Sonuç
- Zig’in yeni asenkron modeli, dil sadeliğini korurken yüksek performanslı I/O hedefler
- Fonksiyon renklendirme sorunu çözümü, senkron/asenkron kod entegrasyonu ve açık kontrol yapılarıyla Zig 1.0 kararlılığı için kritik bir adım olarak görüldü
Henüz yorum yok.