- fish-shell’in Rust portu “büyük ölçüde” tamamlanmış durumda; hesaplama yöntemine göre ilerleme kaldırılan C++ SLOC bazında %60 ile Rust SLOC’un C++ SLOC’a oranı bazında %74 arasında görünüyor
- Kalan en büyük iş reader ve giriş sisteminin taşınması; reader 3,5 bin satır, screen handling 1,3 bin satır, input 1 bin satır ve pager 700 satır birbirine güçlü biçimde bağlı
- Tüm C++ kodları kaldırılacak; arada kısmi Rust sürümü yayımlanmadan, fish 4.0 gibi bir sürümün yalnızca Rust içermesi ve C++’ın sıfır olması hedefleniyor
- Windows portu hiç planlanmadı; Rust’a geçiş Windows desteği sorununa çözüm değil ve MSYS2/cygwin ortamı kullanıcıları, Rust’ta ilgili hedeflerin bulunmamasının güncellemeleri engelleyebileceğinden endişe ediyor
- Tamamlanmış portun performansı henüz kesinleşmedi; ilk sonuçlar cesaret verici olsa da bazı durumlarda yaklaşık %20 daha yavaş olma olasılığı var ve ilk Rust sürümü için beta gerektiği düşünülüyor
Rust portunun ilerleme durumu
- fish-shell’in Rust ile yeniden yazımı “büyük ölçüde” tamamlanmış durumda
- İlerleme oranı hangi ölçüte göre sayıldığına bağlı olarak değişiyor
- Kaldırılan C++ SLOC bazında %60
- Rust SLOC’un C++ SLOC’a oranı bazında %74
- Bazı kodlar, son çağırıcısı ortadan kalktığında kaldırılabilecek yinelenmiş scaffolding niteliğinde
- Örneğin
wgetopt zaten Rust’a çevrildi, ancak son C++ çağırıcısı taşınana kadar C++ sürümü tutuluyor
- Tüm C++ çağırıcılarına dönüştürme kodu eklemektense bu yöntem daha basit
- Son çağırıcı ortadan kalktıktan sonra yinelenmiş kod kaldırılınca domino etkisiyle temizlenen bölümler var
Hâlâ kalan büyük işler
- Geriye kalan en büyük bileşen reader ve giriş sistemi
- İlgili kodlar birbirine güçlü biçimde bağlı
- reader: 3,5 bin satır
- screen handling: 1,3 bin satır
- input: 1 bin satır
- pager: 700 satır
- Bunun ardından geriye kalan bazı kodlar ve derleme sisteminin C++’tan arındırılması kalıyor
cmake’in kaldırılması
- Gerekli tüm işleri
cargonun yapacağı yapıya geçiş
- Belgelerin ve completion dosyalarının derlenip kurulmasını da
cargo üstlenmeli
- fish derlemesi yalnızca Rust kodunu derlemekten ibaret değil; çeşitli yardımcı çıktıları da içerdiği için basit bir geçiş değil
- Bu çalışma “drive-by contribution” türü katkılar için uygun bir iş değil
Sürüm planı ve sürüm akışı
- fish-shell kısmi Rust sürümü yayımlamayı planlamıyor
- Örneğin fish 4.0 tamamen yalnızca Rust’tan oluşacak ve C++ sıfır olacak
- Genel olarak beta ve sürüm adayları durdurulmuştu, ancak bu geçiş beta yayımlamaya değecek bir değişiklik olarak görülüyor
- Daha önce beta ve sürüm adayları yeterince test edilmediği için durdurulmuştu
- Rust sürümüne geçmeden önce C++ tabanlı bir 3.7.0 ara sürümü de isteniyor
- Rust sürümünü işleyemeyen platformlar için daha iyi bir başlangıç noktası sağlamak amacıyla
- 3.7.0, 3.6.1’e bazı değişikliklerin backport edildiği bir sürüm
- 3.7.0 çalışması Integration_3.7.0 branch üzerinde yürütülüyor
- Geçici bir CHANGELOG da var
- Başlıca değişiklikler arasında tuş kombinasyonu timeout’u, history-pager iyileştirmeleri, rendering glitch düzeltmeleri ve daha hızlı glob yer alıyor
Kalan dosyalar ve somut kapsam
- 1 Aralık 2023 itibarıyla kalan dosyaların listesi şöyle
src/fish_indent_common.cpp
src/fish_indent.cpp
src/fish_key_reader.cpp
src/builtins/bind.cpp
src/builtins/commandline.cpp
src/fish_tests.cpp
src/pager.cpp
src/reader.cpp
- Bu liste, kalan C++ taşıma kapsamını dosya bazında gösteriyor
Yanlış anlamaların düzeltilmesi ve kısıtlar
- Tüm C++ kodları kaldırılacak
- Windows portu planlanmadı ve geçmişte de hiç planlanmış değildi
- C++ da Windows’ta iyi desteklendiğinden Rust’ın kendisi Windows portu sorununu çözmüyor
- Windows portunun sorunu dil değil, Windows’un Unix olmaması
- İsim ve maskot değiştirilmeyecek
- Tagline’a “written in Rust” eklenmeme olasılığı yüksek
- fishshell.com’da Rust ile yazıldığı belirtilebilir
- Eylül 2024’teki ek tartışmada tagline’a “written in rust” koymama tutumu yeniden teyit edildi
- Tamamlanmış portun performansı henüz bilinmiyor
- İlk sonuçlar cesaret verici
- Bazı durumlarda yaklaşık %20 daha yavaş olma olasılığı da var
- İlk port tamamlandığında bile proje bitmiş olmayacak; yapılacak çok iş kalacak
Windows ve MSYS2/cygwin kullanıcılarının endişeleri
- Bir kullanıcı MSYS2 ortamında fish kullandığını ve MSYS2’nin POSIX yardımcı araçları sağladığı için fish’in iyi çalıştığını açıklıyor
- Rust, cygwin veya MSYS2 hedefi sunmadığı için Rust ile yeniden yazımdan sonra fish’in cygwin ya da MSYS2 hedefi olarak derlenemeyeceğinden endişe ediyor
- Bu kullanıcı, Rust’a geçişin bazı Windows fish kullanıcılarının güncelleme almasını engelleyebileceğini düşünüyor
- Söz konusu endişe, çalışmayı ya da dili eleştirmekten ziyade Windows’un Unix olmadığı kısıtını hatırlatan bir nokta olarak sunuluyor
1 yorum
Hacker News yorumları
Doğru anladıysam, C++’tan Rust’a kademeli yeniden yazım yaparken sonuna kadar çalışır durumda kalmaları etkileyici
İlerleme hızı da çok yüksek; fish’i hâlâ denemediyseniz kesinlikle tavsiye ederim. Varsayılanları çok iyi olduğu için özelleştirme yapmadan da kullanımı rahat bir kabuk ve birkaç yıl önce bash’ten geçtikten sonra geri dönmeyi hiç düşünmedim
Bonus olarak, nadiren kullanılan ve pek sezgisel olmayan bash
fordöngüsü sözdizimini her seferinde Google’da aramak zorunda da kalmıyorsunuz“İçinde kısmen Rust bulunan bir sürüm yayımlamayı planlamıyoruz” diyorlar; örneğin fish 4.0’ı tamamen Rust, %0 C++ olarak çıkarmayı düşünüyorlar. Arada yalnızca C++ kullanan 3.7.0’ı da yayımlayıp, Rust sürümünü çalıştıramayan platformlar için daha iyi bir başlangıç noktası yapmayı planlıyor gibiler
https://github.com/fish-shell/fish-shell/discussions/10123#d...
for ((i = 0; i < 10; i++)); do echo $i; donekullanabilirsinizDizi üzerinde gezinmek için
foo[0]=a,foo[1]=btanımlayıp ardındanfor i in ${foo[@]}; do echo $i; donebiçiminde yazabilirsinizYeniden yazım motivasyonu daha ayrıntılı anlatılmış
https://github.com/fish-shell/fish-shell/pull/9512#issuecomm...
Sonuçta geliştirici dünyasının genelindeki yeni ve parlak şeylerin peşinden gitme eğilimini yenmek zor. Yine de Fish kullanmıyorum ama başarılı olmasını isterim
Fish’i yaklaşık 4 işletim sisteminde her gün kullanıp seven biri olarak, bu yeniden yazım beni gerçekten heyecanlandırıyor ve kod tabanının boyutu ile karmaşıklığı düşünülünce ilerleme hızı şaşırtıcı
Ben de dahil birçok kişinin katkı vermesini kolaylaştıracak gibi görünüyor. Daha az konuşulmuş ama benim için daha da heyecan verici olan şey, ileride fish’in
wchar_tyerine UTF-8 kullanacak olması. UCS2 ve UTF-16 yazılımlar için baş belasıydı; Rust ise UTF-8 ile çalışmayı çok daha kolaylaştırıyorMSVC’de
sizeof(wchar_t)2 bayt olduğu için UTF-16, gcc’de ise 4 bayt olduğu için UTF-32 oluyorFish, değeri yeterince bilinmeyen bir kabuk
POSIX uyumluluğundan vazgeçmek gibi güçlü tercihler yapıyor ama sonuçta çok iyi bir kabuk ortaya çıkıyor. 10 yıldan uzun süredir kullanıyorum ve hâlâ çok seviyorum
Fish kabuk betiklerini yazmak da çok rahat; ergonomik bir bash gibi hissettiriyor. Her projede kusurlar vardır ama benim yapmak istediğim şeyi gerçekten engellediği hiç olmadı
zsh + spaceshipkullanan biri olarak, Fish’e ana kabuk olarak geçmenin ne avantajı olacağını merak ediyorumBash betiklerini çok kullanmadığım için betik tarafı daha az önemli
Fish’in asıl gücü, hiç ayar yapmadan ideale yakın bir kabuk olması. Otomatik tamamlama anında çalışıyor, geçmişte gezinmek kolay, geçmiş tabanlı komut tamamlama var ve bir komut istemi seçmek tarayıcı açmak kadar basit. zsh gibi derinlemesine özelleştirilebiliyor ama varsayılan haliyle bile oldukça iyi bir kabuk
O zamandan beri kabuk ayarlarını bakımda tutmaya neredeyse hiç zaman harcamıyor olmam çok iyi oldu
Fish, zsh’de eklenti gerektiren birçok şeyi varsayılan olarak yapıyor. zsh eklentileri yavaştı ve kabuğun açılışı 3 saniyeyi aşıyordu; Fish ise eklenti ekleseniz bile çok daha hızlı başlıyor
fish_prompt.fishdosyasını oluşturup içinefish_promptişlevini yazarak standart çıktıya bir dizge basıp kabuk istemimi kendim yaptığımda neredeyse zsh’i silecektim$PS1içine bir şeyler tıkıştırıp çalışmasını umduğunuz yönteme geri dönmek zor oluyor. Birkaç günlüğüne bile olsa denemenizi öneririm. Böylece doğal kabul ettiğiniz şeylerden hangilerinin kabuğa özgü özellikler olduğunu görüyorsunuz. En kötü ihtimalle “bana göre değilmiş” deyip bash/zsh gibi sevdiğiniz kabuğa geri dönersinizİstediğim şeylerin çoğu zaten varsayılan olarak geliyor ve şu anda yalnızca
fzf.fisheklentisini kullanıyorumEn hızlı kabuklardan biri daha da hızlanabilir gibi görünüyor
zsh’den Fish’e geçtikten sonra terminal verimliliğim belirgin biçimde arttı
Bağlantıya göre tamamlanmış portun performansının nasıl olacağını henüz gerçekten bilmiyorlar. İlk sonuçlar umut verici ama bazı durumlarda yaklaşık %20 daha yavaş olma ihtimali de gayet var
Neredeyse başa baş giderler ve net bir kazanan olmayabilir
Ben onu genelde işi başka yerlere devreden bir yapıştırıcı kod gibi görürdüm. Boru hattı verimliliğiyle ilgili olabilir ya da bash ile baştan sona program yazan tuhaf tiplerden kaynaklanıyor olabilir ama Fish’in sunduğu yaşam kalitesi iyileştirmeleri bu kadar fazlayken hızın ana avantaj olarak öne çıkarılması bana biraz garip geliyor
Fish'i 1 yıldır kullanıyorum
gvm,nvmgibi bazı betiklerin çalışmamasına yol açacak şekilde standart uyumluluğunu bozmasını sevmiyorum, ama zsh'de normalde elle yapılandırdığınız özelliklerin hepsi içinde geliyor. Birden fazla makinede zsh ayarlarını tutturmaya çalışıp sonunda vazgeçtim ve her şeyi varsayılan Fish'e çevirdimZaten iyi çalışıyorken Rust'a port edilerek ne kazanılacağını pek bilmiyorum. Eğer mesele güvenlikse, Fish'i kötü niyetle kurcalayabilecek bir şey zaten sisteme sızmış değil midir diye düşünüyorum
Esas olarak katkıda bulunan bulma ve bakımcıların içi rahat edecek şekilde asenkron/paralel mod ekleyebilme tarafıyla ilgili
[1] https://github.com/fish-shell/fish-shell/pull/9512
Fish güzel
ZSH+Preztoyerine doğrudan Fish kullanmaya geçtim; hiçbir eksiğini hissetmiyorum ve çok daha hızlı. Sunucularda her yerde bash var ve bash betikleri de hâlâ kullanıyorum, ama günlük terminal işleri için Fish fazlasıyla yeterliFish'i hep merak ettim ama POSIX uyumsuzluğu yüzünden mesafeli durdum
Bu konuda yaşadığınız sorunları ve geçici çözümleri paylaşabilecek biri var mı diye merak ediyorum
Dezavantajı, biraz bağlam değişimi gerektirmesi. Özellikle hayat boyu bash/zsh kullandıysanız bu daha da belirgin olabilir. Kabuk bir kullanıcı arayüzü olarak kullanıldığında ve bash/sh bir yorumlayıcı olarak kullanıldığında bunu ayırmak bana kişisel olarak kolay geliyor, ama herkes için sezgisel olmayabilir
Ayrıca POSIX uyumlu bir kabuğu günlük kabuk olarak kullanmayı bıraktığımdan beri, eskiden bash ile çözeceğim betikleri daha hızlı şekilde genel amaçlı bir dile taşımaya başladım
bash script.shFish'i ilk kullanırken POSIX uyumsuzluğu beni de düşündürmüştü, ama farklı söz dizimini biraz öğrenip ona alıştıktan sonra Fish'in daha mantıklı söz diziminin harcanan çabaya değdiğini düşünüyorum. Artık terminal kullanmaktan çok daha fazla keyif alıyorum
Üstelik zamanın %90'ında POSIX uyumluluğunu korumak gerekmiyor ve bugün birçok betik ya da eklenti de Fish'i destekliyor. Kurumsal ortamlarda ise standart olan Bash/zsh kullanılmaya devam ediyor
Neden Rust'a geçirildiğini merak ediyorum
C++ kod tabanı yönetilmesi zor bir hâle mi geliyordu?
Kısaca; asıl meseleler string işleme, thread'ler ve CMake sorunları