- Zig dili, libc işlevlerini doğrudan Zig standart kütüphanesinde uygulama yönünde ilerliyor ve mevcut C kaynak kodunu kademeli olarak kaldırıyor
- Şu ana kadar yaklaşık 250 C kaynak dosyası silindi ve 2032 dosya kaldı
- Bu geçiş; derleme hızında artış, kurulum boyutunda azalma ve statik bağlama sırasında ikili dosya boyutunda küçülme gibi etkiler sağlıyor
- Son iyileştirmelerle birlikte zig libc, ayrı bir statik arşiv yerine Zig Compilation Unit (ZCU) içinde diğer kodlarla birlikte optimize ediliyor; böylece yinelenen kod kaldırma ve LTO düzeyinde optimizasyon mümkün oluyor
- Zig, kendi statik libc sağlayıcısına dönüşürken, ilgili sorunlar oluştuğunda hata raporlarının doğrudan Zig projesine gönderilmesi gerekiyor
Zig libc projesine genel bakış
- Birden fazla katkıcı, zig libc alt projesine katılarak mevcut C tabanlı libc uygulamasını Zig standart kütüphanesi sarmalayıcılarıyla değiştiriyor
- Amaç, yinelenen C kodunu kaldırmak ve
memcpy, atan2 gibi basit eşleme işlevlerini ya da strnlen gibi genel işlevleri sarmalayıcı biçiminde sunmak
- Örneğin
strnlen işlevi, Zig'in std.mem.findScalar fonksiyonu kullanılarak uygulanıyor
- Şu ana kadar yaklaşık 250 C kaynak dosyası silindi, 2032 dosya kaldı
Performans ve yapısal iyileştirmeler
- Her işlev Zig'e taşındıkça harici proje ve C dili bağımlılıkları azalıyor
- Bunun sonucu olarak derleme hızı artıyor, kurulum boyutu sadeleşip küçülüyor ve statik bağlı kullanıcı uygulamalarının ikili dosya boyutu azalıyor
- Yakın tarihli değişikliklerle zig libc, Zig Compilation Unit (ZCU) içinde diğer Zig kodlarıyla birlikte derleniyor
- Ayrı bir statik arşive bağlanmak yerine derleyici ve bağlayıcının birleşik yapısından yararlanılıyor
- Bu sayede yinelenen kod kaldırma ve işlevler arası optimizasyon mümkün oluyor
- Bu yaklaşım link time optimization (LTO) ile benzerlik taşısa da, bağlayıcı aşamasında değil frontend aşamasında gerçekleştiriliyor
Gelecekte genişleme olasılığı
- Son dönemdeki std.Io değişiklikleriyle birleştirildiğinde, libc'nin I/O davranışının kullanıcı tarafından denetlenebilmesi mümkün olabilir
- Örnek:
read, write çağrılarını io_uring olay döngüsüne entegre etmek
- Kaynak sızıntısı tespiti özelliğini üçüncü taraf C kodlarına da uygulamak mümkün olabilir
- Ancak bunlar şu anda yalnızca denenmemiş fikirler aşamasında
Test ve kalite güvencesi
- Szabolcs Nagy'nin libc-test projesi, matematik işlevlerinde gerilemelerin önlenmesine büyük katkı sağlıyor
- Bu test seti, Zig libc'nin doğruluğunu doğrulamak için kullanılıyor
Kullanıcılar için not
- Zig, musl, mingw-w64, wasi-libc işlevlerini kendisinin sağladığı bir aşamaya geçiyor
- İlgili sorunlar ortaya çıktığında hata raporlarının doğrudan Zig projesine gönderilmesi gerekiyor
- Bunun amacı, bağımsız libc projelerinin bakımcılarına yanlışlıkla konu açılmasını önlemek
Kapanış
- Yazının son cümlesi “Abolish ICE” ifadesiyle bitiyor (ek açıklama yok)
1 yorum
Hacker News görüşleri
250 C dosyası silindi ve şimdi 2032 tane kaldı
Zig'in libc'yi içeriden dışarıya doğru ikame etme sürecini izlemek, uzun vadede oldukça heyecan verici bir proje
Birçok dil C'nin yerini alacağını iddia ediyor, ama C ABI ve build sistemini doğal biçimde entegre eden neredeyse tek dil Zig oldu
translate-cözelliği de şaşırtıcı derecede iyi çalışıyorC++ gibi %99 uyumluluğu korumaya çalışmak yerine, C'nin sadeliğini koruyup dilin tuzaklarından kaçınma tercihini daha akıllıca buluyorum
Bunun uzun vadede Zig'in OpenBSD üzerinde çalışmayacağı anlamına gelip gelmediğini merak ediyorum
OpenBSD doğrudan syscall kullanımını engelleyip yalnızca libc üzerinden çağrı yapılmasını zorunlu kılıyor
İlgili olarak şu başlığa bakılabilir
-dynamic -lcseçeneğini verirseniz hedef sistemin libc fonksiyonları sağlanırmacOS gibi yalnızca dinamik libc destekleyen sistemler de var ve bildiğim kadarıyla OpenBSD statik libc'yi de destekliyor
Zig projesinin C kütüphanelerini linkleme biçimi açısından bu çok ilginç bir değişiklik
Ama MinGW kullanan Windows için C programlarını Zig ile çapraz derlerken, hâlâ MinGW'nin libc'sini statik olarak linkleyip linkleyemeyeceğini merak ediyorum
-target x86_64-windows-gnu -lcbelirtirseniz bazı libc fonksiyonlarını Zig, bazılarını ise vendored mingw-w64 sağlarAyrı bir mingw-w64 kurulumu olmadan Zig her şeyi sağlar
İsterseniz
--libc libc.txtile harici bir libc'yi doğrudan da belirtebilirsinizHarika bir fikir ama port edilmiş kod için glibc veya musl'daki CVE açıklarını takip etmeye devam etmek gerekip gerekmediği konusunda endişeliyim
Matematik gibi paylaşılan kod yollarında ise potansiyel hatalar hatta azalıyor
“libc sınırının ötesinde LTO'yu etkinleştirmeye benziyor ama bu, linker yerine frontend'de düzgün şekilde yapılıyor” şeklinde bir açıklama vardı
Bunun neden linker aşamasında çok geç kaldığını, Zig'in LLVM IR düzeyindeki bir linker'dan daha fazla optimizasyon yapıp yapamayacağını merak ediyorum
Çünkü optimize edilmiş statik kütüphanelerde link zamanı bu tür optimizasyonları yapmak zor oluyor
Son std.Io değişiklikleriyle birleşince, libc'nin I/O davranışını kullanıcının doğrudan kontrol edebilmesi ilginç
Örneğin tüm read/write çağrılarını io_uring event loop içine dahil etmek gibi
Ben şahsen kqueue tarafıyla daha çok ilgileniyorum ama bu alıntının orası için de geçerli olduğunu düşünüyorum
libc içinde korkutucu pek çok kısım var ama bu gerçekten ilginç bir proje
Mesela "memfrob" ya da "strfry" gibi şeyler; tabii şaka bir yana, bunlar sadece glibc'de var :)
Rust'ta da böyle bir şey olup olmadığını merak ediyorum
Zig vs Rust tartışması çıkarmaya çalışmıyorum, sadece Rust projelerinde de daha bağımsız bir ortam kurmak istiyorum
Zig'in 1.0 sürümüne ne zaman ulaşacağını bilen var mı diye merak ediyorum
Dille çok ilgileniyorum ama hâlâ çok değiştiği için önemli projelerde kullanmakta tereddüt ediyorum
Yine de Bun, Ghostty, Tigerbeetle gibi büyük production projeleri bunu gayet iyi takip ediyor
Zig'in semantiği basit olduğu için, sürüm yükseltirken çoğunlukla sadece derleyiciyi güncellemek ve birkaç mekanik düzeltme yapmak yetiyor
Beni durduran tek şey ekip arkadaşlarımın bunu benimsemeye ne kadar istekli olduğu; bu yüzden şimdilik tek başıma yapabileceğim projelerle ilerliyorum
Bu arada şu video ilginizi çekebilir)