- 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
Ý 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
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...
for ((i = 0; i < 10; i++)); do echo $i; doneDuyệt mảng thì có thể đặt
foo[0]=a,foo[1]=brồi dùng dạngfor 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...
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ềusizeof(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-32Fish 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
Đ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
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
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
fish_prompt.fishtrong đúng thư mục, viết hàmfish_promptbên trong để xuất chuỗi ra stdout và tự tạo shell prompt của mình, tôi suýt đã xóa zshRất khó quay lại kiểu nhét đủ thứ vào
$PS1rồ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/zshHầ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.fishMộ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
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%
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 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ạ
Đã 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,nvmkhô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 địnhNó đã 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
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+Preztosang 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
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
bash script.shLú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?
Tóm lại, các vấn đề cốt lõi là xử lý chuỗi, threading và CMake