1 puan yazan GN⁺ 3 시간 전 | 1 yorum | WhatsApp'ta paylaş
  • 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; GCC ve make ile 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; cilly araç 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 GCC ve make ile derlenebiliyor; derleme sonucu çalışan bir Rust derleyicisi oluyor
  • Çalıştırma örneğinde LLVM kütüphane yolu belirtildikten sonra ./rustc/rustc --version komutu çalıştırılıyor ve aynı rustc 1.98.0-nightly sürümü çıktılanıyor
  • Üretilen Rust derleyicisi kod derleyebiliyor, ayrıca core, alloc, std derleyebiliyor
  • 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ç zinciri cilly için bir demo/teaser
  • cilly araç 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_clr gibi açık denemeler ve çeşitli kapalı denemelerden sonra cilly’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_local desteği sunuyorsa derleniyor
  • 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 = 8 gibi assert’ler ekleniyor

Hedefe özgü C kodu ve ABI kısıtları

  • cilly’nin ürettiği C kodu derleyiciye özel
    • Arm64 için üretilmiş cilly C kodu riscv32 üzerinde doğrudan çalıştırılamaz
    • Ancak riscv32 için ayrı cilly C kodu üretilebilir
  • Bu depodaki rustc için üretilen C kodu, yazarın iş istasyonunun ISA’sı nedeniyle ARM64 Linux hedefli
  • cilly tarafından üretilen kod, genel olarak normal rustc tarafı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 sret nedeniyle 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 sret iş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

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, rustc ile 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, -c argü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ırken cilly ağ ü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 sonucu Hello, world!
    • nm çıktısında rust_begin_unwind sembolü görünüyor

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 make ile 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
  • 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-16 ile kurmak
  • Derleme komutu, LLVM_LIB_DIR ile libLLVM.so.22.1-rust-1.98.0-nightly yolunu belirleyip make -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
  • 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_PATH içinde nightly LLVM kütüphanesi ve ./rustc_driver belirtilip ./rustc/rustc --version çalıştırılarak yapılıyor
  • Genel programlar derlemek için std’nin de derlenmesi gerekiyor
    • std yoksa error[E0463]: can't find crate for std hatası oluşuyor
    • Standart kütüphane derlemesi için BUILDING_STD.md dosyası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

  • cilly henü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
  • cilly araç 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

 
GN⁺ 3 시간 전
Lobste.rs görüşleri
  • Verilen derleyici ve platformun neyi desteklediğini doğrulayan bir witness programı üretmesi ilginç.
    Geleneksel C configure derleme 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.
  • Karşılaştırma için, Zig derleyicisinin tamamını C'ye dönüştürülmüş bir sürümü var ve bu, kaynaktan derlemenin normal prosedürünün bir parçası.
    Ö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.
  • Sistem programcısı değilim ama bunun Rust ile Zig arasında hangisinin kullanılacağı kararını etkileyip etkilemeyeceğini merak ediyorum.
    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.
    • Sadece crustc kullanmak 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. rustc zaten geniş hedef desteğine sahip ve gcc backend'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.
  • Güzel ama sonuçta bu da LLVM'in yetenekleriyle sınırlı değil mi?
    • Neden öyle olsun, bilmiyorum. crustc, Rust'ı C'ye dönüştüren cilly toolchain'inin neler yapabildiğini gösteren sadece bir örnek.
      cilly toolchain'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.
  • mrustc(https://github.com/thepowersgang/mrustc)'ye de bakmaya değer. C++ ile yazılmış bir Rust derleyicisi; C'ye transpile edip ardından GCC'ye verdiği için rustcyi de C'ye dönüştürebiliyor.