10 puan yazan GN⁺ 2024-12-29 | 3 yorum | WhatsApp'ta paylaş

#9512 - Rust ile Yeniden Yazmak

  • Fish kabuğu Rust ile yeniden yazıldı. Artık hiç C++ kodu yok ve neredeyse %100 saf Rust'tan oluşuyor.
  • Yaklaşık 2 yıl önce Fish'i C++'tan Rust'a dönüştüren PR (#9512) açıldı.
  • Fish daha önce de C'den C++'a geçiş yaşamıştı, ancak Rust'a geçiş çok daha büyük bir projeydi.

C++'taki sorunlar

  • Araçlar ve derleyici farkları: C++ araçları iyi değil ve modern C++ standartlarını benimsemek paketleyiciler ve katkıda bulunanlar için karmaşıklık yaratıyor.
  • Thread güvenliği: Fish'in dahili komut yürütmesi şu anda seri olarak yapılıyor; asenkron prompt veya engellemeyen tamamlama özellikleri eklemek için paralel işleme gerekiyor.
  • Dilin karmaşıklığı: C++'ın header dosyaları, template'leri ve string işleme yaklaşımı karmaşık ve güvenli değil.
  • Topluluk: C++ çok sayıda katkıda bulunan kişiyi çekemiyor.
  • Bağımlılık sorunları: Belirli C kütüphanelerinin (curses) kararsızlığı ve build sorunları nedeniyle uğraştırıcı durumlar yaşandı.

Neden Rust seçildi

  • Eğlence ve ilgi çekicilik: Fish bir hobi projesi olduğu için eğlenceli ve ilgi çekici bir dile ihtiyaç duyuyor. Rust, katkıda bulunanlar için daha çekici.
  • Harika araçlar: rustup ile derleyiciyi kolayca kurmak mümkün ve hata mesajları net.
  • Ergonomi: Açık bir use sistemi ile Option ve Result gibi güvenli özellikler sunuyor.
  • İyi dil tasarımı: Rust'ın pointer ve option sistemi C++'tan çok daha güvenli.
  • Paralel işleme desteği: Rust'ın Send ve Sync yapıları güvenli paralel işlemeyi mümkün kılıyor.
  • Bağımlılık yönetimi: YAML, JSON gibi harici format destekleri kolayca eklenebiliyor.

Platform desteği

  • Başlıca platformların çoğu (macOS, Linux, BSD vb.) destekleniyor; Windows için yerel destek hedeflenmiyor.
  • Fish, UNIX merkezli bir shell; Windows ortamından çok UNIX API'leri ve scripting dillerine odaklanıyor.

Port etme süreci

  • Fish, "Theseus'un balığı" yaklaşımıyla C++'tan Rust'a kademeli olarak geçirildi. Bileşenler tek tek Rust'a taşındı ve C++ ile Rust'ın birlikte var olacağı şekilde yapılandırıldı.
    • Theseus'un Gemisi (Ship of Theseus): “Bir geminin tüm tahta plakaları yenileriyle değiştirilirse, o hâlâ aynı gemi midir?”
  • FFI kullanımı: autocxx kullanılarak C++ ile Rust arasında binding'ler oluşturuldu ve her seferinde bir bileşen port edildi.
  • Büyük ölçekli port: Bazı bölümler (ör. I/O işleme) tek başına taşınarak karmaşık FFI kodu azaltıldı.
  • Araç iyileştirmeleri: Port sürecinde Rust ile C++ arasındaki birlikte çalışabilirlik sorunlarını çözmek için autocxx özelleştirildi.

Zaman çizelgesi

  • Ocak 2023: İlk PR açıldı
  • Ocak 2024: C++ kodu tamamen kaldırıldı
  • Aralık 2024: Fish 4.0 beta sürümü yayımlandı

Rust ile sürtüşme noktaları

  • Taşınabilirlik sorunları: Rust'ın #[cfg(...)] yaklaşımı, sistem farklarını düşük seviyede ele almak için verimsiz.
  • Yerelleştirme: Rust'ın format string'leri derleme zamanında doğrulanıyor ama çevrilebilir değil.
  • Build süresi: LTO ve varsayılan release build kullanımı nedeniyle build süresi uzayabiliyor.
  • Port sürecinde birkaç hata yapıldı, ancak çoğu kolayca çözüldü.

Başlıca kazanımlar

  • curses'in kaldırılması: terminfo veritabanı bir Rust crate'i ile değiştirilerek global durum ve build sorunları çözüldü.
  • Tek yürütülebilir dosya: Tüm bağımlılıkları içeren bir Fish binary'si üretmek mümkün.
    • Bu sayede Fish paketi kendi kendine kurulabilir hâle geliyor ve kullanıcıların kullanması kolaylaşıyor.
  • Performans iyileştirmeleri: Bellek kullanımı optimize edildi ve yeni özellik eklemek kolaylaştı.

Sınırlamalar

  • CMake tamamen kaldırılamadı
  • Cygwin desteği sonlandırıldı: Çünkü Rust target'ı yok
  • Windows'ta hâlâ yalnızca WSL üzerinden çalışabiliyor

Bugün ve gelecek

  • Fish 4.0 başarıyla port edildi ve performansı arttı.
  • Fish hâlâ bir UNIX shell'i ve Rust'a geçiş sayesinde yeni özellikler eklemek mümkün hâle geldi.
  • Artık tamamen Rust'a geçmiş bir kod tabanına sahip; bakım yapmak ve yeni özellik eklemek eskisine göre daha kolay. Rust'ın avantajlarından yararlanılarak yeni özellikler eklenebilecek.
  • Bu geçiş başarıyla tamamlandı ve hem katkıda bulunanlar hem de kullanıcılar üzerinde olumlu etki yarattı.

3 yorum

 
annyeong 2024-12-30

fish’in kullanılabilirliğini kıskanıyorum ama uyumluluk, performans gibi sorunlar yüzünden zsh’i mümkün olduğunca fish’e benzer şekilde ayarlayıp kullanıyorum. Değişen fish’in nasıl olduğunu görmek için heyecanlıyım 👀

 
GN⁺ 2024-12-29
Hacker News görüşleri
  • Fish ekibini tebrik ediyor ve projenin ayrıntılarını ilgi çekici buluyor; C++'tan Rust'a tamamen geçen en büyük proje olup olmadığını merak ediyor. Bunun diğer projeler için faydalı dersler içerebileceğini düşünüyor

    • Fish, C++ ve Rust hibrit bir program olarak yayımlanmadı. Bunun nedeni son test aşamasının tamamlanmamış olması
    • C++ işlevselliğinin Rust'a eklenmesinin motivasyonunu anlamayanlar var, ancak bunun iyi bir vaka incelemesi olabileceği belirtiliyor
    • Yeni Rust kodunun bir C++ kod tabanında yazılabilmesinin güzel olacağı yönünde bir görüş var
  • Rust'la ilgili başlıca şikayet sürüm algılama desteği. Özellik algılama; dağıtımlar, web tarayıcıları ve derleyiciler için daha iyi

    • Sürüm/isim algılama, Chrome ve IE'nin Mozilla gibi davranmasının ve Clang'in GCC gibi görünmesinin nedeni. Özellik algılama bu tür sorunlara yol açmıyor
  • Portun hedeflerinden biri CMake'i kaldırmaktı, ancak bu başarılamadı. Cargo derleme için harika, ama kurulum tarafında fazla basit kalıyor. Fish'in çok sayıda betiği ve dokümantasyonu var; bu da Cargo'nun kullanım senaryosuna uymuyor

    • Cargo'nun bu kullanım senaryolarına doğru genişlemesi yerine, bunun başka bir araç tarafından uygulanması tercih ediliyor
  • Birkaç yıl önce bash'ten zsh'ye geçtiğinde memnun kalmış, ancak yeni bir bilgisayarda fish'i deneyince zsh'nin hantal ve eski hissettirdiğini söylüyor. Fish'i birkaç hafta kullanmayı tavsiye ediyor

  • Cygwin desteğinin olmaması üzücü bulunuyor. Rust'ın Cygwin'i bir derleme hedefi olarak desteklemesi umuluyor

  • Fish ekibinin çabasına hayranlık duyuluyor ve projenin nasıl gelişeceği merakla bekleniyor

  • Dağıtım paketleyicilerinin Rust-fish'i Debian yönergelerine uygun şekilde paketlemesinin ne kadar kolay olacağı merak ediliyor

  • Fish ekibini tebrik ediyor ve en iyi shell'in daha da iyi hale geldiğini düşünüyor. Projenin sloganını "Finally, a shell for the 00s!" olarak güncellemeyi öneriyor

  • zsh'den Fish'e geçtikten sonra yapılandırmanın daha basit hale geldiğini, Fish'in beklendiği gibi çalıştığını ve tekrar değiştirmeyi düşünmediğini söylüyor

  • cfg! makrosu true/false olarak derlenir, bu yüzden if koruması içindeki kodun derlenebilmesi gerekir. my_feature olmadan derlenirse başarısız olabilir

  • Fish, otomatik tamamlama ve sözdizimi vurgulama için thread kullanıyor; ayrıca dile eşzamanlılık eklemeye yönelik uzun vadeli bir proje de var