Shell phổ biến Fish đã đạt đến phiên bản 4.0.0, đánh dấu một cột mốc quan trọng với phần lõi được viết lại hoàn toàn bằng ngôn ngữ Rust. Ra mắt vào ngày 27 tháng 2 năm 2025, bản cập nhật lớn này là kết quả của gần hai năm phát triển với hơn 2.600 commit từ hơn 200 người đóng góp.
Việc Viết Lại Bằng Rust
Thay đổi đáng chú ý nhất trong Fish 4.0 là việc viết lại hoàn toàn phần lõi từ C++ sang Rust. Công việc quy mô lớn này liên quan đến việc thay đổi 1.155 tệp với hơn 110.000 dòng được thêm vào và gần 89.000 dòng bị xóa. Mặc dù quy mô thay đổi rất lớn, nhóm phát triển Fish đã nhấn mạnh rằng điều này sẽ không ảnh hưởng trực tiếp đến người dùng - một thành tựu đáng chú ý xét đến bản chất toàn diện của việc viết lại.
Tôi thấy điều này khá ấn tượng, họ đã viết lại toàn bộ phần lõi của Fish, nhưng mọi thứ vẫn hoạt động chính xác theo cách cũ (ngoại trừ một vài điểm nhỏ thay đổi không đáng kể mà họ đã liệt kê).
Mã nguồn được viết lại đã tăng từ khoảng 55.000 dòng C++ lên 75.000 dòng Rust. Theo các cuộc thảo luận trong cộng đồng, phần lớn sự gia tăng này có thể được quy cho cách định dạng của Rust, có xu hướng trải code trên nhiều dòng, cũng như việc bổ sung các tính năng mới. Một số người dùng đã lưu ý rằng phiên bản Rust biên dịch chậm hơn một chút và tạo ra tệp nhị phân lớn hơn - khoảng 4,3 MB so với 2,4 MB của phiên bản C++ trước đây.
So sánh Fish 4.0 với 3.x
Tính năng | Fish 4.0 | Fish 3.x |
---|---|---|
Ngôn ngữ cốt lõi | Rust | C++ |
Kích thước mã nguồn | ~75.000 dòng | ~55.000 dòng |
Kích thước tệp nhị phân | 4,3 MB | 2,4 MB |
Thời gian biên dịch (bản phát hành) | ~37 giây | ~23 giây |
Phụ thuộc | Rust 1.70+, trình biên dịch C | Trình biên dịch C++, trình biên dịch C |
Phụ thuộc ncurses | Không (yêu cầu terminfo) | Có |
Những thay đổi đáng chú ý trong Fish 4.0
- Hệ thống ký hiệu phím mới
- Các biến ở vị trí lệnh mở rộng thành từ khóa lệnh phụ hiện không được phép
- Tính năng qmark-noglob được bật theo mặc định (? không còn hoạt động như ký tự đại diện đơn)
- Bây giờ yêu cầu mã hóa bàn phím modifyOtherKeys của XTerm và giao thức bàn phím kitty
- Cấu hình web được viết lại bằng Alpine.js
Tại Sao Người Dùng Yêu Thích Fish
Fish đã trở nên phổ biến chủ yếu nhờ các tính năng trực quan hoạt động tốt ngay từ đầu. Các cuộc thảo luận trong cộng đồng nhấn mạnh rằng hệ thống tự động hoàn thành xuất sắc của shell là tính năng được đánh giá cao nhất, không yêu cầu cấu hình thủ công. Các khía cạnh được khen ngợi khác bao gồm hệ thống chủ đề/dấu nhắc hợp lý và quản lý plugin thông qua oh-my-fish.
Nhiều người dùng đề cập rằng họ tiếp tục sử dụng Fish cho shell tương tác trong khi vẫn viết script bằng Bash hoặc POSIX shell để đảm bảo tính di động. Cách tiếp cận kết hợp này cho phép họ tận dụng các tính năng thân thiện với người dùng của Fish trong khi vẫn duy trì khả năng tương thích với các hệ thống không cài đặt Fish.
Các Vấn Đề Tương Thích
Một điểm thường được nêu ra trong các cuộc thảo luận là đôi khi có sự không tương thích khi sao chép lệnh Bash vào Fish do sự khác biệt về cú pháp. Một số người dùng đã phát triển các giải pháp sáng tạo, chẳng hạn như các script tự động chuyển hướng lệnh Bash thông qua một phiên Bash liên tục khi được dán vào Fish.
Việc viết lại cũng dẫn đến một số thay đổi không tương thích ngược, bao gồm hệ thống ký hiệu phím mới, thay đổi cách xử lý biến trong vị trí lệnh, và bật tính năng qmark-noglob theo mặc định (có nghĩa là ? không còn hoạt động như một ký tự đại diện đơn). Ngoài ra, Fish giờ đây yêu cầu mã hóa bàn phím modifyOtherKeys của XTerm và các cải tiến tiến bộ của giao thức bàn phím kitty.
Dành Cho Nhà Phân Phối và Nhà Phát Triển
Việc chuyển sang Rust đồng nghĩa với những thay đổi đáng kể trong các phụ thuộc. Fish giờ đây yêu cầu Rust 1.70 trở lên, trong khi không còn cần trình biên dịch C++ (mặc dù trình biên dịch C vẫn cần thiết cho một số mã kết nối và kiểm thử). CMake vẫn là hệ thống build được khuyến nghị với phiên bản tối thiểu được hỗ trợ là 3.5.
Một thay đổi đáng chú ý khác là Fish không còn phụ thuộc vào thư viện ncurses, mặc dù nó vẫn sử dụng cơ sở dữ liệu terminfo. Các nhà đóng gói được khuyên nên thêm phụ thuộc vào gói chứa cơ sở dữ liệu terminfo của họ thay vì curses.
Cấu hình dựa trên Web cũng đã được viết lại để sử dụng Alpine.js, đại diện cho một nỗ lực hiện đại hóa khác bên cạnh việc viết lại phần lõi.
Khi Fish 4.0 được triển khai trên các trình quản lý gói và nền tảng khác nhau, nó đứng như một ví dụ ấn tượng về cách một dự án viết lại lớn có thể được hoàn thành trong khi vẫn duy trì trải nghiệm người dùng đã làm cho phần mềm trở nên phổ biến từ đầu. Đối với người dùng đang cân nhắc thử nghiệm Fish hoặc nâng cấp từ các phiên bản trước, quá trình chuyển đổi sẽ đặc biệt suôn sẻ bất chấp những thay đổi đáng kể bên dưới.