LLVM ile boşanma başvurusu
(github.com/ziglang)- Zig projesi, ana zig çalıştırılabilir dosyasından LLVM, Clang ve LLD kütüphane bağımlılıklarını tamamen kaldırmayı hedefliyor
- Kalan işler LLD’nin kaldırılması, LLVM API çağrılarının kaldırılması, C/x86/wasm/aarch64 backend’lerinde ilerleme, Clang’e bağımlı alt komutların ve önişlemci kullanımının kaldırılması,
zig ariçin alternatif bir uygulama gibi başlıklara ayrılıyor - LLVM backend’i hâlihazırda
.bcdosyası üretiyor; ancak Zig derleyicisi.bcdosyalarını nesne dosyasına derleme yeteneğine sahip olmayacak ve bu durumda Clang’in ayrı kurulması gerekecek - Beklenen etkiler arasında kaynak koddan derleme ve bootstrap sürecinin basitleşmesi, Linux dağıtımları ve Homebrew’de LLVM/Clang/LLD ile ilgili sorunlardan kaçınılması, ikili dosya boyutunun yaklaşık 150 MiB → 5 MiB düşmesi yer alıyor
- Zig’in kendi optimizasyon geçişlerini uygulayabileceği ve alive2 gibi araştırma projeleri ile Intel, ARM, RISC-V çip üreticilerinden doğrudan katkı çekebileceği yönü öne çıkarılıyor
Zig çalıştırılabilir dosyasından kaldırılmak istenen bağımlılıklar
- Bu issue’nun amacı, Zig projesinden LLVM, Clang, LLD kütüphanelerini tamamen kaldırmak
- Kalan bağlantı noktaları LLD, LLVM, Clang ve
zig aralanları olarak düzenlenmiş
LLD ile ilgili kalan işler
- completely eliminate dependency on LLD #8726: LLD bağımlılığını tamamen kaldırma işi devam ediyor
LLVM ile ilgili kalan işler
- LLVM alanı; LLVM bitcode çıktısı, backend testlerinden geçme oranı ve LLVM API’sini kaldırma işlerini kapsıyor
- directly output LLVM bitcode rather than using LLVM's IRBuilder API #13265: LLVM’nin IRBuilder API’si yerine doğrudan LLVM bitcode çıktısı üretme işi
- C backend’i 1742/1792 testten geçti, geçme oranı %97
- enable the x86 backend by default for debug builds on x86_64-linux #22257: x86_64-linux debug build’lerinde x86 backend’ini varsayılan olarak etkinleştirme işi
- wasm backend’i 1611/1765 testten geçti, geçme oranı %91
- 100% behavior tests passing for the aarch64 backend #21172: aarch64 backend’inin behavior test’lerinden %100 geçmesini sağlama işi
- ability to create import libs from def files without LLVM #17807: LLVM olmadan def dosyalarından import libs oluşturma yeteneği
- Avoid LLVM API for setting a module's code model and PIC/PIE levels #21238: Bir modülün code model ve PIC/PIE seviyelerini ayarlarken LLVM API kullanımından kaçınma işi
- completely eliminate dependency on LLVM library API calls #25492: LLVM library API çağrılarına bağımlılığı tamamen kaldırma işi
Clang ile ilgili kalan işler
- Zig deposundaki C++ kaynak dosyaları bootstrap sırasında clang ile derleniyor
- src/windows_sdk.cpp: port to Zig #15657:
src/windows_sdk.cppdosyasını Zig’e port etme işi
- src/windows_sdk.cpp: port to Zig #15657:
zig cc,zig c++,zig translate-cand other subcommands without a clang/llvm dependency in the compiler binary #20875: Derleyici ikilisinin içinde clang/llvm bağımlılığı olmadanzig cc,zig c++,zig translate-cve diğer alt komutları sunma işi- make resinator use aro's preprocessor instead of clang #17752: resinator’ın clang yerine aro’nun önişlemcisini kullanmasını sağlama işi
- make mingw .def.in file parsing use aro's preprocessor instead of clang #17753: mingw
.def.indosya ayrıştırmasının clang yerine aro’nun önişlemcisini kullanmasını sağlama işi - move
@cImportto the build system #20630:@cImport’u build system’a taşıma işi
zig ar ve .bc dosya işleme kısıtları
- zig ar: a drop-in llvm-ar replacement #9828:
zig ar’ı llvm-ar muadili hâline getirme işi devam ediyor - LLVM backend’i hâlihazırda
.bcdosyaları üretiyor; ancak Zig derleyicisi.bcdosyalarını nesne dosyasına derleme yeteneğine sahip olmayacak - Bu kullanım senaryosunu karşılamak için Clang’in ayrıca kurulması gerekecek
Bağımlılıkların kaldırılmasıyla beklenen değişiklikler
- Zig tarafındaki tüm hatalar Zig projesinin sorumluluk alanına girecek
- Derleyiciyi kaynak koddan derleme ve bootstrap etme süreci basitleşecek; host sistemde yalnızca C derleyicisi yeterli olacak
- Linux dağıtımları ve Homebrew gibi paket yöneticilerinin LLVM, Clang ve LLD ile ilgili oluşturduğu sorunlarla artık uğraşılmayacak
- Zig derleyici ikilisinin boyutu yaklaşık 150 MiB’den 5 MiB’ye düşecek
- Derleme hızı birkaç basamak mertebesinde artabilir
- Zig, kendi optimizasyon geçişlerini uygulayarak bilişimin en ileri seviyesini yukarı taşıyabilir
- alive2 gibi araştırma projelerini çekebilir
- Intel, ARM, RISC-V çip üreticileri gibi kendi CPU’larında daha iyi makine kodu isteyen paydaşların doğrudan katkısını teşvik edebilir
2 yorum
LLVM kadar optimizasyon veya platform desteği mümkün olur mu..
Hacker News görüşleri
Andrew o kadar keskin biri ki, bu bir hedef olarak ilan edildiyse ekibin sonunda bunu başaracak gibi görünüyor
Ama Zig'in LLVM ile yaşadığı zorlukları çok iyi bilmeyen biri olarak bakınca, bu karar ekibin kapasitesini Zig'in kendisinden alıp binutils benzeri çevre araçlara yönlendiriyormuş gibi görünüyor
Başlığı ilk gördüğümde derleyiciyi bırakıyorlar sandım; ayrıca Zig gibi bir proje için LLVM'i korumanın da önemli getirileri var gibi duruyor
Yine de LLVM içindeki pek çok kodu C++ yerine Zig ile yeniden yazma fikri oldukça havalı ve iddialı. Hatta LLVM'i yaratan Lattner'ın girişimi kadar iddialı olduğu da söylenebilir
Ama yanlışlıkla ikinci dereceden zaman karmaşıklığına düşen kodlar, Zig de LLVM kadar popüler ve faydalı hale gelirse, muhtemelen kaçınılmaz olacaktır
“Bir uzay görevi mevcut bir fırlatma aracını yeniden kullanmıyorsa, o proje bir fırlatma aracı geliştirme projesine dönüşür; görevin özü sandığınız diğer her şey ise ikincil hale gelir” gibi bir fikirdi
Hatırladığım ek kısım da, “mevcut fırlatma aracına uymak için taviz vermek yerine belirli göreve uygun bir araç yapmanın daha ucuz ve verimli olacağını düşünebilirsiniz” ön kabulünü içeriyordu
Rust'ın başarısının bir kısmı da C/C++ ile benzer uyumluluğa dayanıyor
Zig'in benzer bir yetenek olmadan başarılı olmasını hayal etmek zor; bu yüzden umarım bu kilometre taşını aynen zorlamazlar
Çünkü GCC, Apple'ın istediği ya da ihtiyaç duyduğu şeyleri ya izin vermiyor ya da hayata geçirmek istemiyordu
TCC'deki gibi daha odaklı olunursa işin çoğu çoklu mimarilere kod üretimi tarafında olacaktır
Burada iki sorun var. Biri kod üretimi, diğeri ise bootstrap
Deneyimime göre derleyicinin optimizasyon pass'lerini yazmak kolay ve eğlencelidir. Register allocation ve SSA biçimini anlamak için makale okumak gerekir, ama IR'yi çeşitli optimizasyon pass'lerinden geçirip adım adım rafine eden kodu yazmak keyiflidir
LLVM olmadan da yüksek kaliteli optimizasyon pass'leri yapılabilir. Ama IR'yi makine koduna doğrusal hale getirme aşaması, “mov [eax+8*ebx], 123” komutunun x86-32/64 üzerinde kodlanmasının bütün yollarını sevmiyorsanız, sıkıcı ve sıradan bir iştir
İkili boyutunu optimize ediyorsanız hangi platformda “push eax; push eax; push eax”ın “add rsp,12”dan daha kısa olduğunu ölçmek ister misiniz? Bu sadece x86 hikâyesi; bunu çoğu geliştirici için önemsiz olan x86 dışı mimarilerle çarpınca mesele çok daha büyüyor
Seyrek kullanılan mimariler için yazılmış kod üreticilerindeki büyük hataların yıllarca fark edilmemesi ihtimali de oldukça yüksek
İkinci konu bootstrap. Zig ile yazılmış Zig derleyicisini neyle derleyeceksiniz? Örneğin C ile yazılmış, optimize edilmemiş minimal bir Zig derleyicisiyle Zig derleyicisini derleyebilirsiniz
Ama optimize edilmemişse, sonra Zig derleyicisini optimize edilmiş Zig derleyicisiyle yeniden derlemeniz gerekir. Çözümsüz bir problem değil ama uzun ve karmaşık build süreci potansiyel katkıcıları kaçırma riski taşır
Zig'in C'yi, belki C++'ı bile derleyebildiği bu kadar pazarlanmışken şimdi LLVM'i tamamen çıkaracağız demek oldukça radikal görünüyor
Destek vermeye çok daha fazla insan katılmadıkça LLVM düzeyinde platform desteğine yaklaşma ihtimali de çok düşük görünüyor
İsteyenler için kendi backend'lerini ekleme planını anlayabilirim ama LLVM'i tamamen kaldırmak aceleci görünüyor
Şu anda ekip geri bildirim topluyor, etkilenen kullanım senaryolarını öğreniyor ve uygulanabilirliği ölçmeye çalışıyor; bu yüzden buna aceleciliğin tam tersi bile denebilir
Genel durumda gerekmeyen 100MB+ boyutunda bir LLVM kopyasını paketle birlikte sunmak zaten biraz tuhaf, o yüzden mantıklı. Geliştiriciyseniz muhtemelen zaten kurmuşsunuzdur
Yine de kurulu Zig'in sistemdeki LLVM sürümüyle düzgün çalışacağını garanti etmek zor olabilir. Bekleyip görmek lazım
https://github.com/ziglang/zig/issues/13265
Son zamanlarda Zig hakkında biraz daha okudum, hatta sistem paketleriyle boğuşmadan LLVM ile C++ derlemenin kolay bir yolu olarak denedim. C/C++'tan Zig'e geçebilme fikri büyük bir satış noktasıydı
Çok ani ve beklenmedik geldi. Proje için doğru mu yanlış mı bilmiyorum ama benim açımdan gerçekten durup dururken olmuş gibi hissettiriyor
Bir yandan bağımlılıkları azaltmaya yönelik bu titiz isteğe saygı duyuyorum, ama bedeli epey ağır görünüyor
C++ uyumluluğunun kaybı, çevremdeki Zig hayranlarının en çok andığı avantajlardan birini fiilen ortadan kaldırıyor
Performans kaybı da, geçici olsa bile, onların birlikte andığı bir diğer temel nokta
Hızlıca göz atanlar için söyleyeyim: Bu kararlaştırılmış bir şey değil, bir öneri
Yaklaşık 4 yıldır gömülü projeleri ve kütüphaneleri tamamen Zig ile yazdım; şimdi birkaç tier 1 desteklenen mimari öylece mi çıkarılacak?
Dil onlara ait, istedikleri gibi yapabilirler ama öyleyse markalamayı da buna göre ayarlasalar iyi olur
Sanırım tier 1 desteği iki kategoriye ayrılacak: yerleşik tier 1 desteği ve isteğe bağlı LLVM backend’i üzerinden tier 1 desteği.
Bir mimaride zaten tier 1 desteği varsa, LLVM backend’ini isteğe bağlı bağımlılık haline getirmek o desteğin kaybolması için bir sebep gibi görünmüyor.
Andrew’un teklifte yazdığı gibi, bu yaklaşım daha nadir mimarileri daha iyi desteklemenin yolu da olabilir. İlginç işlemci mimarileri için bir Zig backend’i üzerinde seve seve çalışırım ama LLVM’ye asla katkı yapmam. C++ ile çalışmak hobi olarak yapılacak bir şey değil.
Bunun faydası ne olacak? Bu kaynak israfı değil mi?
DLang’in 3 derleyicisi var.
gdc, Gnu Compiler Collection backend’i tabanlı; ldc, LLVM backend’i tabanlı; dmd ise benim Zortech/Symantec/Digital Mars için yazdığım x86 kod üreticisi tabanlı.
Her birinin artıları, eksileri ve hedefleri farklı ama destekledikleri D dili aynı.
Genel olarak kullanıcılar seçenekleri seviyor ve bazıları birden fazlasını birlikte de kullanıyor.
Eğer doğru anladıysam Zig’in yaklaşımını beğeniyorum.
Bu sayede geliştirme sırasında en hızlı derleyiciyi, son sürüm içinse en hızlı çalışma zamanı ya da en düşük bellek kullanımı olan derleyiciyi seçebilmek çok faydalı oluyor.
Ayrıca tüm derleyicilerin uyduğu bir dil spesifikasyonu varsa, bu dilin istikrarlı olduğuna ve alttan bir anda bozulmayacağına dair güvence sağlıyor.
Elbette Zig gibi, henüz istenen şeyleri değiştirip dili daha tutarlı, daha temiz ve daha güçlü hâle getirebilen dillerin de avantajı var. Yine de bugünlerde böyle bir istikrara çok daha fazla değer veriyorum; çünkü geliştirme araçlarını sürekli yakalamaya çalışmak yerine kullanıcıya gerçek değer üretmeye odaklanabiliyorsunuz.
Zig’i ilginç kılan başlıca nedenlerden biri, C/C++ derleyicisinin yerine doğrudan takılabilmesiydi.
Arkadaşlarım, Windows’ta Zig’i C/C++ derleyicisi olarak kurmanın diğer tüm alternatiflerden daha kolay olduğunu söylüyordu.
Bu öneri kabul edilirse kişisel olarak Zig’in popülaritesinin Hare ya da diğer aşırı niş diller seviyesine düşeceğini düşünüyorum.
İş arkadaşlarımı Zig’i bir kez bile denemeye ikna edebilmek için Uber’in bunu production’da kullandığına dair yazıları bile göndermek zorunda kaldım. Mevcut projelere anında değer katmasaydı, iş arkadaşlarım ikinci kez düşünmezdi bile.
Yine de önerinin arkasındaki gerekçeyi anlıyorum. LLVM derleme süreleri korkunç gelebiliyor ve özel bir bytecode’a sahip olmak güzel optimizasyon teknikleri uygulamayı mümkün kılabilir. LLVM bug’larıyla uğraşmak da pratikte el sürmesi zor bir iş ve Julia ekosisteminde de bunu gördüm.
Tavsiyemin bir anlamı olacaksa, bence Zig 1) debug build’lerde hızlı derleme ve hızlı debug için özel bytecode, 2) release build’lerde hızlı çalışma zamanı performansı için LLVM kullanmalı.
C/C++ cross-compilation desteğini koruyarak 1)’i başarabiliyorsa — örneğin sadece o kısmı LLVM’ye devrederek — ek backend kodu bakımının getireceği trade-off’a rağmen bu en iyi uzlaşma olabilir.
Bu, üst düzey Julia derleyicisi çalışmasından farklı ayrı bir beceri seti gerektiriyor ve hata düzeltmelerini upstream’e birleştirmek bazen uzun sürebiliyor.
Ama gerçekte upstream ile oldukça iyi ve üretken bir ilişkimiz var; LLVM’yi kaldırmaya karar verseydik proje çok daha az iş başarabilirdi.
Özellikle GPU desteği ve HPC desteği, örneğin PPC, LLVM’ye dayanıyor.
Bu yüzden Julia’nın bizim patch set’imize/fork’umuza uygun biçimde derlenmesi yönündeki tavrımızı koruyoruz ve bu patch’leri kullanmayan Julia build’lerinde ortaya çıkan bug’lara zaman harcamıyoruz. Özellikle dağıtım build’lerinde bu sık oluyor.
Başka dillerin LLVM dışı backend çalışmalarını izlemiş biri olarak, bağlantısı verilen teklifte kibir çok güçlü hissediliyor.
Yazarı o kişi olmasaydı bunu, Zig’e yeni başlamış birinin gelişigüzel açtığı bir GitHub issue’su sanardım.
Gerekli iş miktarını küçümsüyor, LLVM’ye konmuş bütün emeği üstü kapalı biçimde küçültüyor ve “bunu elbette daha ucuza, daha hızlı, daha iyi yaparız” türü bir özgüven ve maço tavır her cümleye sinmiş durumda. Hayal kırıklığı yaratıyor.
Andrew’un bugüne kadarki çalışmalarına gerçekten saygı duydum; bu yüzden bunu aceleyle ya da anlık bir dürtüyle yazmış ve böyle okunacağını fark etmemiş olabilir diye iyi niyetli yaklaşmak istiyorum.
Ama bu yazı güven vermiyor ya da önerinin kendisine daha açık fikirli bakmamı sağlamıyor.
Webpack ve esbuild bunun örnekleri.
LLVM olmadan bir şeyler inşa etmek için doğru zaman birkaç yıl önceydi. Ama şimdi C++ özelliklerini çıkarırlarsa bu Zig’in sonu olabilir.
Bunu aşamalı olarak kaldırmak yerine Zig ile kendi C++ derleyicilerini yazma planını duyurmamış olmalarına şaşırdım.
18. yaş gününde başlayan bir bireyin bir C++ derleyicisi yazabileceğinden bile emin değilim. Çalışan bir derleyici yapmaya yetecek kadar ömrü kalmayabilir.
Zig, dünyanın yeni C’si olmak istiyor; dünyanın yeni C++’ı olmak istemesi ise pek söz konusu değil
Bu öneride de C çapraz derleme desteğinin sürmeye devam ettiğini görebilirsiniz
Bu tercih doğru olabilir. C şu anda gömülü dünyada çok kullanılıyor ve o alanda LLVM iyi değil
Ben Zig olsaydım tüm mikrodenetleyicileri hedeflemek isterdim ve bunu başarmanın gerçekçi yolu yalnızca bu