#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
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 👀
Dost canlısı etkileşimli kabuk - Fish
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
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
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
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üzdenifkoruması içindeki kodun derlenebilmesi gerekir.my_featureolmadan derlenirse başarısız olabilirFish, 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