- Port Rust untuk fish-shell sudah “sebagian besar” selesai, dan tergantung cara menghitungnya, progresnya tercatat dari 60% berdasarkan penghapusan C++ SLOC hingga 74% berdasarkan perbandingan Rust SLOC vs C++ SLOC
- Pekerjaan terbesar yang tersisa adalah mem-porting reader dan sistem input; reader 3.5k baris, screen handling 1.3k baris, input 1k baris, dan pager 700 baris saling terikat kuat
- Semua kode C++ akan dihapus; alih-alih merilis rilis Rust parsial di tengah jalan, targetnya adalah rilis seperti fish 4.0 yang hanya berisi Rust dan nol C++
- Port Windows tidak pernah direncanakan; transisi ke Rust bukan solusi untuk masalah dukungan Windows, dan pengguna lingkungan MSYS2/cygwin khawatir ketiadaan target Rust terkait dapat menghambat pembaruan
- Performa port yang sudah selesai masih belum pasti; hasil awal menjanjikan tetapi dalam beberapa kasus ada kemungkinan sekitar 20% lebih lambat, sehingga dinilai perlu ada beta untuk rilis Rust pertama
Status progres port Rust
- Penulisan ulang fish-shell ke Rust sudah “sebagian besar” selesai
- Tingkat progres berbeda tergantung metrik yang dipakai
- Berdasarkan penghapusan C++ SLOC: 60%
- Berdasarkan Rust SLOC vs C++ SLOC: 74%
- Sebagian kode adalah scaffolding duplikat yang bisa dihapus ketika pemanggil terakhirnya hilang
- Contohnya
wgetopt sudah diterjemahkan ke Rust, tetapi versi C++ tetap dipertahankan sampai pemanggil C++ terakhir di-port
- Cara ini lebih sederhana daripada menambahkan kode konversi ke semua pemanggil C++
- Setelah pemanggil terakhir hilang dan kode duplikat dihapus, ada bagian yang akan ikut rapi seperti efek domino
Pekerjaan besar yang masih tersisa
- Komponen sisa terbesar adalah reader dan sistem input
- Kode terkait saling terikat kuat
- reader: 3.5k baris
- screen handling: 1.3k baris
- input: 1k baris
- pager: 700 baris
- Setelah itu masih ada sebagian kode tersisa dan proses de-C++-isasi sistem build
- menghapus
cmake
- beralih agar
cargo menangani semua pekerjaan yang diperlukan
cargo juga harus menangani build dan instalasi dokumentasi serta file completion
- Build fish bukan sekadar mengompilasi kode Rust, tetapi juga mencakup berbagai artefak pendukung, jadi ini bukan transisi yang sederhana
- Pekerjaan ini bukan jenis tugas yang cocok untuk “drive-by contribution”
Rencana rilis dan alur versi
- fish-shell tidak berencana merilis rilis Rust parsial
- Misalnya, fish 4.0 akan sepenuhnya terdiri dari Rust saja, dengan C++ = 0
- Secara umum mereka sudah menghentikan beta dan release candidate, tetapi transisi kali ini dinilai cukup besar untuk layak mendapat beta
- Sebelumnya, beta dan release candidate dihentikan karena tidak mendapat pengujian yang memadai
- Sebelum beralih ke versi Rust, mereka juga menginginkan rilis perantara 3.7.0 berbasis C++
- Tujuannya sebagai titik awal yang lebih baik untuk platform yang tidak dapat menangani versi Rust
- 3.7.0 adalah bentuk 3.6.1 dengan sebagian perubahan yang di-backport
- Pengerjaan 3.7.0 berlangsung di branch Integration_3.7.0
- Tersedia juga CHANGELOG sementara
- Perubahan utama mencakup timeout kombinasi tombol, peningkatan history-pager, perbaikan glitch rendering, dan glob yang lebih cepat
File yang tersisa dan cakupan spesifik
- Per 1 Desember 2023, daftar file yang tersisa adalah sebagai berikut
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
- Daftar ini menunjukkan cakupan sisa porting C++ pada level file
Klarifikasi kesalahpahaman dan batasan
- Semua kode C++ akan dihapus
- Port Windows tidak direncanakan, dan memang tidak pernah direncanakan sebelumnya
- C++ juga didukung dengan baik di Windows, jadi Rust sendiri tidak menyelesaikan masalah port Windows
- Masalah port Windows bukan pada bahasanya, melainkan karena Windows bukan Unix
- Nama dan maskot tidak akan diubah
- Kemungkinan besar tagline tidak akan ditambah “written in Rust”
- fishshell.com mungkin akan menyebut bahwa proyek ini ditulis dalam Rust
- Dalam diskusi tambahan pada September 2024, sikap untuk tidak memasukkan “written in rust” ke tagline ditegaskan kembali
- Performa port yang selesai masih belum diketahui
- Hasil awal menjanjikan
- Dalam beberapa kasus ada kemungkinan sekitar 20% lebih lambat
- Bahkan setelah port awal selesai, proyek ini belum berakhir dan masih banyak pekerjaan tersisa
Kekhawatiran pengguna Windows dan MSYS2/cygwin
- Seorang pengguna menjelaskan bahwa ia memakai fish di lingkungan MSYS2, dan karena MSYS2 menyediakan utilitas POSIX, fish dapat berjalan dengan baik
- Karena Rust tidak menyediakan target cygwin atau MSYS2, ia khawatir setelah penulisan ulang ke Rust, fish tidak lagi bisa dikompilasi untuk target cygwin atau MSYS2
- Pengguna ini menilai transisi ke Rust dapat menghambat pembaruan bagi sebagian pengguna fish di Windows
- Kekhawatiran itu disampaikan bukan untuk menyalahkan pekerjaan atau bahasanya, melainkan sebagai pengingat akan batasan bahwa Windows bukan Unix
1 komentar
Pendapat di Hacker News
Kalau saya memahaminya dengan benar, yang mengejutkan adalah mereka melakukan penulisan ulang bertahap dari C++ ke Rust sambil tetap menjaga agar semuanya tetap berfungsi sampai akhir
Laju perkembangannya juga sangat cepat, dan kalau belum pernah mencoba fish, saya sangat menyarankannya. Ini shell yang nyaman dipakai tanpa kustomisasi karena default-nya bagus, dan sejak pindah dari bash beberapa tahun lalu, saya tidak terpikir untuk kembali
Bonusnya, saya tidak perlu lagi meng-google sintaks for loop bash yang jarang dipakai dan juga tidak intuitif setiap kali membutuhkannya
Mereka “tidak berencana merilis versi yang sebagian bercampur Rust”, dan misalnya fish 4.0 katanya akan dirilis sebagai sepenuhnya Rust, 0% C++. Tampaknya mereka juga akan merilis 3.7.0 yang hanya memakai C++ di antaranya, sebagai titik awal yang lebih baik untuk platform yang tidak sanggup menangani versi Rust
https://github.com/fish-shell/fish-shell/discussions/10123#d...
for ((i = 0; i < 10; i++)); do echo $i; doneIterasi array bisa dilakukan dengan bentuk seperti
foo[0]=a,foo[1]=b, lalufor i in ${foo[@]}; do echo $i; doneMotivasi penulisan ulangnya dijelaskan lebih rinci di sini
https://github.com/fish-shell/fish-shell/pull/9512#issuecomm...
Pada akhirnya, saya rasa sulit mengalahkan narasi mengejar hal baru yang mengilap di dunia pengembangan secara umum. Meski begitu, saya tidak memakai Fish, tetapi semoga sukses
Sebagai orang yang memakai Fish setiap hari di sekitar 4 sistem operasi dan menyukainya, penulisan ulang ini benar-benar membuat saya antusias, dan mengingat ukuran serta kompleksitas codebase-nya, laju perkembangannya mengejutkan
Saya rasa ini juga akan membuat banyak orang, termasuk saya, lebih mudah berkontribusi. Hal yang kurang mendapat perhatian tetapi lebih saya nantikan adalah rencana agar fish nantinya memakai UTF-8 alih-alih
wchar_t. UCS2 dan UTF-16 telah menjadi sumber masalah dalam software, dan Rust jauh lebih nyaman untuk menangani UTF-8sizeof(wchar_t)adalah 2 byte di MSVC sehingga UTF-16, sedangkan di gcc 4 byte sehingga UTF-32Fish adalah shell yang diremehkan
Ia mengambil pilihan kuat seperti mengorbankan kompatibilitas POSIX, dan hasilnya menjadi shell yang sangat bagus. Saya sudah memakainya lebih dari 10 tahun dan masih menyukainya
Scripting di shell Fish juga sangat nyaman, terasa seperti bash yang ergonomis. Setiap proyek pasti punya kekurangan, tetapi tidak pernah benar-benar menghalangi pekerjaan yang ingin saya lakukan
Sebagai pengguna
zsh + spaceship, saya penasaran apa keuntungan jika memindahkan shell utama ke FishSaya tidak banyak memakai skrip bash, jadi sisi scripting kurang penting
Kelebihan utama Fish adalah ia hampir menjadi shell ideal tanpa konfigurasi. Autocomplete langsung berjalan, pencarian riwayat mudah, penyelesaian perintah berbasis riwayat juga ada, dan memilih prompt semudah membuka browser. Ia bisa dikustomisasi mendalam seperti zsh, tetapi dengan default saja sudah menjadi shell yang cukup bagus
Setelah itu, saya senang karena hampir tidak lagi menghabiskan waktu untuk pemeliharaan konfigurasi shell
Fish menyediakan secara default banyak hal yang di zsh membutuhkan plugin. Plugin zsh lambat sehingga startup shell bisa lebih dari 3 detik, sedangkan Fish bahkan dengan plugin pun mulai jauh lebih cepat
fish_prompt.fishdi direktori yang benar, lalu menulis fungsifish_promptdi dalamnya untuk mengeluarkan string ke standard output dan membuat prompt shell sendiri, saya hampir menghapus zshSulit kembali ke cara memasukkan segala macam hal ke
$PS1lalu berharap semuanya berjalan baik. Saya sarankan coba beberapa hari saja. Karena dengan begitu Anda akan melihat mana dari hal-hal yang selama ini dianggap wajar ternyata merupakan fitur spesifik shell. Dalam kasus terburuk pun, Anda bisa bilang “bukan selera saya” lalu kembali ke shell favorit seperti bash/zshSebagian besar yang saya inginkan tersedia secara default, dan sekarang saya hanya memakai satu plugin,
fzf.fishSalah satu shell tercepat kemungkinan besar akan menjadi lebih cepat lagi
Setelah pindah dari zsh ke Fish, produktivitas terminal saya meningkat banyak
Menurut tautan tersebut, sebenarnya belum diketahui seperti apa performa port yang sudah selesai. Hasil awal memang menggembirakan, tetapi dalam beberapa kasus sangat mungkin menjadi sekitar 20% lebih lambat
Keduanya hampir seimbang, dan kemungkinan besar tidak ada pemenang yang jelas
Biasanya saya menganggapnya lebih seperti kode perekat yang meneruskan pekerjaan ke tempat lain. Mungkin ini soal efisiensi pipe, atau karena orang-orang nyentrik yang menulis seluruh program dengan bash, tetapi dengan banyaknya peningkatan kualitas hidup yang Fish tawarkan, agak aneh melihat kecepatan disebut sebagai keunggulan utama
Sudah menggunakan Fish selama 1 tahun
Saya tidak suka bahwa Fish merusak kompatibilitas standar sampai beberapa skrip seperti
gvmdannvmtidak bisa berjalan, tetapi semua fitur yang biasanya saya konfigurasi sendiri di zsh sudah tersedia. Setelah mencoba menyiapkan konfigurasi zsh di beberapa mesin lalu menyerah, saya mengganti semuanya ke Fish bawaanKarena sudah bekerja dengan baik, saya tidak begitu paham apa yang didapat dari mem-porting-nya ke Rust. Kalau alasannya keamanan, rasanya sesuatu yang bisa memodifikasi Fish secara jahat berarti sudah berada di sistem
Utamanya lebih ke menarik kontributor dan menambahkan mode asinkron/paralel yang bisa membuat para maintainer merasa aman
[1] https://github.com/fish-shell/fish-shell/pull/9512
Fish itu bagus
Saya beralih dari
ZSH+Preztomenjadi hanya memakai Fish, dan tidak ada yang terasa kurang, malah jauh lebih cepat. Di server semuanya tetap punya bash dan skrip bash juga masih saya pakai, tetapi untuk pekerjaan terminal sehari-hari, Fish sudah cukupSaya selalu penasaran dengan Fish, tetapi ragu karena tidak kompatibel dengan POSIX
Saya penasaran apakah ada yang bisa berbagi masalah yang dialami di bagian ini dan cara mengakalinya
Kekurangannya adalah perlu sedikit perpindahan konteks. Terutama jika sepanjang hidup memakai bash/zsh, ini bisa lebih terasa. Bagi saya pribadi, membedakan kapan shell dipakai sebagai antarmuka pengguna dan kapan bash/sh dipakai sebagai interpreter itu mudah, tetapi mungkin tidak intuitif bagi semua orang
Selain itu, setelah tidak lagi memakai shell kompatibel POSIX sebagai shell harian, skrip yang dulu mungkin saya selesaikan dengan bash jadi lebih cepat saya naikkan ke bahasa pemrograman umum
bash script.shSaat pertama memakai Fish, ketidakcocokan POSIX sempat mengganjal, tetapi setelah mempelajari sedikit sintaks yang berbeda dan melewatinya, menurut saya sintaks Fish yang lebih sane sepadan dengan usaha itu. Sekarang saya jauh lebih menikmati terminal
Lagi pula, 90% waktu kita tidak perlu menjaga kompatibilitas POSIX, dan sekarang banyak skrip atau ekstensi juga mendukung Fish. Di lingkungan perusahaan, tetap pakai Bash/zsh yang menjadi standar
Saya penasaran mengapa beralih ke Rust
Apakah codebase C++-nya mulai sulit ditangani?
Ringkasnya, inti masalahnya adalah pemrosesan string, threading, dan CMake