crustc: rustc’nin tamamını C’ye dönüştürme
(github.com/FractalFir)crustc,rustc 1.98.0-nightly (c712ea946 2026-06-16)sürümünün tamamını 46 milyon satır C koduna dönüştüren bir demo;GCCvemakeile derlendiğinde çalışan bir Rust derleyicisi ortaya çıkıyor- Temel araç olan
cilly, Rust’ı C’ye derleyen bir Rust derleyici backend’i ve bu depo, derleyicinin kendi kendini derlemesinin en dikkat çekici vitrini olarak hazırlanmış cilly, hedef C derleyicisi ve platformun tür yerleşimi, boyut, hizalama, karakter kodlaması, tamsayı biçimleri gibi özelliklerini witness programları ile sorgulayarak, belirli bir C derleyicisinin kabul edebileceği C kodu üretiyor- Başlıca hedef, LLVM/GCC desteği olmayan ama C derleyicisi bulunan eski veya sıra dışı donanımlarda Rust kullanımını mümkün kılmak; buna TCP üzerinden uzak C derleyicisiyle iletişim kurabilen ağ şeffaflığı da dahil
- Şu anda üretilen C kodu, yazarın iş istasyonu ISA’sı olan ARM64 Linux hedefli;
cillyaraç zincirinin tamamı henüz kamuya açık kullanıma hazır değil ve optimizasyonla ilgili hatalar hâlâ izleniyor
rustc’yi C’ye dönüştüren demo
crustc,rustc 1.98.0-nightly (c712ea946 2026-06-16)sürümünü 46 milyon satır C koduna dönüştüren bir depo- Bu C kodu
GCCvemakeile derlenebiliyor; derleme sonucu çalışan bir Rust derleyicisi oluyor - Çalıştırma örneğinde LLVM kütüphane yolu belirtildikten sonra
./rustc/rustc --versionkomutu çalıştırılıyor ve aynırustc 1.98.0-nightlysürümü çıktılanıyor - Üretilen Rust derleyicisi kod derleyebiliyor, ayrıca
core,alloc,stdderleyebiliyor - Kod tabanında C kodunun yanında bazı C++ LLVM wrapper’ları da bulunuyor
- Rust, LLVM’nin bazı işlevlerini açığa çıkarmak için C++ kullanıyor
- Bu wrapper’lar LLVM sürümüne bağımlı ve tek başına derlenmeleri zahmetli olduğu için önceden derlenmiş halde sunuluyor
cilly’nin rolü
crustc, yeni Rust-to-C derleyici araç zinciricillyiçin bir demo/teasercillyaraç zincirinin tamamı, kullanıcının Rust kodunu herhangi bir hedefe uygun şekilde C’ye derlemeyi amaçlıyor- Bu depo,
cilly’nin derleyicinin kendisini derlediğini göstermek için hazırlanmış cilly, bir Rust kütüphanesi ve Rust derleyici backend’i; yani eklenti biçiminde Rust’ı C’ye derliyor- Yazar, son 3 yıldır Rust’ı C’ye derleme üzerinde çalıştığını;
rustc_codegen_clrgibi açık denemeler ve çeşitli kapalı denemelerden sonracilly’nin 14. deneme olduğunu belirtiyor
C derleyicisine uygun kod üretme yöntemi
cilly’nin temel özelliği, C derleyicisine uyum sağlaması- Belirli bir derleyici ve platformun neyi desteklediğini doğrulayan witness programları üretebiliyor
- Örnek:
_Thread_local int KEYWORD_TLS_SUPPORTED;; bu ifade yalnızca ilgili C derleyicisi_Thread_localdesteği sunuyorsa derleniyor
- Örnek:
cilly, belirli bir C derleyicisinin kabul edeceği C kodunu üretmeyi hedefliyor- Tür yerleşimi, boyut, hizalama, karakter kodlaması ve tamsayı biçimleri sorgulanan başlıklar arasında
- Karakter kodlamasında ASCII olup olmadığı kontrol ediliyor
- Tamsayı biçimlerinde two's complement kullanılıp kullanılmadığı kontrol ediliyor
- Mümkün olan yerlerde fallback kullanılıyor
- ANSI C dışındaki varsayımlardan kaçınılmaya çalışılıyor; strict aliasing gibi modern C standardı davranışları için de kaçış yolları bulunuyor
- Nadiren
(void*)(uintptr_t)(ptr)gidiş-dönüş dönüşümü gibi makul varsayımlar gerekebiliyor- Bu tür varsayımlar belgeleniyor ve mümkünse
CHAR_BIT = 8gibi assert’ler ekleniyor
- Bu tür varsayımlar belgeleniyor ve mümkünse
Hedefe özgü C kodu ve ABI kısıtları
cilly’nin ürettiği C kodu derleyiciye özel- Arm64 için üretilmiş
cillyC kodu riscv32 üzerinde doğrudan çalıştırılamaz - Ancak riscv32 için ayrı
cillyC kodu üretilebilir
- Arm64 için üretilmiş
- Bu depodaki
rustciçin üretilen C kodu, yazarın iş istasyonunun ISA’sı nedeniyle ARM64 Linux hedefli cillytarafından üretilen kod, genel olarak normalrustctarafından derlenen kodla ABI açısından uyumlu- Bazı platformlarda
rustc, C ile ifade edilemeyen ABI’ler seçtiği için tam uyumluluk zorlaşıyor - Arm64’te, yapı döndürme işaretçisi
sretnedeniyle kısıtlar var- Çoğu platformda
sret, ilk argümanla aynı register üzerinden geçirilir; bu da ilk argümanı çıktı işaretçisi yapmayı mümkün kılar - Arm64’te
sretişaretçisi farklı bir register üzerinden aktarılır - Yerel C derleyicisinin küçük struct’lar için return-by-sret seçmesi gerekir; ancak açıklamaya göre 16 bayttan küçük struct’larda bunu yapmıyor
- Çoğu platformda
Eski veya sıra dışı hedefleri destekleme
- Bu projenin ana hedeflerinden biri, LLVM/GCC desteği olmayan ama C desteği bulunan eski veya sıra dışı donanımlarda Rust kullanımını mümkün kılmak
- Bir proje Rust’tan C’ye taşındığında ya da bir C projesinin Rust alternatifi geliştirildiğinde, bu tür hedef desteği eksikliği Rust’ın zayıf yanı olarak gösterilebiliyor
cilly,rustcile C derleyicisini sarıyor ve Rust kodunu anlık olarak C’ye dönüştürüyor- Kullanıcı açısından bu, belirli bir hedefte kullanılacak C derleyicisini tanımlamaya yakın bir deneyim sunuyor
- Örnek yapılandırmada
sdcc_z180-unknown-noneüçlüsü ile/usr/bin/sdcc,-mz180,--std-c89,-cargümanları kullanılıyor
Ağ şeffaflığı ve uzak C derleyicisi
cilly, ağ şeffaflığı sunuyor ve TCP üzerinden C derleyicisiyle haberleşebiliyor- Gerekirse UART gibi daha sıra dışı iletişim yöntemlerine de genişletilebiliyor
- Bu yaklaşım, C çapraz derleyicisi bulunmayan platformlardaki bootstrap paradoksunu çözmek için düşünülmüş
- Hedef işletim sisteminde küçük bir C sunucusu derlenip çalıştırılabiliyor; ardından Linux gibi genel amaçlı bir platformda
rustcçalıştırılırkencillyağ üzerinden iletişim kurabiliyor - Yazar, Arm64 Linux üzerinde
rustcçalıştırırken x86 Plan 9 VM için küçük bir Rust programını başarıyla derlediğini söylüyor- Plan 9 ortam çıktısı
gnot osversion 2000 cputype 386 /tmp/hello_plan9çalıştırma sonucuHello, world!nmçıktısındarust_begin_unwindsembolü görünüyor
- Plan 9 ortam çıktısı
makefile üretme özelliği
cilly, isteğe bağlı olarak nesne dosyalarının içine işaretçiler ekleyebiliyor ve IR’yi bir önbellek dizinine kaydedebiliyor- Daha sonra bu işaretçileri okuyarak fonksiyonları ve globalleri tanımlandıkları konuma göre ayırabiliyor
- Bu bilgiye dayanarak makefile içeren bir dizin oluşturuyor; böylece yalnızca C derleyicisi ve
makeile Rust derlenebiliyor
Derleme ve çalıştırma koşulları
- Demo derlemesinde kullanılan sistem, Ubuntu tabanlı ARM64 Linux
- Kernel dizesi
Linux spark-2773 6.17.0-1021-nvidia ... aarch64
- Kernel dizesi
- Kullanılan C derleyicisi bilgisi GCC 13.3.0 ve Ubuntu LLD 18.1.3
- Derlemek için doğru LLVM kütüphanesi gerekiyor; en kolay yol ilgili nightly sürümünü
rustup install nightly-2026-06-16ile kurmak - Derleme komutu,
LLVM_LIB_DIRilelibLLVM.so.22.1-rust-1.98.0-nightlyyolunu belirleyipmake -j20çalıştırmak CFLAGSçalışıyor ancak bazı bayraklar derlemeyi yavaşlatabiliyor- Optimizasyon önerilmiyor
- Demo henüz ham durumda ve optimizasyon sorun çıkarabiliyor
- Bu ölçekte optimizasyon çok zaman alıyor
- Yazarın makinesinde optimizasyon olmadan birkaç dakika içinde derleniyor
- Ölçüm değerleri
937.98s user,123.77s system,1352% cpu,1:18.48 total
- Ölçüm değerleri
- Optimizasyon açıldığında kodun büyük kısmı hızlı geçse de bazı büyük Rust dosyalarında takılabiliyor
Testler ve bilinen sorunlar
- Derleme testi,
LD_LIBRARY_PATHiçinde nightly LLVM kütüphanesi ve./rustc_driverbelirtilip./rustc/rustc --versionçalıştırılarak yapılıyor - Genel programlar derlemek için
std’nin de derlenmesi gerekiyorstdyoksaerror[E0463]: can't find crate for stdhatası oluşuyor- Standart kütüphane derlemesi için
BUILDING_STD.mddosyasına bakmak gerekiyor
- Bilinen bir hata olarak, garip bir yol normalleştirme sorunu nedeniyle
crustc, derlendiği dizinde yani depo kökünde çalıştırıldığında çökebiliyor - Başka konumlarda normal çalışıyor
cilly’nin yayın durumu
cillyhenüz genel kullanıma hazır değil- Yazar, mümkün olan en kısa sürede yayımlamayı planladığını belirtiyor
- Gecikme nedenleri olarak iş, üniversite tezi ve el yaralanmasını gösteriyor
cillyaraç zincirinin tamamının henüz yayımlanmamış olmasının nedenlerinden biri de optimizasyonla ilgili hataların hâlâ takip ediliyor olması
1 yorum
Lobste.rs görüşleri
Geleneksel C
configurederleme zincirinin genel olarak böyle çalışması kulağa epey tuhaf geliyor, ama bu derleyicinin ya da transpiler'ın bu kalıbı izlemesi anlaşılır.“14. deneme: cilly” gerçekten etkileyici bir inat örneği; insanın böyle bir azme özenesi geliyor.
Ölçeği 4,6 milyon satır; yani bu projeden neredeyse tam olarak bir büyüklük mertebesi daha küçük. Üretilen C kodu hedefe göre değişiyor, ama derleyiciye göre değişmiyor.
Zig'in avantajları arasında çeşitli çapraz derleme hedefleri desteği, kendi kendini barındıran bir toolchain ve LLVM'e isteğe bağlı bağımlılık var; bu yüzden Rust'ın nadir platformlar için C'ye derlenebilmesi vaadi, sanki Zig tarafına yönelik bir mesaj gibi görünüyor.
crustckullanmak bunu sağlamıyor. Çünkü dönüştürülmüş derleyici de orijinal derleyiciyle aynı derleme hedeflerini destekliyor.Ama başka Rust projelerini C'ye dönüştürüp yalnızca C destekleyen hedeflerde çalıştırmak ve derlemek mümkün.
Yine de bunun etkisini abartmamak gerek. Bu, oldukça niş bir sorun için biraz zahmetli bir çözüme daha yakın.
rustczaten geniş hedef desteğine sahip vegccbackend'i üzerinden bu destek daha da artacak.Zig'in çapraz derleme araçları etkileyici, ama özellikle Zig veya Rust'tan daha zahmetli olan C tarafında kullanım kolaylığı sağlamaya daha çok odaklanıyor; daha fazla hedef desteklemesi kısmı ise görece daha önemsiz.
Sonuçta Zig ve Rust'ın hedef desteği zaten oldukça benzer, bu yüzden belirleyici bir etken olması zor; iki dil arasında bundan çok daha önemli farklar var.
crustc, Rust'ı C'ye dönüştürencillytoolchain'inin neler yapabildiğini gösteren sadece bir örnek.cillytoolchain'inin tamamı, kullanıcının Rust kodunu rastgele herhangi bir hedef için C'ye derliyor. Bu depo muhtemelen en gösterişli demo olduğu için, derleyicinin kendisini derlediğini gösteriyor.rustcyi de C'ye dönüştürebiliyor.