- Dự án Git đã chính thức công bố rằng trong thời gian tới sẽ đưa Rust vào phần lõi, và từ Git 3.0, Rust sẽ trở thành yêu cầu bắt buộc để build
- Loạt bản vá lần này được triển khai với tính chất thử nghiệm ban đầu (test balloon) tương tự như việc từng đưa các tính năng C99 vào trước đây, với mục tiêu từng bước chuẩn bị hạ tầng cho việc áp dụng Rust
- Ở bước đầu, mô-đun varint.c gần như không có phụ thuộc được chuyển sang Rust để kiểm chứng khả năng tương tác C-Rust và công cụ build
- Hiện tại mới chỉ hỗ trợ build bằng Meson; trong tương lai dự kiến sẽ bổ sung hỗ trợ Makefile và trong CI sẽ thêm kiểm chứng build Rust cùng kiểm tra tính nhất quán định dạng dựa trên
cargo format
- Đây là một thay đổi quan trọng giúp cộng đồng Git và các nhà phân phối có thời gian thích nghi với yêu cầu mới về toolchain Rust, đồng thời về lâu dài nâng cao tính an toàn và khả năng mở rộng của mã nguồn
Bối cảnh đưa Rust vào
- Git đã xem xét sự tiến hóa về ngôn ngữ để phục vụ tính ổn định và khả năng bảo trì
- Việc đưa Rust vào mang ý nghĩa tăng cường an toàn bộ nhớ, tận dụng toolchain hiện đại và mở ra khả năng tối ưu hiệu năng
- Đồng thời, dự án cũng muốn xây dựng một codebase vững chắc hơn thông qua việc áp dụng ngôn ngữ hiện đại
- Mục tiêu là thông báo trước rằng đến thời điểm phát hành Git 3.0, Rust sẽ trở thành yêu cầu bắt buộc để hệ sinh thái có thời gian chuẩn bị
- Phạm vi áp dụng mã Rust sẽ được mở rộng theo từng giai đoạn, và về lâu dài một số chức năng cốt lõi cũng sẽ được tái triển khai bằng Rust
Loạt bản vá thử nghiệm
- varint.c được chọn làm mô-đun đầu tiên áp dụng Rust
- Rất đơn giản và không có phụ thuộc
- Có thể kiểm chứng interop C ↔ Rust
- Có thể thử nghiệm mà không ảnh hưởng đến toàn bộ chức năng của Git
- Tất cả các bài kiểm thử đều đã vượt qua với phiên bản varint.rs
Thay đổi trong hệ thống build
- Hiện tại, hỗ trợ Rust mới chỉ được thêm vào hệ thống build Meson
- Trong tương lai có kế hoạch bổ sung hỗ trợ Rust cho Makefile
- Công việc liên quan đến CI cũng cần được chuẩn bị
- Kiểm chứng build Rust và hoạt động thực tế
- Đảm bảo tính nhất quán về style mã bằng
cargo format
- Tự động hóa các tác vụ toolchain và bảo trì khác
Kế hoạch sắp tới
- Công việc lần này tập trung vào thử nghiệm quy trình áp dụng hơn là bản thân tính năng Rust
- Sau đó, nhiều chức năng nội bộ khác của Git, bao gồm mô-đun xdiff, có thể được viết lại bằng Rust
- Dự án dự kiến sẽ dần mở rộng phạm vi áp dụng Rust để toàn bộ hệ sinh thái thích nghi với môi trường build dựa trên Rust
Hàm ý
- Git đang chuẩn bị cho bước chuyển đổi ngôn ngữ quan trọng nhất trong lịch sử của mình
- Việc bắt buộc Rust có thể giúp đảm bảo tính an toàn, khả năng bảo trì và tiềm năng phát triển dài hạn
- Các nhà phân phối và nhà phát triển trong hệ sinh thái Git sẽ cần thiết lập môi trường phát triển Rust trong tương lai
1 bình luận
Ý kiến trên Hacker News
Liên kết thảo luận liên quan
Vì Rust cũng là một ngôn ngữ không có chuẩn chính thức, nên có nghi ngờ rằng theo thời gian các bản triển khai sẽ bị tụt hậu đáng kể, giống như Java trước đây
Git vốn đã có vẻ là một công cụ rất hoàn thiện, có lẽ chỉ cần bảo trì hay cải tiến dần dần, chứ không có vẻ cần lượng mã mới lớn đến mức phải đưa thêm một ngôn ngữ mới vào
Khác với Linux, nơi liên tục cần thêm driver mới, Git dường như không có lý do tương tự
Mong ai đó giải thích xem liệu mình có đang bỏ sót điều gì không
Có thể xem các thay đổi của Git trong RelNotes, hoặc xem dễ hơn tại chuyên mục Git trên blog GitHub
Riêng git-branchless có những tính năng như merge trong bộ nhớ được viết bằng Rust
Nếu muốn tìm nội dung liên quan đến Rust thì có thể tìm thêm trong mailing list đó
(Không trực tiếp đánh giá ủng hộ hay phản đối, chỉ nói rằng sẽ có người khác làm việc đó)
Hầu như không có ai muốn phát triển Git bằng C, trong khi những lập trình viên quan tâm đến việc viết lại bằng Rust lại rất hào hứng tham gia
Git có vẻ đã khá hoàn thiện nên lượng mã mới được thêm vào có lẽ cũng không nhiều
Rust phức tạp hơn C rất nhiều
Nếu thực sự cần tính năng hướng đối tượng thì chỉ cần dùng mức C++98 thôi cũng đã đơn giản và dễ hiểu hơn nhiều so với C++ hiện đại hay Rust
Rust không phải sẽ là bắt buộc cho các bản vá sau này, mà sẽ là yêu cầu bắt buộc trong hệ thống build
Nếu vẫn sai thì có thể sửa lại
Không rõ là cần để build chính hệ thống build, hay là cũng bắt buộc khi build ứng dụng
Đã đầu tư rất sâu vào Git và tạo ra nhiều dự án xung quanh nó, nên không muốn Git mất đi tính dễ hack
Trên thực tế Rust còn dễ học hơn C thông thường (đặc biệt là C dễ sinh lỗi), và chắc chắn dễ hơn việc làm quen với mã nguồn Git hay Linux
Theo GitHub thì C chiếm 50%, Shell 38%, Perl 4%, còn lại là TCL/Python v.v.
Perl/TCL mới là ngoại lệ hơn
Khi dự án lớn lên, có rất nhiều đoạn mã kiểu “vá chằng vá đụp” được thêm vào khắp nơi, và giờ là lúc cần cải thiện an toàn/hiệu năng cũng như dọn dẹp những đoạn mã kiểu đó
Rust được cho là phù hợp với việc này
Việc Git dùng một phần Rust cũng sẽ không cản trở tôi tự phát triển Git client hay server
Ghi chú phát hành của Debian cũng nêu rõ các vấn đề liên quan đến gói Rust/Go
Khi build gói Rust thường phải rebuild nhiều lần do vấn đề liên kết tĩnh, nên gây bất tiện trong thực tế sử dụng
Nếu phía Rust tiếp tục phớt lờ vấn đề ABI ổn định/thư viện chia sẻ vốn là yêu cầu bắt buộc của Linux OS, thì thậm chí có thể tạo ra nhiều lời phàn nàn hơn cả C
Với kiến trúc phần mềm quy mô lớn, cần thận trọng hơn
Có thể tìm từ khóa NonStop trong bài viết này để xem ví dụ
Ở RESF và những nơi tương tự, người ta nói rằng “nền tảng không hỗ trợ Rust”, nhưng thực tế phải là trình biên dịch Rust hỗ trợ thì mới chạy được thật sự
git có cảm giác đã ổn định ở dòng 2.x nên dường như không có lý do gì để phá vỡ tương thích
Có người thắc mắc liệu văn hóa phát triển gần đây có đang rời xa kiểu dùng toolchain như vậy không
Môi trường source control, build và chạy tách biệt nhau nên cần sao chép từ xa hay chạy từ xa, và trong quy tắc build cũng bắt buộc phải phát hiện nền tảng đích
Chỉ với cờ
--targetlà có thể build cho khoảng hơn 100 nền tảng mà hầu như không gặp vấn đề gì đáng kểVấn đề thực sự có lẽ là một số nhà phát triển Git vẫn khăng khăng bám vào các máy phát triển cũ/cố định của riêng họ
Cross-compile lúc nào cũng là công dân hạng hai, và ở các dự án bên ngoài thì người ta gần như chẳng kỳ vọng nó hoạt động đúng
Ngay cả các bản phân phối Linux đôi khi cũng để những thứ như Raspberry Pi phải build ngay trên phần cứng thật
Vì thế không ai thực sự nỗ lực hỗ trợ chuyện này cho đúng nghĩa
Linux đặc biệt nghiêm trọng vì cấu trúc glibc đã quá cũ, khiến việc nhắm tới một mức glibc tối thiểu trên mọi phần cứng trở nên khó khăn
Phần lớn dự án thậm chí còn không thử hỗ trợ cross-compile
Zig đang cố gắng cải thiện điều đó
Git là công cụ cốt lõi của dự án, nên thay đổi như vậy mang rủi ro lớn, và việc biến nó thành phụ thuộc bắt buộc chỉ trong thời gian ngắn như 6 tháng là quá mạo hiểm
Sự phức tạp này nhằm bắt được nhiều lỗi hơn ở thời điểm biên dịch, nhưng hệ quả là bản thân ngôn ngữ trở nên khá phức tạp
Vì điểm này nên không khuyến nghị áp dụng
Theo hiểu biết của người viết thì kernel cũng đã từ chối Rust vì lý do tương tự
Nếu đưa thêm vào một kernel vốn đã phức tạp cả hệ thống kiểu ở mức Haskell lẫn hệ thống macro kiểu Lisp thì độ phức tạp sẽ còn tăng hơn nữa
Việc lần theo mã Rust qua serde cũng khó
Trong khi đó Unmarshal của Go dễ lần theo hơn nhiều
Vì có thể đưa nhiều thông tin hơn vào trình biên dịch
Chưa từng gặp vấn đề lớn với Serde, ngược lại còn phải debug Unmarshal của Go nhiều hơn
Còn chuyện kernel từ chối Rust thì thực ra chỉ là xung đột giữa hai nhà phát triển về vị trí lưu header
Rust có rào cản nhập môn cao hơn C, nhưng khoảng cách giữa “Rust tối thiểu” và “Rust nhanh và an toàn” nhỏ hơn C rất nhiều
Thậm chí được xem quan trọng ngang với borrow checker
Result/xử lý lỗi, thì Rust khá dễ họcCú pháp cũng khá dễ chịu
Linux kernel thực tế không hề từ chối Rust