10 poin oleh GN⁺ 2024-12-29 | 3 komentar | Bagikan ke WhatsApp

#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

 
annyeong 2024-12-30

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 👀

 
GN⁺ 2024-12-29
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

    • Fish tidak dirilis sebagai program hibrida C++ dan Rust. Itu karena tahap pengujian akhir belum selesai
    • Ada yang tidak memahami motivasi menambahkan fitur C++ ke Rust, tetapi ini bisa menjadi studi kasus yang baik
    • Ada pendapat bahwa akan bagus jika kode Rust baru bisa ditulis di codebase C++
  • Keluhan utama tentang Rust adalah dukungan deteksi versi. Deteksi fitur lebih baik untuk distro, browser web, dan compiler

    • Deteksi versi/nama adalah alasan Chrome dan IE berpura-pura menjadi Mozilla, dan Clang berpura-pura menjadi GCC. Deteksi fitur tidak menimbulkan masalah seperti ini
  • 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

    • Daripada Cargo diperluas untuk use case seperti ini, ada preferensi agar alat lain yang mengimplementasikannya
  • 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 guard if harus bisa dikompilasi. Jika dikompilasi tanpa my_feature, ini bisa gagal

  • Fish menggunakan thread untuk autocompletion dan penyorotan sintaks, dan ada proyek jangka panjang untuk menambahkan konkurensi ke bahasa tersebut