2 điểm bởi GN⁺ 2023-11-27 | 1 bình luận | Chia sẻ qua WhatsApp
  • Bản port sang Rust của fish-shell đã “gần như” hoàn tất; tùy cách tính, tiến độ được ghi nhận từ 60% theo tiêu chí loại bỏ SLOC C++ đến 74% theo tỷ lệ SLOC Rust so với SLOC C++
  • Phần việc lớn nhất còn lại là port reader và hệ thống nhập liệu; reader 3,5 nghìn dòng, screen handling 1,3 nghìn dòng, input 1 nghìn dòng và pager 700 dòng đang liên kết chặt chẽ với nhau
  • Toàn bộ mã C++ sẽ bị loại bỏ; dự án không phát hành bản Rust một phần ở giữa chừng, mà nhắm tới một bản phát hành như fish 4.0 chỉ gồm Rust và C++ bằng 0
  • Bản port Windows chưa từng được lên kế hoạch; việc chuyển sang Rust không phải là giải pháp cho vấn đề hỗ trợ Windows, và người dùng môi trường MSYS2/cygwin lo ngại việc Rust thiếu các target tương ứng có thể khiến họ không cập nhật được
  • Hiệu năng của bản port hoàn chỉnh vẫn chưa được xác định; kết quả ban đầu khá khả quan nhưng trong một số trường hợp cũng có thể chậm hơn khoảng 20%, và dự án cho rằng bản phát hành Rust đầu tiên cần có beta

Tình hình tiến độ port sang Rust

  • Việc viết lại fish-shell bằng Rust đã “gần như” hoàn tất
  • Tỷ lệ tiến độ thay đổi tùy theo tiêu chí đo
    • Theo tiêu chí loại bỏ SLOC C++ là 60%
    • Theo tỷ lệ SLOC Rust so với SLOC C++ là 74%
  • Một phần mã là scaffolding trùng lặp, có thể xóa khi caller cuối cùng biến mất
    • Ví dụ, wgetopt đã được dịch sang Rust, nhưng phiên bản C++ vẫn được giữ lại cho đến khi caller C++ cuối cùng được port
    • Cách này đơn giản hơn so với việc gắn mã chuyển đổi vào mọi caller C++
  • Sau khi caller cuối cùng biến mất, việc xóa mã trùng lặp sẽ kéo theo một số phần được dọn dẹp theo hiệu ứng domino

Những phần việc lớn còn lại

  • Thành phần lớn nhất còn lại là reader và hệ thống nhập liệu
  • Các phần mã liên quan liên kết rất chặt với nhau
    • reader: 3,5 nghìn dòng
    • screen handling: 1,3 nghìn dòng
    • input: 1 nghìn dòng
    • pager: 700 dòng
  • Sau đó vẫn còn một số mã còn sót lại và việc loại bỏ C++ khỏi hệ thống build
    • Gỡ bỏ cmake
    • Chuyển sang để cargo xử lý mọi tác vụ cần thiết
    • cargo cũng phải đảm nhiệm cả việc build và cài đặt tài liệu cùng các file completion
  • Việc build fish không chỉ là biên dịch mã Rust mà còn gồm nhiều artifact phụ trợ, nên đây không phải là một quá trình chuyển đổi đơn giản
  • Công việc này không phải kiểu phù hợp với “drive-by contribution”

Kế hoạch phát hành và luồng phiên bản

  • fish-shell dự định không phát hành bản Rust một phần
  • Ví dụ, fish 4.0 sẽ hoàn toàn chỉ gồm Rust và có 0 C++
  • Thông thường dự án đã dừng beta và release candidate, nhưng lần chuyển đổi này được đánh giá là thay đổi đáng để phát hành beta
    • Trước đây beta và release candidate bị dừng vì không nhận đủ kiểm thử
  • Dự án cũng muốn có một bản phát hành trung gian 3.7.0 dựa trên C++ trước khi chuyển sang phiên bản Rust
    • Nhằm tạo điểm xuất phát tốt hơn cho các nền tảng không xử lý được phiên bản Rust
    • 3.7.0 là dạng backport một số thay đổi lên 3.6.1
  • Công việc 3.7.0 đang diễn ra trên nhánh Integration_3.7.0
    • Cũng có CHANGELOG sơ bộ
    • Các thay đổi chính gồm timeout cho tổ hợp phím, cải thiện history-pager, sửa lỗi hiển thị, và glob nhanh hơn

Các file còn lại và phạm vi cụ thể

  • Tính đến ngày 1 tháng 12 năm 2023, danh sách file còn lại như sau
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
  • Danh sách này cho thấy phạm vi port C++ còn lại ở cấp độ file

Đính chính hiểu lầm và các ràng buộc

  • Toàn bộ mã C++ sẽ bị loại bỏ
  • Bản port Windows không được lên kế hoạch và trước đây cũng chưa từng được lên kế hoạch
    • C++ cũng được hỗ trợ tốt trên Windows, nên bản thân Rust không giải quyết vấn đề port sang Windows
    • Vấn đề của bản port Windows không nằm ở ngôn ngữ mà ở việc Windows không phải Unix
  • Tên và mascot sẽ không thay đổi
  • Nhiều khả năng dự án sẽ không thêm “written in Rust” vào tagline
    • fishshell.com có thể sẽ đề cập việc dự án được viết bằng Rust
    • Trong thảo luận bổ sung tháng 9 năm 2024, lập trường không đưa “written in rust” vào tagline đã được tái khẳng định
  • Hiệu năng của bản port hoàn chỉnh hiện vẫn chưa rõ
    • Kết quả ban đầu khá khả quan
    • Trong một số trường hợp cũng có thể chậm hơn khoảng 20%
    • Ngay cả khi bản port ban đầu hoàn tất, dự án vẫn chưa kết thúc và còn nhiều việc phải làm

Lo ngại của người dùng Windows và MSYS2/cygwin

  • Một người dùng cho biết họ đang dùng fish trong môi trường MSYS2, và giải thích rằng MSYS2 cung cấp các tiện ích POSIX nên fish hoạt động tốt
  • Vì Rust không cung cấp target cygwin hoặc MSYS2, họ lo ngại rằng sau khi viết lại bằng Rust, fish sẽ không thể được biên dịch cho target cygwin hoặc MSYS2
  • Người dùng này cho rằng việc chuyển sang Rust có thể khiến một số người dùng fish trên Windows không thể cập nhật
  • Mối lo này được nêu ra không phải để chỉ trích công việc hay ngôn ngữ, mà nhằm nhắc lại ràng buộc rằng Windows không phải Unix

1 bình luận

 
GN⁺ 2023-11-27
Ý kiến trên Hacker News
  • Nếu tôi hiểu đúng, điều đáng kinh ngạc là họ đang viết lại dần dần từ C++ sang Rust mà vẫn giữ hệ thống hoạt động đến tận cuối
    Tốc độ tiến triển cũng rất nhanh, và nếu bạn chưa dùng thử fish thì tôi khuyên nhất định nên thử. Đây là một shell có mặc định tốt nên dùng tiện ngay cả khi không tùy biến, và kể từ khi chuyển từ bash sang vài năm trước, tôi không còn nghĩ đến chuyện quay lại nữa
    Thêm nữa, bạn sẽ không phải lần nào cũng Google cú pháp vòng lặp for của bash, thứ vừa hiếm dùng vừa không trực quan

    • Có vẻ không phải làm theo kiểu dần dần
      Họ nói “không có kế hoạch phát hành bản có trộn một phần Rust”, và chẳng hạn fish 4.0 dự định sẽ được phát hành dưới dạng hoàn toàn Rust, 0% C++. Có vẻ họ cũng sẽ phát hành 3.7.0 chỉ dùng C++ ở giữa để làm điểm xuất phát tốt hơn cho các nền tảng không kham nổi phiên bản Rust
      https://github.com/fish-shell/fish-shell/discussions/10123#d...
    • Script thì tôi vẫn thường viết bằng Bash, hoặc đơn giản là lôi Python/Perl ra dùng, nhưng với việc dùng terminal thì rõ ràng Fish tốt hơn
    • Một ví dụ vòng lặp Bash dễ nhớ: chỉ số tăng có thể viết như for ((i = 0; i < 10; i++)); do echo $i; done
      Duyệt mảng thì có thể đặt foo[0]=a, foo[1]=b rồi dùng dạng for i in ${foo[@]}; do echo $i; done
  • Động cơ viết lại được trình bày chi tiết hơn ở đây
    https://github.com/fish-shell/fish-shell/pull/9512#issuecomm...

    • Bài viết của maintainer chín chắn, logic, có chút hài hước vừa đủ và cũng rất dứt khoát, khiến suy nghĩ của tôi từ trước đến nay chỉ là “có nên thử Fish không nhỉ” chuyển thành có lẽ mình đã bỏ lỡ một dự án tuyệt vời
    • Việc coi port sang C++17 là “quá phiền phức”, trong khi lại thấy ổn với chuyện viết lại toàn bộ bằng một ngôn ngữ mới, nói lên khá nhiều điều
      Rốt cuộc tôi nghĩ khó mà thắng được câu chuyện chạy theo những thứ mới mẻ, hào nhoáng trong toàn bộ giới phát triển. Dù vậy, tuy tôi không dùng Fish, tôi vẫn mong dự án thành công
  • Với tư cách là người dùng và thích Fish hằng ngày trên khoảng 4 hệ điều hành, tôi thật sự mong chờ lần viết lại này, và xét đến quy mô cũng như độ phức tạp của codebase thì tốc độ tiến triển thật đáng kinh ngạc
    Tôi nghĩ việc này cũng sẽ giúp nhiều người, bao gồm cả tôi, dễ đóng góp hơn. Điều ít được chú ý hơn nhưng tôi còn mong chờ hơn là kế hoạch trong tương lai chuyển fish sang dùng UTF-8 thay vì wchar_t. UCS2 và UTF-16 từng là vấn đề đau đầu trong phần mềm, còn Rust xử lý UTF-8 dễ hơn nhiều

    • Nếu muốn hỗ trợ nhiều compiler trong một codebase thì sẽ phức tạp hơn
      sizeof(wchar_t) trên MSVC là 2 byte nên là UTF-16, còn trên gcc là 4 byte nên là UTF-32
  • Fish là một shell bị đánh giá thấp
    Nó đưa ra những lựa chọn mạnh tay như từ bỏ tương thích POSIX, và kết quả là trở thành một shell rất tốt. Tôi đã dùng hơn 10 năm và đến giờ vẫn thích
    Viết script bằng Fish shell cũng rất tiện, cảm giác như một bash giàu tính công thái học hơn. Dự án nào cũng có khuyết điểm, nhưng nó chưa từng thực sự cản tôi làm việc mình định làm

  • Là người đang dùng zsh + spaceship, tôi tò mò nếu chuyển Fish thành shell chính thì sẽ có lợi ích gì
    Tôi không dùng nhiều script bash nên phần scripting ít quan trọng hơn

    • Nếu bạn đã cấu hình zsh đúng ý mình rồi thì có lẽ không có quá nhiều lợi ích lớn
      Điểm mạnh lớn của Fish là nó gần như là một shell lý tưởng ngay khi dùng, không cần cấu hình. Tự động hoàn thành hoạt động ngay, duyệt lịch sử dễ, hoàn thành lệnh dựa trên lịch sử cũng có, và việc chọn prompt chỉ đơn giản như mở trình duyệt. Nó có thể tùy biến sâu như zsh, nhưng chỉ với mặc định thôi cũng đã là một shell khá tốt
    • Lý do tôi chọn Fish thay vì zsh vào năm 2017 là vì những tính năng tôi muốn đã có sẵn theo mặc định, và cảm nhận là nhanh hơn nhiều
      Từ đó về sau, tôi gần như không còn phải tốn thời gian bảo trì cấu hình shell, điều đó rất tuyệt
    • Vì tốc độ
      Fish làm sẵn nhiều việc mà ở zsh cần plugin. Plugin zsh chậm đến mức khởi động shell mất hơn 3 giây, còn Fish thì ngay cả khi thêm plugin vẫn khởi động nhanh hơn nhiều
    • Lần đầu tiên tạo file fish_prompt.fish trong đúng thư mục, viết hàm fish_prompt bên trong để xuất chuỗi ra stdout và tự tạo shell prompt của mình, tôi suýt đã xóa zsh
      Rất khó quay lại kiểu nhét đủ thứ vào $PS1 rồi cầu mong nó chạy ổn. Tôi khuyên bạn nên thử dù chỉ vài ngày. Vì bạn sẽ thấy trong những điều mình từng xem là hiển nhiên, cái nào thực ra là tính năng riêng của từng shell. Tệ nhất thì bạn chỉ cần nói “không hợp gu mình” rồi quay lại shell yêu thích như bash/zsh
    • Tôi chuyển từ zsh sang Fish vài năm trước, tính năng thì gần như tương tự, nhưng file cấu hình Fish chỉ bằng khoảng 10% kích thước cấu hình zsh
      Hầu hết những gì tôi muốn đều có sẵn mặc định, và hiện giờ tôi chỉ dùng một plugin là fzf.fish
  • Một trong những shell nhanh nhất rất có khả năng sẽ còn nhanh hơn nữa
    Sau khi chuyển từ zsh sang Fish, năng suất trên terminal của tôi tăng lên nhiều

    • Tôi sẽ không đặt cược vào điều đó
      Theo liên kết, thực ra họ chưa biết hiệu năng của bản port hoàn chỉnh sẽ ra sao. Kết quả ban đầu đáng khích lệ, nhưng trong một số trường hợp hoàn toàn có khả năng chậm hơn khoảng 20%
    • Tôi nghĩ chênh lệch hiệu năng giữa C++ và Rust không lớn đến vậy
      Gần như ngang ngửa nhau, và nhiều khả năng sẽ không có bên thắng rõ ràng
    • Tôi tò mò hiệu năng shell trở thành nút thắt trong workflow nào
      Tôi thường nghĩ shell giống mã keo giao việc cho nơi khác hơn. Có thể là vấn đề hiệu quả của pipeline, hoặc do những người lập dị viết cả chương trình bằng bash, nhưng Fish đem lại nhiều cải thiện về chất lượng sống như vậy mà lại xem tốc độ là lợi thế cốt lõi thì hơi lạ
    • Chắc bạn không gõ và quản lý công việc nhanh đến mức khác biệt giữa C, C++, Rust hay các ngôn ngữ khác trở nên có ý nghĩa; tôi tò mò không biết Fish còn cung cấp gì thêm không
  • Đã dùng Fish được 1 năm
    Không thích việc nó phá vỡ tính tương thích tiêu chuẩn khiến một số script như gvm, nvm không chạy được, nhưng nó có sẵn toàn bộ các tính năng mà thường phải tự cấu hình trong zsh. Sau khi thử cấu hình zsh trên nhiều máy rồi bỏ cuộc, tôi đã chuyển hết sang Fish mặc định
    Nó đã hoạt động tốt rồi nên tôi không rõ port sang Rust thì được lợi gì. Nếu là vì bảo mật, tôi nghĩ có lẽ thứ gì đó có thể can thiệp Fish một cách độc hại đã nằm sẵn trên hệ thống rồi

    • Như trong thảo luận Rust ban đầu, có nhiều lý do để chuyển sang Rust
      Chủ yếu là thu hút contributor và thêm chế độ bất đồng bộ/song song mà các maintainer có thể yên tâm hơn
      [1] https://github.com/fish-shell/fish-shell/pull/9512
  • Fish rất ổn
    Tôi đã chuyển từ ZSH+Prezto sang chỉ dùng Fish, không thấy thiếu gì và nhanh hơn nhiều. Trên server thì tất cả đều có bash và tôi vẫn dùng bash script, nhưng với công việc terminal hằng ngày thì Fish là đủ

  • Tôi luôn tò mò về Fish nhưng ngại vì nó không tương thích POSIX
    Không biết có ai có thể chia sẻ các vấn đề đã gặp ở điểm này và cách workaround không

    • Fish không phải để thay thế bash/shell script mà là để dùng như shell tương tác, nên việc có tuân thủ POSIX hay không thực ra không phải vấn đề lớn
      Nhược điểm là cần chuyển ngữ cảnh một chút. Đặc biệt nếu cả đời bạn đã dùng bash/zsh thì có thể càng như vậy. Cá nhân tôi thấy dễ phân biệt khi nào dùng shell như giao diện người dùng và khi nào dùng bash/sh như interpreter, nhưng điều đó có thể không trực quan với tất cả mọi người
      Ngoài ra, sau khi không còn dùng shell tương thích POSIX làm shell hằng ngày, tôi có xu hướng nhanh chóng nâng các script mà trước đây có lẽ sẽ giải quyết bằng bash lên thành ngôn ngữ đa dụng hơn
    • Script Bash/zsh thì cứ chạy bằng Bash/zsh là được: bash script.sh
      Lúc mới dùng Fish, tôi cũng vướng chuyện không tương thích POSIX, nhưng sau khi học một chút cú pháp khác và vượt qua, tôi thấy cú pháp sane hơn của Fish xứng đáng với công sức bỏ ra. Giờ tôi dùng terminal vui hơn nhiều
      Hơn nữa, 90% thời gian bạn không cần giữ tương thích POSIX, và hiện nay nhiều script hoặc extension cũng hỗ trợ Fish. Trong môi trường doanh nghiệp thì vẫn tiếp tục dùng Bash/zsh vốn là tiêu chuẩn
  • Tôi tò mò vì sao lại chuyển sang Rust
    Có phải codebase C++ đã trở nên khó kham không?