- Zig standart kütüphanesinin
std.Io.Eventedmodülüne io_uring ve Grand Central Dispatch (GCD) tabanlı uygulamalar yeni entegre edildi - Her iki uygulama da kullanıcı alanı yığın geçişi (fibers, stackful coroutines, green threads) yöntemiyle çalışıyor
- Şu anda deneysel aşamada ve hata işleme iyileştirmesi, logların kaldırılması, performans düşüşü nedenlerinin analizi ve testlerin güçlendirilmesi gibi ek çalışmalar gerekiyor
- Aynı uygulama kodunda yalnızca I/O backend'ini değiştirerek io_uring veya GCD arasında kolayca geçiş yapmak mümkün
- İki uygulama da Zig derleyicisinde çalışıyor ve gelecekte kararlı hale gelirse platforma özgü asenkron I/O için birleşik bir temel haline gelebilir
io_uring ve GCD tabanlı std.Io.Evented uygulaması
-
Zig 0.16.0 sürüm döngüsünün sonunda
std.Io.Eventeden güncel API değişikliklerini yansıtacak şekilde güncellendi- Yeni eklenen uygulamalar io_uring (Linux) ve Grand Central Dispatch (GCD) (macOS)
- Her iki uygulama da kullanıcı alanı yığın geçişi (fibers, stackful coroutines, green threads) tekniğini kullanıyor
-
Her iki uygulama da şu anda deneysel durumda ve kararlı kullanım için geriye çeşitli iyileştirme başlıkları kalıyor
- Hata işleme iyileştirmesi gerekli
- Logların kaldırılması ve performans düşüşü nedenlerinin teşhis edilmesi gerekli (
IoMode.eventedkullanıldığında derleyici performansında düşüş görülüyor) - Bazı henüz uygulanmamış işlevler var ve test kapsamının genişletilmesi gerekiyor
- İşlev bazında azami yığın boyutunu doğrulamak için yerleşik bir işlev eklenmesi gerekiyor (
overcommitdevre dışıyken pratik kullanım sağlamak amacıyla)
I/O uygulamasını değiştirme örneği
-
Aynı uygulama kodunda yalnızca I/O backend'i değiştirilerek çalıştırmak mümkün
- Örnek kodda
std.Io.Threadedyerinestd.Io.Eventedkullanılırsa io_uring tabanlı olarak çalışıyor appişlevi aynı kalıyor ve çıktı sonucu da (Hello, World!) aynı oluyor
- Örnek kodda
-
stracesonuçlarının karşılaştırılmasıyla iki çalışma biçimi arasındaki fark görülebiliyorhello_threadednormal thread tabanlı I/O çağrılarını kullanıyorhello_eventedise io_uring sistem çağrılarını (io_uring_setup,io_uring_entervb.) kullanıyor
Zig derleyicisinde kullanım ve mevcut durum
-
Zig derleyicisinin kendisi de
std.Io.Eventedkullanarak düzgün şekilde çalışıyor- Hem io_uring hem de GCD üzerinde derleyici çalıştırılabiliyor
- Ancak performans düşüşünün nedeni henüz belirlenmiş değil, bu yüzden ek analiz gerekiyor
-
Bu değişiklikle Zig kodu I/O uygulamasını kolayca değiştirebilen bir yapıya daha da yaklaşıyor
- Platforma özgü asenkron I/O modellerini birleşik biçimde ele alabilecek bir temel hazırlanmış oluyor
Gelecekteki çalışmalar
- Kararlı kullanım için performans iyileştirmeleri ve daha güçlü testler gerekiyor
- Yığın boyutu yönetimi özelliği eklenirse, overcommit'in devre dışı olduğu ortamlarda da pratik kullanım mümkün olabilir
- Tamamlandığında Zig'in asenkron I/O soyutlama katmanı daha da güçlenebilir
Sonuç
- Bu güncelleme, Zig'in standart I/O sisteminin genişletilmesi açısından önemli bir ilerleme
- io_uring ve GCD'nin entegre edilmesiyle platformlar arası asenkron işleme tutarlılığı için temel hazırlanıyor
- Gelecekte kararlılık çalışmaları tamamlandığında, Zig'in yüksek performanslı ve esnek I/O modeli uygulama potansiyeli daha da artacak
1 yorum
Hacker News yorumları
Ben bir Zig hayranı değilim ama küçük bir ekibin istikrarlı şekilde ilerlemesini görmek güzel
Tamamlanmış olmaktan çok deney ve kademeli iyileştirmeye önem veren yaklaşımları etkileyici
1.0’ı aceleyle çıkarmak yerine uzun vadeli hedeflere doğru ilerlemek daha önemli diye düşünüyorum
Tek bir kişi etrafında şekillenen bir proje için şaşırtıcı bir başarı ve emek veren insanların hak ettiği takdiri görmesi gerek
Şimdiye kadarki deneyimlerim içinde en eğlenceli ve en üretken olanıydı
Rust’ın katı bellek yönetimindense Zig’in sadeliği bana çok daha uygun geliyor
Hayat kısa; ben sadece hızlı ve iyi düzenlenmiş yazılım yapmak istiyorum
Zig hakkında her yazıda çok eleştiri oluyor ama insanların neden bu kadar takıldığını anlamıyorum
Andrew ve ekibinin inandıkları şeyi gerçeğe dönüştürmeye çalışan mühendislik ruhu bana daha çok ilham veriyor
Zig’in ana akım olup olmayacağını dert etmeye gerek yok; bir sorunu çözmeye yardım ediyorsa bu yeterli
Dillere kimlikmiş gibi yaklaşmaya gerek yok
Diller ve kütüphaneler sonuçta “satılabilir beceriler” olduğu için insanlar kullandıkları araçların piyasadaki değerini düşünür
Üstelik karar vericilerin mühendisleri kolayca değiştirilebilir varlıklar gibi görme eğilimi de sorun
Lisp, Ruby, Rust gibi dillerde de tekrar tekrar görüldü ve kimlik kavgası sektörün kronik sorunlarından biri
Güvenlik ve mimari desteği gibi uzun vadeli bakım gerekirken geliştiriciler bunun maliyetini göz ardı ediyor
Zig henüz kararlı olmadığı için paketler yalnızca belirli sürümlerde derleniyor
Başka dillerdeki iyileştirmelerle çözülebilecek sorunları neden ille de yeni bir dille çözmek gerektiğinden emin değilim
Zig 1.0 olana kadar takip etmenin çok anlamlı olmadığını düşünüyorum
Mevcut yapı muhtemelen birkaç kez daha baştan yazılacak
Ben de bir dönem ilgilenmiştim ama hayatım boyunca 1.0’ı görebilecek miyim emin değilim
Dosya G/Ç gibi temel işlevler neredeyse aynı kalıyor, sadece ad alanları değişiyor
Ben “canlı bir dil”in daha iyi olduğunu düşünüyorum
1.x sonrasında bile stdlib’i ince tutmak için sürüme göre arayüz yönetim stratejileri olsa iyi olur
Kendi I/O çatımı geliştirirken yetersiz test ve hatalı assembly kodu buldum
Bunu birkaç kez dile getirdim ama düzeltilmedi; bu da güvenimi azalttı
Özellikle bulut ortamlarında performans optimizasyonuyla sunucu maliyetlerini %90’dan fazla azaltabiliyor
Python ya da Node ile bir yere kadar gidilebiliyor; sonunda C, C++, Rust ya da Zig’den birine inmek gerekiyor
Bunlar arasında Zig öğrenmesi kolay, okuması ve test etmesi rahat
Yani zaten üretim düzeyinde kullanılan bir dil
Değişikliklerin çoğu gerçekten dilin iyileşmesi gibi hissettiriyor
Rust’ın
io_uringdesteği hâlâ tamamlanmamışken Zig’in önce bunu uygulamaya çalışması ilginçRust’ta güvenli ve zero-cost soyutlamalar tasarlamak zor
Bu haber aslında hâlâ tamamlanmamış bir uygulama ile ilgili
Örneğin GCD sürümünde ağ desteği yok
Arayüz giderek büyüyor; tamamlanmış bir yapıdan çok mevcut anlık görüntüye benziyor
Ayrıca ileride yapılması gereken 6 ana görev de somut biçimde sıralanmıştı
Yığın belleği optimizasyonuyla ilgili bir issue var
Farklı bloklarda
[500]u8kullanılsa bile stack frame’de yalnızca 500 bayt yer kaplamasını sağlayacak bir özelliğe ihtiyaç varBu özellikle green thread coroutine stack bağlamında önemli
Zig’in sürekli iyileştirme çabasına olumlu bakıyorum
Şu anda
io_uringi gerçekten iyi ele alan bir dil yokZig bunu iyi çözerse büyük bir avantaj elde eder
İstikrardan çok öğrenme ve deneye önem veren yaklaşımın daha değerli olduğunu düşünüyorum
Ben Zig’de
libxevkullanarakio_uringi doğrudan kontrol etmeyi tercih ediyorumC’nin başarısının ana nedenlerinden biri istikrarı ve tutarlı geliştirme kültürüydü
Zig’in freestanding target konusunu ciddiye alması hoşuma gidiyor
0.16 sürümünde kod yeniden kullanılabilirliğinin daha da artmasını bekliyorum
macOS’in iç taraflarına uzun zaman sonra yeniden baktım; GCD’yi korumuş olmaları sevindirici
Bunun paralelleştirme için dengeli bir yaklaşım olduğunu düşünüyorum
Diğer diller tartışmakla oyalanırken Zig doğrudan deniyor ve gerekirse geri alıyor
Gerçek dünyada sınanmış API’lerin en iyi tasarım olduğuna inanıyorum
Eski sürümleri kullanmaya devam edebilirsiniz; en yeni sürüme geçerseniz daha temiz ve daha hızlı araçlar elde edersiniz
C++ kadar karmaşık ama Zig, C düzeyindeki sadeliği koruyor
Carbon ise hâlâ ortada somut bir şey olmayan bir durumda
Jai 11 yıldır kapalı betada; Zig ise zaten birçok gerçek projede kullanılıyor
Python 2→3, Rust async, Go generics, C++ gibi örneklerde gördüğümüz kontrolsüz değişimler daha zararlı olabiliyor