- Zig,
build.zigve build sisteminin ayrı süreçlere ayrıldığı akışa uyum sağlayarak paket yönetimi mantığını derleyici çalıştırılabilir dosyasının dışındaki maker sürecine taşıdı zig build,zig fetch,zig init,zig libcmaker tarafına taşınırken HTTP, TLS, Git, sıkıştırma vebuild.zig.zonişleme kodu kaynak biçiminde dağıtılacak- Bu yapıda paket yönetimi işlevleri derleyiciyi yeniden derlemeden düzeltilebiliyor ve maker
ReleaseSafeile derlendiği için ağ işlemlerinde güvenlik kontrolleri de etkinleşiyor - Asıl amaç build server protocol'ü ortaya çıkararak ZLS'yi engelleyen
--build-runnerdeğişikliği sorununu çözmek; yeni süreç ağacında maker, configurer'ın ebeveyni olarak kalıp yapılandırmanın yeniden çalıştırılmasını daha kararlı biçimde yönetebiliyor - Kullanıcıya etkisi büyük değil ancak Zig çalıştırılabilir dosyası 14.1MiB'den 13.5MiB'e inerek %4 küçülüyor ve
--maker-optile--zig-lib-dirsırasıylaZIG_DEBUG_MAKERveZIG_LIB_DIRortam değişkenleriyle değiştiriliyor
Paket yönetimi mantığının taşınması
- Zig, kullanıcı
build.zigbetikleri ile build sisteminin kendisi ayrı süreçlere ayrıldıktan sonra paket yönetimi mantığını da build sistemi tarafında konumlandıran bir yapıya geçti - maker sürecine taşınan alt komutlar şunlar:
zig buildzig fetchzig initzig libc
Derleyici çalıştırılabilir dosyasından çıkarılan kod
- Daha önce derleyici çalıştırılabilir dosyasının içinde bulunan büyük kod bölümleri artık kaynak biçiminde dağıtılıyor
- Paket getirme mantığı
- HTTP istemcisi ve ağ iletişimi
- TLS ve ilgili kriptografi
- Git protokolü
xz,gzip,zstd,flate,zipbuild.zig.zondosyasının ayrıştırılması, doğrulanması ve diğer işlemleri
- Bu işlevler, derleyiciyi yeniden derlemeye gerek kalmadan yamalanabildiği için kullanıcılar ve katkıda bulunanlar daha kolay deney yapabiliyor
- maker çalıştırılabilir dosyası
ReleaseSafemodunda derlendiğinden, paket yönetiminin ağ işlemlerinde güvenlik kontrolleri açık oluyor - Ağ iletişimi ve dosya hash'lemede kullanılan kriptografi kodu, ana makinede kullanılabilen özel CPU komutlarından yararlanabiliyor
Süreç yapısı ve build server
- Başlangıçtaki motivasyon, build server protocol'ü görünür hâle getirerek ZLS'yi engelleyen sorunu çözmekti
- Önceki yapıda
zig build, derleyici ve paket yöneticisini birlikte üstleniyor; onun altında builder ise kullanıcıbuild.zigmantığını ve build sistemi uygulamasını barındırıyordu - maker/configurer ayrımından sonraki yapı şöyleydi:
zig build: derleyici + paket yöneticisiconfigurer: kullanıcıbuild.zigmantığımaker: build sistemi
- Bu yapıda uzun süre çalışan
zig build --watch,build.zigveya ilgili dosyalarda değişiklik algıladığında configurer'ı yeniden çalıştırmak zorundaydı; bunun için maker'ın sonlanıpzig build'e paket yönetimi mantığını tekrar yürütme fırsatı vermesi gerekiyordu - Yeni yapıda
zig buildyalnızca derleyiciyi üstleniyor; onun altında maker build sistemi ile paket yöneticisini yönetiyor ve configurer maker'ın alt süreci oluyor - Yapılandırmanın yeniden çalıştırılması gerektiğinde de maker ebeveyn süreç olarak yaşamaya devam edebiliyor
- Planlanan build server'da ise sunucu kapandıktan sonra istemcinin yeniden bağlanması yerine, istemciye yapılandırma değişikliği bildiren bir yapı mümkün hâle geliyor
Gözlemlenebilir değişiklikler
- Çoğu değişiklik uyumsuzluk yaratmasa da, kullanıcının görebileceği bazı farklar var
- Zig çalıştırılabilir dosyasının ikili boyutu: LLVM'siz
ReleaseSmallölçümünde 14.1MiB'den 13.5MiB'e düşerek %4 küçülme --maker-optbayrağı,ZIG_DEBUG_MAKERortam değişkeniyle değiştirildi--zig-lib-dirbayrağı,ZIG_LIB_DIRortam değişkeniyle değiştirildi
- Zig çalıştırılabilir dosyasının ikili boyutu: LLVM'siz
Zig 0.17.0 öncesinde kalan engelleyici konular
- Bu değişiklik paketinden sonra geriye kalan başlıca engelleyici konular, Zig 0.17.0 etiketi öncesindeki temel işler olarak öne çıkıyor
- Temmuz ayında iki konferans ve sunum hazırlığı bulunduğundan, bu işlerin tamamlanması için gerçekçi hedefin Ağustos başı olması bekleniyor
- ZLS ekibinden Techatrix, build server protocol çalışması için iletişime geçti ve birlikte çalıştı; ayrıca sponsorluk arıyor
1 yorum
Hacker News yorumları
Zig, Go ve Python geliştiricileri bazen yakıt deposundan soğutma sıvısını çıkardıklarını duyuruyor; destekçileri de bunun dil için iyi olduğunu ve performansı ciddi ölçüde artıracağını söyleyerek seviniyor
Ama en başta soğutma sıvısını neden yakıt deposuna koydukları daha çok merak uyandırıyor
Paket yönetimini derleyicinin içine koymak rahattı; ama dil ve araçlar yaygın kullanılmaya başlayınca, birey için avantajlı olan özellik benimsenmenin önünü kesen bir borca dönüşüyor
Pek çok projede geliştiriciler, “doğru yapmak için gereken zor işi” yapmaktan kaçınmak için kolay yolu seçiyor; başkaları da o zor işi yapmak istemediğinden bu yaklaşım teamül haline geliyor
Bir paket yöneticisini derleme sisteminin içinde uygularken derleyicide de bırakmak istiyorsanız, önce derleyici ile derleme sistemi arasına nasıl bir soyutlama koyacağınıza karar vermeniz gerekir
Bu, import sistemini ve dilin temel parçalarını da etkiler; bu kısımların doğru tasarlanması gerekir ve sonradan değiştirmesi de zordur
Başta paket yönetimi ile derleyiciyi sıkı biçimde bağlayıp istenen programcı deneyiminden geriye doğru tasarlamak, sonra uygulamayı değiştirmek kullanıcılar üzerinde daha az etki yaratabilir
Özellikle Python’ın import sisteminin, paket yönetiminin birçok farklı şekilde yapılmasını desteklemek zorunda kaldığı için çok karmaşık ve kusurlu hale geldiğini düşünüyorum
Buna karşılık Go, en baştan paket yönetimi düşünülerek tasarlandığından import ile ilgili sözdizimi nispeten küçük ve temiz. Elbette tüm tasarım kararlarına katılıyorum demek değil
Küçük bir üründe bile bileşenlerin nasıl etkileşeceğini öngörmek zordur ve sürekli düzeltme yapmak gerekir
Şimdi bir kendi kendini barındıran C alternatifi dil yaptığını düşün
Hız artışı ne kadar büyükse o kadar seviniliyor; ama optimizasyonların çoğu zekice teknikler değil, profiler ile “aa, soğutma sıvısının yakıt deposunda olmaması gerekiyordu” noktasını bulma işi
Çoğu performans darboğazı, donanımın ya da problemin kendisinin özsel sınırlarından kaynaklanmaz
Sonucu elde etmek için gereken asgari bir iş miktarı vardır; ama bir uygulamanın yavaş olmasının nedeni neredeyse her zaman bunun üstüne eklenen ıvır zıvırdır
Zig geliştirme süreci gerçekten sağlıklı bir atmosfere sahipmiş gibi geliyor
LLM’leri her gün kullanıyorum ve birçok problem türünde şaşırtıcı derecede iyi olduklarını kabul ediyorum; ama LLM’in yaptığı bir programlama dili istemem
Bir programlama dilindeki her kod satırı, karar ve ödün önemlidir
Sadece havaya göre tasarlanıp kodlanmış bir dil felaket olur
Hiçbir model, beni tersine ikna edecek kod göstermedi. Fable bile önceki en iyi modellerden açıkça daha iyi olsa da durum aynı
Modelin istediği bir şey yoktur, anlamlı bir görüşü yoktur ve bir dilde rahatlığın ve rahatsızlığın ne olduğunu bilmez. Yeterince karmaşık GUI veya CLI arayüzlerinde de durum aynı
Zig gibi bir dil, Zig’i basitçe kopyalamadığı sürece LLM’den çıkamaz; kopyalasa bile daha kötü bir kopya olur
Burada LLM ile kopyalamaktan kastım kaynak ağacını kelimesi kelimesine
cpyapmak değil; LLM’in bir spesifikasyon yazması ve başka bir LLM’in o spesifikasyona göre dili uygulaması gibi bir şeyBir bootloader yaptım ve UEFI üzerinde çalıştım; kişisel olarak C ile yapmaktan çok daha kolaydı
Yine de yeni ve parlak bir şey öğrenmenin eğlencesi olduğu için önyargımın arttığı da doğru
Bu değişikliğin Zig’de
@cImport’u kaldırıp derleme sistemine taşımaya yol açan değişiklik olup olmadığını merak ediyorumTamamen kullanıcı deneyimi meselesi ve derleme sistemi ile derleyiciyi ayırmanın bakımcılar için önemli olduğunu anlıyorum; yine de geliştirme kararlılığının kullanıcı deneyiminin önüne geçmesi biraz üzücü
Doğru karar olsa da üzücü;
@cImport’un bu dilin güçlü bir öldürücü özelliği olduğunu düşünüyorumBu değişiklik, üçüncü taraf paketleri indiren ve arşivden çıkaran kodla ilgili
@cImportdeğişikliği, Zig’in LLVM/libclang bağımlılığını bir gün isteğe bağlı hale getirme ve daha sonra üçüncü taraf pakete çıkarabilme çalışmasının parçasıydı; ama doğrudan ilişkili görünmüyorUzun vadeli hedefin derleme sistemini bir WebAssembly VM içine taşımak olduğunu bir yerde okumuştum
Öyleyse harika bir iş
Zig için iyi bir değişiklik
Go’dan Zig’e geçme isteğim oldukça güçlü, ama şimdilik kenardan izlemekten de keyif alıyorum
Her dil kendi paket sistemini yaptığında büyük bir fırsatı kaçırmışız gibi hissediyorum
Tek istisna C/C++; onda da iyi ya da kötü, yeterince yerleşmiş bir şey yok
Bu tercih, ileride birden çok dili karıştırarak kullanmak gerektiğinde çok karmaşık süreçler doğurabilir
Paketleme sistemleri işleri kolaylaştırır; ama başka bir dil kullanmanız gerektiği anda sonraki süreci daha karmaşık hale getirir
Tüm diller için tek bir derleme sistemi mi istiyorsun? Bazel gibi sistemler var ve çok dilli projelerde de sık kullanılıyorlar; ama pratikte dile özgü bilgiye sahip derleme sistemlerinin çok daha kolay yönetildiği kanıtlanmış gibi
Çünkü bağımlılık eklemeden önce dikkatlice düşünmeye zorluyor
Bu tür bağımlılıkların çoğu zaman güvenlik açıkları gibi gizli maliyetleri oluyor
Önemli sistemlerin hatırı sayılır bir kısmı C++ ile yazıldığı için, her paketi düzgün denetlemeden kolay erişilebilir onlarca üçüncü taraf pakete bağımlı olmak fazlasıyla riskli
Zig bu boşluğu dolduruyor
Aslında böyle derleme sistemleri sadece Buck ve Bazel; ikisi de arkalarındaki dev kuruluşlardan gelen fazlasıyla yük taşıyor
Üzücü bir durum
Sorumlulukların ayrımı çok ikna edici şekilde yapılmış