2 poin oleh GN⁺ 2023-11-27 | 1 komentar | Bagikan ke WhatsApp
  • 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

 
GN⁺ 2023-11-27
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

    • Sepertinya ini bukan dilakukan secara bertahap
      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...
    • Untuk skrip, saya masih cenderung menulis dengan Bash atau sekalian memakai Python/Perl, tetapi untuk penggunaan terminal, Fish jelas lebih baik
    • Sebagai contoh loop Bash yang mudah diingat, indeks yang bertambah bisa ditulis seperti for ((i = 0; i < 10; i++)); do echo $i; done
      Iterasi array bisa dilakukan dengan bentuk seperti foo[0]=a, foo[1]=b, lalu for i in ${foo[@]}; do echo $i; done
  • Motivasi penulisan ulangnya dijelaskan lebih rinci di sini
    https://github.com/fish-shell/fish-shell/pull/9512#issuecomm...

    • Tulisan maintainer-nya matang, logis, cukup lucu, dan tegas, sampai-sampai perasaan saya yang selama ini hanya berniat mencoba Fish berubah menjadi sepertinya saya melewatkan proyek yang hebat
    • Bahwa porting ke C++17 dianggap “terlalu merepotkan”, sementara menulis ulang semuanya dalam bahasa baru dianggap oke, mengatakan cukup banyak hal
      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-8

    • Mendukung beberapa compiler dalam satu codebase membuatnya lebih rumit
      sizeof(wchar_t) adalah 2 byte di MSVC sehingga UTF-16, sedangkan di gcc 4 byte sehingga UTF-32
  • Fish 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 Fish
    Saya tidak banyak memakai skrip bash, jadi sisi scripting kurang penting

    • Kalau zsh sudah dikonfigurasi sesuai keinginan, sepertinya tidak banyak keuntungan besar
      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
    • Alasan saya memilih Fish alih-alih zsh pada 2017 adalah karena fitur yang saya inginkan sudah termasuk secara default, dan terasa jauh lebih cepat
      Setelah itu, saya senang karena hampir tidak lagi menghabiskan waktu untuk pemeliharaan konfigurasi shell
    • Karena kecepatannya
      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
    • Saat pertama kali membuat file fish_prompt.fish di direktori yang benar, lalu menulis fungsi fish_prompt di dalamnya untuk mengeluarkan string ke standard output dan membuat prompt shell sendiri, saya hampir menghapus zsh
      Sulit kembali ke cara memasukkan segala macam hal ke $PS1 lalu 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/zsh
    • Saya pindah dari zsh ke Fish beberapa tahun lalu dan fiturnya hampir mirip, tetapi file konfigurasi Fish ukurannya sekitar 10% dari konfigurasi zsh
      Sebagian besar yang saya inginkan tersedia secara default, dan sekarang saya hanya memakai satu plugin, fzf.fish
  • Salah satu shell tercepat kemungkinan besar akan menjadi lebih cepat lagi
    Setelah pindah dari zsh ke Fish, produktivitas terminal saya meningkat banyak

    • Saya tidak akan bertaruh untuk itu
      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
    • Saya rasa perbedaan performa antara C++ dan Rust tidak sebesar itu
      Keduanya hampir seimbang, dan kemungkinan besar tidak ada pemenang yang jelas
    • Saya penasaran dalam alur kerja seperti apa performa shell menjadi bottleneck
      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
    • Rasanya kita tidak mengetik dan mengelola pekerjaan cukup cepat sampai perbedaan antara C, C++, Rust, atau bahasa lain menjadi berarti; saya penasaran apakah ada hal lain yang Fish berikan
  • Sudah menggunakan Fish selama 1 tahun
    Saya tidak suka bahwa Fish merusak kompatibilitas standar sampai beberapa skrip seperti gvm dan nvm tidak 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 bawaan
    Karena 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

    • Seperti yang dibahas dalam diskusi Rust awal, ada beberapa alasan untuk memindahkannya ke Rust
      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+Prezto menjadi 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 cukup

  • Saya 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

    • Fish bukan pengganti skrip bash/shell, melainkan dimaksudkan sebagai shell interaktif, jadi kepatuhan POSIX sebenarnya bukan masalah besar
      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
    • Skrip Bash/zsh cukup dijalankan dengan Bash/zsh: bash script.sh
      Saat 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?