- gccrs, GCC içinde bir Rust derleyicisi gerçekleştirmeyi amaçlayan ve 2014’te başlayan bir proje; tamamlanmasına hâlâ çok olsa da standart kütüphaneyi derleme ve GCC 14’e dahil olma yönünde ilerleme kaydediyor
- Proje, hızla değişen en güncel Rust yerine Rust 1.49’u hedef aldı; ancak standart kütüphane içindeki bağımlılıklar nedeniyle
const genericsgibi özellikleri sonunda yine de gerçekleştirmek zorunda kaldı coreveallocderlemesi; makro ad çözümleme, dekoratör makroları, GCC’de bulunmayan LLVM compiler intrinsic’leri ve borrow checker eksikliği nedeniyle hâlâ tıkanmış durumda- rustc_codegen_gcc, rustc’nin bir kısmını kullanıp arka uç kod üretimi için GCC’den yararlanan daha olgun bir yaklaşım ve Ekim 2023 itibarıyla ek yama olmadan Rust for Linux’u derleyebiliyor
- gccrs için GCC güvenlik eklentileri, statik analiz, LLVM’in desteklemediği mimariler ve Rust for Linux gibi net motivasyonlar var; ancak pratik kullanım açısından hâlâ
rustc_codegen_gcckadar geniş değil
gccrs’nin hedefi ve mevcut durumu
- gccrs, GNU Compiler Collection(GCC) içinde bir Rust derleyicisi gerçekleştirmeyi amaçlayan bir projedir
- 2014’te başladı ve LWN’nin daha önceki kapsamına alınmasından sonra, proje raporuna göre ilerleme kaydedildi
- 2022’de hedef GCC 13’e dahil olmaktı, ancak bu başarılamadı; Kasım 2023 aylık raporu itibarıyla hedef GCC 14’e dahil olmak
- GCC 14, 2024 ortasında çıkması muhtemel bir sürüm olarak ele alınıyor
- Ekim 2023’teki EuroRust 2023’te Arthur Cohen, “The road to compiling the standard library with gccrs” başlıklı sunumunda Rust standart kütüphanesini derleme çalışmasını ve neden hâlâ derlenemediğini anlattı
- Sunum videosu yayımlandı
Neden Rust 1.49 hedeflendi?
- gccrs, Rust’ın en yeni sürümünü sürekli takip etmek yerine Rust 1.49’u hedefliyor
- Rust 1.49, 2020 sonlarında yayımlandı ve Rust 1.50’de genel kullanıma açılan
const genericsdesteğinden önceki son sürümdü - Proje
const generics’ten kaçınmak istedi, ancak bunun Rust 1.49’un standart kütüphanesinin içinde zaten kullanılıyor olması nedeniyle sonunda bunu görmezden gelmek mümkün olmadı const genericsdaha sonra tamamen gerçekleştirildi ve artık bir engel değil- gccrs, Rust’ın bir üst kümesini ya da ayrı bir “GNU Rust” dili oluşturmak istemiyor
- Hedef,
rustcçıktısını, hatalarını ve alışılmadık davranışlarını bile yeniden üretmek - Bunun için hem Rust test paketi hem de GCC test paketi kullanılıyor
- Hedef,
Standart kütüphane derlemesinde tıkanan noktalar
- Rust standart kütüphanesi birden fazla crate’ten oluşur
- gccrs, en önemli iki crate olan core ve alloc için derleme desteği üzerinde çalışıyor
core, ilkel tipler ve makrolar gibi standart kütüphanenin temel özelliklerini gerçekleştiriralloc, heap bellek ayırma ve çeşitli kapsayıcı tipleri ele alır
- Şu anda gccrs, aşağıdaki eksikler nedeniyle bu crate’leri derleyemiyor
- Makro ad çözümleme davranışı doğru değil
- Dekoratör makro desteği tam değil
- Borrow checker olmadığı için kod güvenliği düzgün biçimde denetlenemiyor
- GCC’de bulunmayan LLVM compiler intrinsic’lerinin gerçekleştirilmesi gerekiyor
- Borrow checker eksikliği derlemenin kendisini engellemese de Rust kodunun güvenlik denetimlerinin düzgün yapılmasını engelliyor
Prosedürel makrolar ve GCC entegrasyon çalışmaları
- Eylül 2023’te GNU Tools Cauldron’da Pierre-Emmanuel Patry, GCC 14’e dahil edilme süreci ve makro çalışmalarına odaklanan bir sunum yaptı
- Sunum slaytları yayımlandı
- Prosedürel makro (procedural macro) gerçekleştirme yöntemi, GCC derleme sisteminde değişiklik gerektiriyor
- Prosedürel makrolar, C veya C++ makroları gibi yalnızca kaynak metin üretmeyip token stream üreten işlevsel makrolardır
- Rust’ta bunlar yerleşik proc_macro crate’iyle gerçekleştirilir
- Prosedürel makroların uygulanması zordur, ancak güçlü özellikler sağlar
#[attribute]dekoratörleri#[derive()]dekoratörleri- Derleme zamanı değerlendirmeye dayalı alan özel dilleri üretme
- GNU Cauldron sunumu sırasında gccrs’nin GCC’ye upstream edilmesi gereken 800’den fazla commit’i vardı
GCC ekosistemini Rust için kullanmak istemelerinin nedeni
- gccrs’nin başlıca motivasyonlarından biri, GCC’nin güvenlik eklentilerini Rust kodu için de kullanabilmek
- GCC’de hata ayıklama, statik analiz ve hardening’e yardımcı olan çok sayıda eklenti bulunur ve bunlar GCC ara gösterimi üzerinde çalışır
- gccrs, Rust geliştiricilerinin mevcut GCC eklentilerini yeniden kullanabildiği bir iş akışını desteklemek istiyor
- Cohen, C programcılarının dosya tanımlayıcılarını kapatmayı unutma hatasını uzun süredir yaptığı için bunu yakalayan çok sayıda eklenti bulunduğunu örnek verdi
- Amaç, Rust’taki
unsafekodda hataları yakalamak için mevcut GCC eklentileri ve statik analiz araçlarının kullanılabilmesini sağlamak
Halihazırda kısmen kullanıldığı alanlar
- Cohen’e göre Sega Dreamcast homebrew topluluğu, Dreamcast oyun konsolu için yeni oyunlar oluşturmakta gccrs kullanıyor
- Dreamcast topluluğunun ilgisinin nedeni,
rustcnin LLVM arka ucunun konsolun Hitachi SH-4 mimarisini desteklememesi, buna karşılık GCC’nin desteklemesi - gccrs henüz tamamlanmamış olsa da bu tür gömülü kullanım senaryolarında yararlı
- GCC eklentileri kullanılarak
unsafeRust kodunun statik analizi de şimdiden mümkün - gccrs üzerinde çalışılırken
Derefve makro ad çözümleme gibi belirtimi yeterince net olmayan dil özellikleri ortaya çıktı ve proje, Rust belirtimine katkı da sağlayabildi- Rust’ın şu anda resmî bir belirtimi yok, ancak RFC 3355 doğrultusunda belirtim çalışmaları sürüyor
Hâlâ geliştirilmekte olan temel özellikler
- gccrs’de Rust derleyicisinin birçok temel özelliği hâlâ eksik
- Başlıca gerçekleştirilmemiş veya geliştirilmekte olan özellikler şunlar
async/await- GCC’de bulunmayan LLVM intrinsic’leri
println!()gibi çıktı makrolarının kullandığıformat_args!()makrosu- Rust referans kurallarını zorunlu kılan borrow checker
- Borrow checker için en güçlü çözüm adayı, ayrı bir proje olan Polonius
- Cohen, gccrs’nin birkaç ay içinde Polonius’u entegre etme ihtimalinin yüksek olduğunu söyledi
- Jakub Dupak son birkaç ayda bu çalışma kapsamında ilerleme sağladı
- Polonius, şu anda
rustcnin borrow checker’ı ile anlamsal olarak eşdeğer bir borrow checker gerçekleştiren bir kütüphane- Referans yaşam süresini hesaplamak için farklı bir algoritma kullanır
- Uzun vadede
rustcnin mevcut borrow checker’ındaki eksikleri ve köşe durumları çözmeyi hedefler - Yeterince olgunlaşırsa gelecekte
rustcde Polonius’u benimseyebilir
format_args!() neden gerekli?
- Kasım 2023 gccrs aylık raporuna göre
format_args!()makrosu üzerinde çalışmaya başlandı format_args!(), string biçimlendirme makrolarına aktarılacak argümanları oluşturan yardımcı bir makrodur- Bu özellik Display ve Debug trait’leriyle ilişkilidir
format!()veprintln!()gibi makrolara verilecek argümanları hazırlamak için gereklidirformat_args!()olmadan Rust programları biçimlendirilmiş çıktı üretemez- Bu nedenle, gccrs’nin bir “Hello, World” programını derleyebilmesinden önce bile gerekli bir özelliktir
format_args!()hakkında derinlemesine açıklama için Mara Bos’un blog yazısı da ele alınıyor
rustc_codegen_gcc ile farkı
rustc_codegen_gcc, gccrs’den farklı bir GCC tabanlı Rust projesidir- gccrs’den daha olgundur, ancak kapsamı daha sınırlıdır
- Rust derleyicisini sıfırdan tamamen gerçekleştiren bir yaklaşım değildir
rustcnin LLVM arka uç API’sine bağlanmak için libgccjit kütüphanesini kullanır- Derlemenin büyük bölümünü
rustcyapar, daha sonraki aşamada ise GCC kullanılır libgccjitadında JIT geçse derustc_codegen_gcc, ahead-of-time derlemeyi amaçlar- Başlıca hedef, LLVM’in desteklemediği platformlarda Rust kod üretimini mümkün kılmaktır
- Ekim 2023 itibarıyla
rustc_codegen_gcc, ek yama olmadan Rust for Linux’u derleyebiliyor - Geçen yıl içinde SIMD ve link-time optimization desteği eklendi
- Bu iki özellik daha önce test başarısızlıklarının nedeni olarak gösteriliyordu
- Cohen, EuroRust sunumunda birkaç kez şimdilik gccrs yerine
rustc_codegen_gcckullanılmasını tavsiye etti rustc_codegen_gcczaten upstream Rust deposuna dahil edilmiş durumda
Rust for Linux ve sürüm farkı
- Rust for Linux, Linux çekirdeğine Rust desteği eklemeyi amaçlayan bir girişimdir
- Cohen, Linux çekirdeğini gccrs projesinin temel motivasyonlarından biri olarak gösterdi
- Çünkü çekirdekle ilgili birçok kişi çekirdeğin yalnızca GNU araç zinciriyle derlenmesini tercih ediyor
- Şu anda Rust for Linux projesi, çekirdekteki Rust kodunu derleme yöntemi olarak rustc veya rustc_codegen_gcc seçeneklerini belgeliyor
- Çekirdekte çeşitli derleme araçları için desteklenen en düşük sürümler de belgelenmiş durumda
rustc, en düşük sürüm olarak değil tam olarak eşleşmesi gereken bir sürüm olarak ele alınıyor- Şu anda desteklenen
rustcsürümü, Ekim 2023’te yayımlanan 1.73.0
- gccrs’nin hedeflediği Rust 1.49 ile Rust for Linux’un gerektirdiği Rust 1.73.0 arasında büyük bir fark var
- Rust for Linux desteği gccrs’nin açık hedeflerinden biri olsa da bu sürüm farkı nedeniyle hâlâ oldukça uzak
Genel değerlendirme
- gccrs deposunda 1 Ocak 2023’ten bu yana 3.000’den fazla commit bulunuyor
- Son bir yılda proje kayda değer ilerleme gösterdi
- Ancak sıfırdan tam bir Rust derleyicisi gerçekleştirme kapsamı çok büyük olduğundan, neredeyse tüm pratik amaçlar için hâlâ kullanılabilir durumda değil
rustc_codegen_gcc, upstream Rust deposuna birleştirildi ve Rust for Linux’ta gerçek kullanımda bulunuyor- Rust dili için birden fazla bağımsız derleyici gerçekleştirmesinin olduğu aşamaya henüz gelinmedi, ancak o yöne doğru yaklaşılıyor
1 yorum
Hacker News yorumları
Yalnızca yazının iddiasına bakınca gccrs’nin motivasyonu biraz zayıf görünüyor
GCC güvenlik eklentileri ya da Linux çekirdeği tarafında GNU araç zinciri tercihi, neden GCC’yi backend olarak kullanmak isteyebileceğinizi açıklar; ancak neden yinelenen bir frontend gerektiğini açıklamaz
Rust’ın, C++’ta olduğu gibi farklı derleyici anahtarları, dil desteği düzeyi farkları ve platforma özgü hatalar yüzünden çapraz platform geliştirmenin zorlaşması hatasını tekrarlamamasını umuyorum
Bu yüzden gccrs’nin
rustc_codegen_gcc’ye göre neden daha iyi bir yaklaşım olduğunu açıklamaları iyi olurdu; ikincisi çok daha az çaba ve riskle aynı hedefe ulaşabiliyor gibi görünüyorMSVC’de bir derleyici hatasıyla karşılaşırsanız bunu bildirip GCC’ye geçerek çalışmaya devam edebilirsiniz, ama Rust’ta şu an böyle bir seçenek yok
Alıntıda dendiği gibi, Rust’ın üst kümesi olmamaya yönelik dikkat bunun bir örneği
C/C++’ın sorunu, derleyici üreticilerinin birbirleriyle “daha iyi” olmak için rekabet etmesiyle ortaya çıktı ve birden fazla frontend genelde çok sayıda hata ile yanlış uygulamayı açığa çıkarma avantajına sahip
Rust sanki kutsalmış da frontend’in yeniden yazılması yasakmış gibi değil ve Rust’ı yeni mimarilerde bootstrap etmek hâlâ sancılı
LLVM’nin desteklemediği mimariler için çalışan bir Rust derleyicisi de yok
codegen_rust_gccde mevcut Rust derleyicisiyle aynı bootstrap sorununa sahip ve Rust’ın çeşitli bölümlerine mimari desteği eklemek gerekiyor; Rust bakımcıları da buna pek istekli değildiBu yüzden yakın gelecekte hemen kullanılabilir bir Rust derleyicisinin çıkması ve Alpha gibi mimarilerde de Rust’laştırılmış kütüphanelerin büyük acılar yaşamadan yeniden derlenebilmesi beni çok memnun eder
Zaten GCC, G++, libstdc++ ve EDG C++ frontend’i vardı
GCC, Clang, MSVC ve diğer derleyiciler birbirini tamamlar, farklı amaçlara ve pazarlara hizmet eder ve dilin tek bir uygulamanın tesadüfi özelliklerine değil, belirtime uygun biçimde sağlamlaşmasına yardımcı olur
GNU Toolchain Project, LLVM Project ve Rust projesinin hepsi sorunlar yaşadı; bu yüzden tek hata noktasına bağımlı olmamak daha iyidir ve yedeklilik ile kırılganlık karşıtlığı dosttur
Dil standardına kötü gözle bakıp “bu kod C99/C++11’dir” demek yerine “bu kod SHA256 karması
e49d560cd008344edf745b8052ef714b07595808898c835f17f962a10012f964olan rustc ikilisi/kaynağında çalışır” demeyi tercih etmek kafa karıştırıcıRust’ın bir dil standardına ihtiyacı var
https://blog.m-ou.se/rust-standard/
https://rust-lang.github.io/rfcs/3355-rust-spec.html
https://github.com/rust-lang/rfcs/pull/3355
Standardı ortaya çıkana kadar Rust’ı benimsemeyecek çok sayıda kurum ve sektör var
C, C++, C#, hatta JavaScript’in (ECMAScript) bile bir dil standardı varken Rust’ın olmaması için bir neden yok
C: https://www.iso.org/standard/74528.html
C++: https://isocpp.org/std/the-standard
C#: https://learn.microsoft.com/en-us/dotnet/csharp/language-ref...
JavaScript / ECMAScript: https://ecma-international.org/publications-and-standards/st...
İlerleme hayal kırıklığı yaratacak kadar yavaş olsa da proje canlı ve gelecek yıl ivme kazanma ihtimali var
https://blog.rust-lang.org/inside-rust/2023/11/15/spec-visio...
https://go.dev/ref/spec
Zaten iyi çalışan bir şeyi neden değiştirmemiz gerektiğini anlamıyorum
GCC-RS’e bu kadar olumsuz tepki verilmesi şaşırtıcı
Bir dilin birden fazla uygulaması yoksa, bana göre oldukça zayıf bir dildir
Rust topluluğundaki uzlaşı, mevcut yaklaşımın; yani tanım gereği standart olan tek bir derleyici, bol miktarda dokümantasyon, güvenlik açısından kritik endüstriler için asgari bir spesifikasyon ve bazı modül alt alanı spesifikasyonlarının, birden fazla uygulamanın avantajlarının çoğunu getirirken dezavantajlarından kaçındığı yönünde
Bu C’de fiilen yaşanıyor ve C++ zaten saçma ve tuhaf bir karmaşıklık yüzünden neredeyse kurtarılamaz durumda
Bu olmadan gerçekçi alternatif uygulamaların ortaya çıkması zor
GNU araç zinciri darmadağınık ve insanların gerçekten bunun üzerinde nasıl geliştirme yaptığını bilmiyorum
Bu ideolojik bir mesele değil; düpedüz GCC’nin kendi geliştirme ortamının nasıl kurulduğunu anlayamıyorum
Birkaç kez bootstrap etmeye çalışacak kadar şanssız oldum ve şimdiye kadar gördüğüm yazılımlar içinde en kötü çalışan şeylerden biriydi
Sega Dreamcast homebrew topluluğunun gccrs ile yeni oyunlar yapabilmesi ve GCC eklentileriyle unsafe Rust kodu için statik analiz yapılabilmesi hoşuma gitti
Dreamcast’in Hitachi SH-4 mimarisi,
rustcnin LLVM backend’i tarafından desteklenmiyor ama GCC tarafından destekleniyor; bu yüzden tamamlanmamış durumdaki gccrs bile bu tür gömülü kullanım senaryolarında faydalı olabilirBunun için gereken şey bir GCC frontend’i değil, yalnızca GCC backend’i
Artık LLVM’in desteklemediği ama GCC’nin desteklediği Alpha, SuperH, VAX gibi mimarilerde de Rust desteği görebiliriz
rustcnin desteği bıraktığı mips64 de buna dahilhttps://github.com/rust-lang/compiler-team/issues/648
LLVM tarzı düşüncenin en büyük sorunu, mimari desteğini donanım şirketlerinden destek, yani maaşlı geliştirici pozisyonları koparmak için bir araç olarak kullanması
GNU tarafında değişikliklerin birleştirilme ölçütleri sinir bozacak kadar yüksek olabilir ama bir kez kabul edilip desteklenmeye başlandı mı uzun vadede korunuyor
Bu, satın almakla kiralamak arasındaki fark gibi; GCC’ye destek eklemek için çok daha fazla geliştirme zamanı gerekiyor ama bir kez girdikten sonra kalıyor
Örneğin yakın zamanda RISC-V tarafında GCC’nin RV32E hedefini desteklediğini, LLVM’in ise desteklemediğini öğrendim
En son kontrol ettiğimde GCC’de bağımsız C derlemesi hâlâ çalışıyordu
Deneyimlerime göre gccrs’nin “GNU Rust” diye özel bir dil yaratmak yerine
rustcnin çıktısını, hatalarını ve tuhaflıklarını bile birebir kopyalamaya çalışması büyük bir hataRust’ın bir spesifikasyonu yok; başvuru dokümanları var ama açıkça normatif değiller
Tek bir referans uygulama dışında belgelenmemiş bir dil, uzun vadede zayıf kalır
Mevcut kodun iki uygulamada da çalışmasını garanti etmeye çalışmak makul bir hedef ama hata uyumluluğunu da vaat etmek, kötü kararları ve hataları fosilleştirmek olur
Microsoft, eski programların çalışmaya devam etmesini sağlarken güvenlik ve güvenilirlik hatalarını düzeltmek için büyük insan gücü harcıyor; Rust’ın ömrünün bu kadar erken safhasında böyle bir yük üstlenmesine gerek yok
Dili evrimleştirmek istiyorsanız kalite güvencesini ve kalite kontrolünü kabul etmeniz gerekir
Kaliteyi sonradan testlerle enjekte edemezsiniz; mimari, tasarım ve tasarım/kod incelemeleri gibi süreçlerle sistemin doğru çalışmasını ve başarısız olduğunda bile doğru yönde başarısız olmasını sağlamanız gerekir
Common Lisp, C++, FORTRAN gibi güçlü standartlar bu anlayışı benimsedi; Python gibi fiilen standart sayılabilecek daha zayıf diller de popüler olabilir ama değişimin zor olması, Python 2’den 3’e uzun geçişte ve az sayıdaki uygulamada açıkça görüldü
Bu başlığa geç katılıyorum ama bunun mutlaka iyi bir şey olmayabileceğini düşünüyorum
Dağıtımlar, birkaç ayda bir yeni sürüm çıkaran dilleri yakalayamıyor; bu yüzden
rustcveya Go’yu dağıtım paketi olarak kullanmak zaten zorŞu anda şaşırtıcı biçimde GCC’nin artık gereksiz görülüp kaldırıldığı, yalnızca mevcut yazılımları güncel tutmak için upstream Go ve Rust’ın korunduğu sistemler var
Birkaç ay önce bir CVE nedeniyle Go’yu güncellediğimde, Go tabanlı uygulamaların kendi Go ortamlarını dört ayrı yerde sakladığını görmek tam bir kabustu
Linux zaten istenirse Clang ile derlenip tamamen LLVM tabanlı bir araç zinciri kullanılabiliyor
GNU “saflığı” uğruna bunu geliştirmek ve sürdürmek için harcanan mükerrer çaba buna değiyor gibi görünmüyor
ClangBuiltLinux topluluğu, Linux’un tek bir derleyiciye bağımlı olmaması gerektiğini savunuyordu ama Rust geldikten sonra aynı kişilerden epeyce bir kısmı birdenbire tek derleyicinin de sorun olmadığını düşünmeye başladı
Amaç çekirdeği yalnızca GNU’ya bağlamak değil, sadece tamamen GNU araç zinciri seçeneğini mümkün kılmak