- Zig derleyicisindeki tip çözümleme (type resolution) mantığı baştan sona yeniden tasarlandı; iç yapı sadeleşti ve kullanıcıya da görünür iyileştirmeler sağlandı
- Yeni tasarım, tip alanı analizini tembel (lazy) biçimde ele alarak, başlatılmamış tiplerin ayrıntılı yapısını gereksiz yere incelemiyor
- Bağımlılık döngüsü (dependency loop) hata mesajları daha somut hale getirildi; böylece döngünün nedeni daha net anlaşılabiliyor
- Artımlı derleme (incremental compilation) özelliğindeki aşırı analiz sorunu ve çok sayıda hata giderildi; bu da derleme hızını önemli ölçüde artırdı
- Bu değişiklik, onlarca hata düzeltmesi ve küçük dil iyileştirmesi içererek Zig derleyicisinin performansını ve geliştirme deneyimini genel olarak güçlendiriyor
Tip çözümleme mantığının yeniden tasarımı
- Yaklaşık 30 bin satırlık bir PR birleştirildi ve bununla Zig derleyicisinin tip çözümleme mantığı daha mantıklı ve sezgisel bir yapıyla yeniden yazıldı
- Bu süreçte derleyicinin iç yapısı düzenlendi ve kullanıcılar da bundan doğrudan fayda sağladı
- Derleyici artık tip alanı analizini tembel değerlendirme ile yapıyor; bu sayede başlatılmamış tiplerin ayrıntılı yapısını gereksiz yere taramıyor
- Örnek kodda,
@compileError alanı içeren bir struct yalnızca namespace olarak kullanıldığında, önceden derleme hatası oluşurken artık sorunsuz derleniyor
- Bu,
std.Io.Writer gibi namespace tipi kullanımlarında gereksiz kod bağımlılıklarını önlüyor
Bağımlılık döngüsü hata mesajlarında iyileştirme
- Önceden bağımlılık döngüsü hata mesajları belirsizdi; artık döngünün nedeni ve konumu açık biçimde gösteriliyor
- Örnek kodda
Foo ve Bar struct'ları birbirine referans verdiğinde, hata mesajı her tipin bağımlılık konumunu ayrıntılı biçimde işaret ediyor
- Mesajda döngü uzunluğu, her alan bildiriminin konumu ve hizalama sorgusunun konumu gibi bilgiler yer alıyor
- Karmaşık döngülerde bile yeterli bilgi sunularak sorunun kaynağı kolayca anlaşılabiliyor
Artımlı derleme performansında artış
- Bu değişiklikle birlikte artımlı derleme özelliğindeki çok sayıda hata düzeltildi
- Özellikle “aşırı analiz (over-analysis)” sorunu çözülerek yalnızca değişen bölümlerin yeniden derlenmesi için optimizasyon yapıldı
- Sonuç olarak birçok durumda derleme hızı önemli ölçüde arttı
- Geliştiriciler, Zig 0.15.1 ve üzeri sürümlerde artımlı derlemeyi etkinleştirerek iyileştirilmiş geliştirme deneyimini yaşayabilir
Diğer iyileştirmeler
- Bu PR, onlarca hata düzeltmesi, küçük dil değişikliği ve derleyici performansı iyileştirmesi içeriyor
- Bunların çoğu ayrıntılı ya da özel durumlarla ilgili
- Tüm değişikliklerin listesi Codeberg'deki PR #31403 sayfasında görülebilir
- Yeni bir hata bulunursa issue bildirimi yapılması öneriliyor
Değişikliğin önemi
- Tip çözümleme mantığının sadeleştirilmesi ve artımlı derleme optimizasyonu sayesinde Zig derleyicisinin kararlılığı ve verimliliği güçlendi
- Geliştiriciler daha hızlı ve daha net geri bildirim alırken, büyük kod tabanlarında da üretkenlik artışı bekleyebilir
1 yorum
Hacker News yorumları
Bu devlog’un yazarı benim
Dil değişikliklerinin yol açtığı uyumluluk kırılmaları konusundaki kaygıları anlıyorum, ancak bu derleyici değişikliğinin büyük çaplı bir etki yaratacak düzeyde olmadığını belirtmek isterim
Örneğin ZLS’yi yeni branch ile derlerken yalnızca
.{}ifadesini.emptyolarak değiştirmek gibi bir düzeltme gerekti. Bu dastd.ArrayList’in varsayılan değerinin kaldırılmasından kaynaklanıyordu ve zaten 1 yıldır deprecated durumdaydıAyrıca Awebo projesinde de tüm bağımlılık ağacında düzeltilmesi gereken yalnızca üç şey vardı —
.emptydeğişikliği,comptimeeklenmesi,orelse @alignOf(T)eklenmesiBu tür düzeltmeler, Zig geliştiricilerinin çoğunun refleks olarak yapacağı kadar basit değişiklikler
Bu PR’ın özü kırılma değil, bug düzeltmeleri ve artımlı derleme iyileştirmeleri
PR’ın kalitesi ve planlılığı çok yüksek diye düşünüyorum ve yazarın emeğini küçümsemek gibi bir niyetim kesinlikle yoktu
Yalnızca bundan sonra daha fazla dipnot düşüp görüşlerimi daha dikkatli ifade etmem gerektiği dersini çıkardım
lib/std/multi_array_list.zigdosyasına eklenen yorumu görünce aklıma bir soru takıldı@alignOf(T)ifadesiniMultiArrayList(T)tanımında kullanınca neden döngüsel bağımlılık oluştuğunu anlayamıyorumT,MultiArrayList’in kendisi olsa bile tamamen ayrı bir monomorfik tip değil mi? Sanırım bir şeyi gözden kaçırıyorumİlgili kod: bağlantı
Zig’i production ortamında kullananların deneyimlerini merak ediyorum
Dil sık değişiyor; güncelleme döngüsü, yeniden yazım döngüsü nasıl işliyor, bağımlı paketler dil sürümünün gerisinde kalıyor mu, bunu da bilmek istiyorum
Bun’ın Zig’i iyi kullandığını biliyorum ama başka örnekler de duymak isterim
Son 1–2 yılda dil ve standart kütüphanedeki değişiklikler büyük sorunlar olmadan ilerledi
Eskiden yükseltmeler zahmetliydi ama şimdi daha çok “ufak bir rahatsızlık” gibi hissettiriyor
Zig kullanma deneyimi sorulursa, bu konu artık neredeyse anılmayacak kadar istikrarlı
Bu tür büyük projeler yükseltmeleri etiketlenmiş sürümler üzerinden yapıyor ve göçü genelde birkaç gün ile birkaç hafta içinde tamamlıyor
Bağımlılık da neredeyse hiç olmadığı için yükseltme yükü büyük olmuyor
Yine de bazen küçük bir yazım hatası SIGBUS derleyici çökmesine yol açabiliyor, bu da debug etmeyi zorlaştırıyor
.zig-cache173GB’a kadar büyüyüp ARM VPS üzerinde sorun çıkarabiliyorlightpandayı 0.14’ten 0.15’e geçirirken sorun yaşamadım. 0.16 da muhtemelen büyük bir problem yaratmazAma bir kütüphane geliştiricisi olarak 0.16’daki hızlı değişim temposuna ayak uydurmak zor
Şu anda yalnızca “dev” branch üzerinde deneysel olarak uyum sağlıyorum
Node.js/TypeScript modüllerini Zig ile yeniden yazdım; sonuç 2 kat hız ve %70 daha az bellek kullanımı oldu
Zig’in
sqlite/JSONserileştirme desteği çok güçlüydü, bu da büyük avantaj sağladıDezavantajı ise closure veya vtable sözdiziminin olmaması nedeniyle kod katmanlarını ayırmanın zor olması
Arcsve bumper allocator kullanarak bellek güvenliğini sağladım; DebugSafe modunda çalıştırmaya devam etmeyi planlıyorumReleaseFast’e geçince %25 hız artışı gördüm ama güvenliği kaybedecek kadar büyük bir kazanç değil
Kod değiştirmek gerekse bile uzun vadede doğru yaklaşım bu
Zig ekibinin ortaya koyduğu işten etkilendim
Zig ile yazılmış ghostty terminalini sık kullanıyorum ve oldukça stabil
Ama kişisel olarak Rust’ı tercih ediyorum
Rust “kapalı dünya” modeli, Zig ise “açık dünya” modeli benimsiyor
Rust’ta trait’lerin açıkça uygulanması gerekirken Zig’de tipin şekli (shape) uyuyorsa çalışıyor
Bu sayede Zig çok güçlü bir metaprogramlama sunuyor ama tip çıkarımı belirsizleştiği için otomatik tamamlama, dokümantasyon ve LSP desteği zorlaşıyor
Anlatımdan Go arayüzlerine benzer bir şey gibi geliyor ama bildiğim kadarıyla Zig’de buna doğrudan karşılık gelen bir kavram yok
kernel32’denNtdll’e geçiş ilginçtiBu, Linux kullanıcı alanı API’sine de uygulanabilecek bir fikir
Özellikle çekirdek-kullanıcı sınırında hata işleme biçimi benzer
Ancak Linux’ta libc ile çekirdek sıkı biçimde iç içe olduğundan
errnokullanımı zorunluWindows’ta da bu örüntünün neden ortaya çıktığını merak ediyorum
errnoveGetLastError()örüntüsü thread öncesi dönemin kalıntısıEskiden işbirlikçi zamanlama vardı ve global değişkenler güvenliydi; ama çok çekirdekli sistemler ve thread’ler ortaya çıkınca bu tehlikeli hale geldi
Bunun alternatifi olarak thread local yapılar geldi
Tipleri namespace gibi kullanmak yerine, dile açık namespace eklemek daha iyi olmaz mı diye düşünüyorum
Bir özellik birden çok yerde fayda sağlayıp optimize olabiliyorsa, onu ancak o zaman eklemeyi tercih ediyor
Zig’de
@importbir dosyayı struct’a dönüştürüyor ve namespace’ler de sadece iç içe struct olarak ifade ediliyorYani namespace aslında başka bir import türünden ibaret
(Henüz yeterince kahve içmedim, o yüzden doğruluğu garanti edemem)
Dil değişikliği tartışmalarında sık gözden kaçan bir nokta var — bu da ekosistem etkisi
Dil sık sık kırılıyorsa yalnızca uygulamalar değil, kütüphaneler, araçlar ve öğreticiler de sürekli buna ayak uydurmak zorunda kalıyor
Sonuçta ekosistem, “bir kez yapılıp bırakılan” kütüphanelerden çok aktif biçimde sürdürülen projeler etrafında şekillenmeye başlıyor
Bu, dil tasarımının erken aşamalarında makul bir takas olabilir ama uzun vadede ekosistemin büyümesini etkiler
Diğer yeni diller bu değişim yorgunluğunu azaltmak için ciddi çaba harcıyor
Zig’in yaklaşımının nasıl sonuç vereceğini izlemek ilginç olacak
Blender API’yi sık sık kırıyor ama düzeltmelerin çoğu küçük oluyor
Yine de birilerinin bunları düzeltmesi gerekiyor ve bakım kesilirse kullanıcıların kendisinin patch atması gerekebiliyor
Ücretli eklentilerin sürdürülme ihtimali daha yüksek ama bu da garanti değil
Bakımı yapılmayan kütüphaneler zaten kötü kod demektir
Zig’i eleştirmek yerine başka dilleri (C3 vb.) pazarlamayı bırakın
Zig’in PR’ında geçen “Chromium, boringssl, Firefox, Rust advapi32.dll içindeki SystemFunction036’yı çağırıyor” ifadesi doğru değil
Bunlar zaten ProcessPrng kullanıyor ve Windows 10 sonrasında bu çağrı başarısız olmuyor
İlgili dayanak Microsoft whitepaper içinde yer alıyor
RNG isteğinin asla başarısız olmaması için tasarlanmış; başarısız olursa süreç doğrudan sonlandırılıyor
Yani yüksek kaliteli rastgelelik garantisi için hata kodu döndürülmüyor
Zig’in dil semantiği yüzeyde basit görünüyor ama etkileşimleri incelikli
Bu yüzden zamanla C++ template kuralları gibi karmaşık köşe durumları üretmesinden endişe ediyorum
30 bin satırlık bir PR muazzam bir başarı
Ama dil semantiğini değiştirmek son derece önemli bir iş, o yüzden şaşırdım
Zig’in henüz 1.0 öncesinde olduğunu ve bu yüzden hızlı değiştiğini anlıyorum ama “bu branch’te semantiği değiştirdik” gibi gündelik bir ifade biraz afallatıcı geldi
Bu çapta değişiklikler Zig’e özgü bir kültür mü, yoksa ben mi çağın gerisinde kaldım, merak ediyorum
“modern Zig” ifadesi de dilin hızlı değişim temposu nedeniyle güldürdü
devlog bir pazarlama yazısı değil, daha çok içeriden kişilere yönelik bir kayıt niteliğinde; ayrıca Zig henüz 1.0 değil
PR’da yeterli bağlam ve gerekçe var
Zig’i seçtiğiniz anda belli ölçüde dil değişikliği riskini kabul etmiş oluyorsunuz
Hatta şu aşamada temizce düzeltmek uzun vadede daha kazançlı
(C’deki bit operatörü önceliği gibi düzeltilemeyen mirasları düşünün)
mlugg, Zig’in çekirdek katkıcılarından biri ve Zig Foundation üyesiBu değişiklik döngüsel bağımlılıkları çözmek ve tip sistemini toparlamak için yapılıyor
İlgili öneriler #3257 ve #15909 başlıklarında açıkça yer alıyor
Bu değişiklikle Zig’in tip çözümlemesi DAG (yönlü çevrimsiz grafik) yapısı halinde düzenleniyor, böylece derleyici kararlılığı ciddi biçimde artıyor
Zig, BDFN (Benevolent Dictator For Now) modeliyle yönetiliyor ve nihai karar yetkisi Andrew Kelley’de
Ancak ekip kâr amacı gütmeyen bir yapı içinde çalışıyor ve kullanıcı güveni ile dil kalitesini en üstte tutuyor
Kişisel olarak Matthew ile birlikte çalışmak benim için büyük bir onur
Biçimsel olarak kusursuz görünse de pratikte kaotik bir dil olan C’yi hatırlatıyor bana