#9512 - Rewrite It in Rust
- Shell Fish telah ditulis ulang dalam Rust. Tidak ada lagi kode C++ sama sekali, dan kini hampir 100% terdiri dari Rust murni
- Sekitar dua tahun lalu, PR (#9512) dibuka untuk memindahkan Fish dari C++ ke Rust
- Fish sebelumnya juga pernah berpindah dari C ke C++, tetapi transisi ke Rust merupakan proyek yang jauh lebih besar
Masalah di C++
- Perbedaan alat dan kompiler: Tooling C++ kurang baik, dan mengadopsi standar C++ terbaru menimbulkan kerumitan bagi para packager dan kontributor.
- Keamanan thread: Eksekusi perintah internal Fish saat ini dilakukan secara serial, dan untuk menambahkan prompt asinkron atau pelengkapan non-blocking, diperlukan pemrosesan paralel.
- Kompleksitas bahasa: Header file, template, dan pemrosesan string di C++ rumit dan kurang aman.
- Komunitas: C++ tidak banyak menarik kontributor.
- Masalah dependensi: Ada kerepotan akibat ketidakstabilan library C tertentu (
curses) dan masalah build
Alasan memilih Rust
- Seru dan menarik: Fish adalah proyek hobi, sehingga membutuhkan bahasa yang seru dan menarik. Rust lebih memikat bagi kontributor.
- Tooling yang hebat: Kompiler dapat dipasang dengan mudah melalui
rustup, dan pesan error-nya jelas
- Ergonomis: Menyediakan sistem
use yang eksplisit serta fitur aman seperti Option dan Result
- Desain bahasa yang baik: Sistem pointer dan opsi di Rust jauh lebih aman dibanding C++
- Dukungan pemrosesan paralel:
Send dan Sync di Rust memungkinkan pemrosesan paralel yang aman.
- Manajemen dependensi: Dukungan untuk format eksternal seperti YAML dan JSON dapat ditambahkan dengan mudah
Dukungan platform
- Sebagian besar platform utama seperti macOS, Linux, dan BSD didukung, dan dukungan native untuk Windows bukanlah target
- Fish adalah shell yang berfokus pada UNIX, sehingga lebih menitikberatkan pada API UNIX dan bahasa scripting daripada lingkungan Windows
Proses porting
- Fish beralih secara bertahap dari C++ ke Rust dengan pendekatan “ikan Theseus”. Komponen dipindahkan satu per satu ke Rust sambil mengatur agar C++ dan Rust dapat hidup berdampingan
- Kapal Theseus (Ship of Theseus): “Jika semua papan kayu dari sebuah kapal diganti dengan yang baru, apakah kapal itu masih kapal yang sama?”
- Memanfaatkan FFI: Menggunakan
autocxx untuk membuat binding antara C++ dan Rust, lalu mem-porting komponen satu per satu.
- Porting skala besar: Beberapa bagian tertentu (misalnya pemrosesan I/O) dipindahkan secara terpisah untuk mengurangi kode FFI yang kompleks
- Perbaikan tooling: Dalam proses porting,
autocxx dikustomisasi untuk menyelesaikan masalah interoperabilitas antara Rust dan C++
Linimasa
- Januari 2023: PR awal dibuka
- Januari 2024: Kode C++ dihapus sepenuhnya
- Desember 2024: Fish 4.0 versi beta dirilis
Gesekan dengan Rust
- Masalah portabilitas: Pendekatan
#[cfg(...)] di Rust tidak efisien untuk menangani perbedaan sistem pada level rendah
- Lokalisasi: String format Rust diperiksa saat waktu kompilasi, tetapi tidak dapat diterjemahkan
- Waktu build: Penggunaan LTO dan build rilis default dapat menyebabkan waktu build menjadi panjang
- Ada beberapa kesalahan selama proses porting, tetapi sebagian besar mudah diperbaiki.
Pencapaian utama
- Menghapus
curses: Database terminfo diganti dengan crate Rust untuk menyelesaikan masalah state global dan build
- File eksekusi tunggal: Kini dimungkinkan membuat biner Fish yang mencakup semua dependensi
- Paket Fish dapat dibuat menjadi self-installing sehingga pengguna bisa memakainya dengan mudah
- Peningkatan performa: Penggunaan memori dioptimalkan dan fitur baru lebih mudah ditambahkan
Keterbatasan
- Belum berhasil menghapus CMake sepenuhnya
- Dukungan Cygwin dihentikan: karena tidak ada target Rust
- Di Windows, masih hanya bisa dijalankan melalui WSL
Kondisi saat ini dan masa depan
- Fish 4.0 telah berhasil di-porting dan performanya meningkat.
- Fish tetap merupakan shell UNIX, dan transisi ke Rust memungkinkan penambahan fitur baru.
- Kini Fish memiliki codebase yang sepenuhnya berpindah ke Rust, sehingga pemeliharaan dan penambahan fitur menjadi lebih mudah dibanding sebelumnya. Keunggulan Rust dapat dimanfaatkan untuk menambahkan fitur baru
- Transisi kali ini berhasil diselesaikan dan berdampak positif bagi kontributor maupun pengguna
3 komentar
Saya iri dengan kemudahan penggunaan fish, tetapi karena masalah kompatibilitas, performa, dan sebagainya, saya mengatur zsh agar semirip mungkin dengan fish dan menggunakannya. Saya penasaran seperti apa fish yang sudah berubah ini 👀
Shell interaktif yang ramah - Fish
Komentar Hacker News
Mengucapkan selamat kepada tim Fish, dan detail proyeknya terasa menarik. Penasaran apakah ini proyek terbesar yang sepenuhnya beralih dari C++ ke Rust. Ini bisa menjadi pelajaran yang berguna bagi proyek lain
Keluhan utama tentang Rust adalah dukungan deteksi versi. Deteksi fitur lebih baik untuk distro, browser web, dan compiler
Salah satu tujuan porting ini adalah menghapus CMake, tetapi gagal. Cargo sangat bagus untuk build tetapi sederhana untuk instalasi. Fish memiliki banyak skrip dan dokumentasi sehingga tidak cocok dengan use case Cargo
Beberapa tahun lalu saat beralih dari bash ke zsh saya puas, tetapi ketika mencoba fish di komputer baru, zsh terasa merepotkan dan kuno. Disarankan mencoba fish selama beberapa minggu
Disayangkan tidak mendukung Cygwin. Diharapkan Rust mendukung Cygwin sebagai target build
Kagum dengan upaya tim Fish, dan menantikan bagaimana proyek ini akan berkembang
Penasaran seberapa mudah para packager distro memaketkan Rust-fish sesuai pedoman Debian
Mengucapkan selamat kepada tim Fish, dan berpendapat bahwa shell terbaik kini menjadi lebih baik. Mengusulkan untuk memperbarui tagline proyek menjadi "Finally, a shell for the 00s!"
Setelah beralih dari zsh ke Fish, konfigurasi menjadi lebih sederhana, dan karena Fish bekerja sesuai harapan, tidak terpikir untuk berganti lagi
Makro
cfg!dikompilasi menjadi true/false, jadi kode di dalam guardifharus bisa dikompilasi. Jika dikompilasi tanpamy_feature, ini bisa gagalFish menggunakan thread untuk autocompletion dan penyorotan sintaks, dan ada proyek jangka panjang untuk menambahkan konkurensi ke bahasa tersebut