Cộng đồng Rust đang sôi động về Subsecond, một thư viện hot-patching mới hứa hẹn cải thiện đáng kể chu kỳ phát triển. Khác với quy trình chỉnh sửa-biên dịch-chạy truyền thống có thể mất vài phút, công cụ này tuyên bố đạt được thời gian vá lỗi nhanh chỉ 130 mili giây trên bộ xử lý M4 của Apple.
Chỉ số hiệu suất:
- Thời gian compile-patch: 130ms (trên bộ xử lý Apple M4 )
- Thời gian build tăng dần: Dưới 500ms (với ThinLink )
- Mục tiêu: Chỉ dành cho chế độ phát triển (debug_assertions được kích hoạt)
Tuyên bố về hiệu suất thu hút sự quan tâm
Các video demo của tác giả cho thấy kết quả ấn tượng trên nhiều framework khác nhau. Tích hợp game engine Bevy, phát triển iOS, và thậm chí các ứng dụng full-stack với backend Axum đều thể hiện việc cập nhật mã nguồn gần như tức thì. Những cải thiện về tốc độ đã thu hút sự chú ý của các developer, đặc biệt là những người làm việc với các ứng dụng chạy lâu dài mà việc khởi động lại sẽ mất đi trạng thái có giá trị.
Hệ thống hoạt động bằng cách chặn giai đoạn linking của Rust và điều khiển compiler thủ công. Nó so sánh mã assembly giữa các lần biên dịch, xác định những thay đổi, và vá các symbol vào tiến trình đang chạy. Cách tiếp cận này hỗ trợ các nền tảng chính bao gồm macOS, Windows, Linux, iOS, Android, và WebAssembly.
Hỗ trợ Nền tảng:
- Android (arm64-v8a, armeabi-v7a)
- iOS (arm64, chỉ simulator - thiết bị không được hỗ trợ do code-signing)
- Linux (x86_64, aarch64)
- macOS (x86_64, aarch64)
- Windows (x86_64, arm64)
- WebAssembly (wasm32)
Yêu cầu sửa đổi mã nguồn gây ra phản ứng trái chiều
Hạn chế chính của thư viện đã gây ra tranh luận trong cộng đồng. Các developer phải bọc các function mà họ muốn hot-patch bằng subsecond::call()
, điều mà một số người thấy xâm phạm. Những người chỉ trích cho rằng yêu cầu này khiến công cụ kém hấp dẫn hơn so với các giải pháp trong các ngôn ngữ khác có thể sửa đổi bất kỳ function nào mà không cần chú thích đặc biệt.
Tuy nhiên, những người ủng hộ chỉ ra rằng việc tích hợp framework có thể ẩn đi sự phức tạp này. Các framework phổ biến như Dioxus và Bevy đã tích hợp hỗ trợ Subsecond vào hệ thống cốt lõi của họ, có nghĩa là người dùng cuối có thể sử dụng hot-patching mà không cần thiết lập thủ công.
Những thứ tôi cần hot reloading chỉ chiếm ít hơn 5% tổng codebase. Thường là những thứ tôi không thể debug được (ví dụ: API response). Vì vậy tôi phải liên tục biên dịch lại. Nếu tôi có thể có hot-reloading cho điều đó, đó là cải thiện 95% thời gian đối với tôi.
Thách thức kỹ thuật và mối quan ngại về an toàn
Hệ thống phải đối mặt với một số trở ngại kỹ thuật đã tạo ra thảo luận. Việc thay đổi layout của struct không được hỗ trợ, có nghĩa là các framework phải loại bỏ trạng thái cũ khi cấu trúc thay đổi. Cách tiếp cận này khác với các hệ thống hot-reloading phức tạp hơn như OTP của Erlang, có thể nâng cấp trạng thái nội bộ trong quá trình thay đổi mã.
Các biến thread-local tạo ra một thách thức khác. Hiện tại chúng được reset về giá trị ban đầu khi có patch mới, điều này có thể gây crash trong các thiết lập phức tạp. Các tác giả thừa nhận hạn chế này và có kế hoạch sửa chữa trong tương lai.
Thư viện chỉ hoạt động ở chế độ debug, đảm bảo không có overhead hiệu suất trong các bản build production. Lựa chọn thiết kế này củng cố rằng Subsecond nhắm đến quy trình phát triển hơn là các kịch bản hot-patching production.
Các hạn chế chính:
- Không hỗ trợ thay đổi bố cục struct (yêu cầu khởi tạo lại framework)
- Các biến thread-local được đặt lại về giá trị ban đầu khi vá
- Chỉ vá crate "tip" (vị trí main.rs)
- Hỗ trợ workspace hạn chế
- Không quan sát được các thay đổi của static initializer
Việc áp dụng framework và kế hoạch tương lai
Việc áp dụng sớm bởi các framework Rust lớn cho thấy công cụ này có thể được chấp nhận rộng rãi hơn bất chấp những hạn chế. Team Dioxus, người tạo ra Subsecond, đã tích hợp nó vào web framework của họ. Các developer Bevy đang khám phá việc tích hợp sử dụng hệ thống reflection của họ để xử lý struct hot-reloading một cách tinh tế hơn.
Kế hoạch cho các adapter đa mục đích cho các thư viện phổ biến như Axum, Ratatui, và Egui có thể mở rộng việc áp dụng. Các tác giả cũng đề cập đến khả năng tích hợp tự động ở mức thấp hơn, có thể nhắm đến các dependency phổ biến để giảm yêu cầu thiết lập thủ công.
Dự án đại diện cho một bước tiến đáng kể hướng tới chu kỳ phát triển Rust nhanh hơn, ngay cả khi nó yêu cầu một số điều chỉnh quy trình làm việc. Đối với các developer dành nhiều thời gian trong vòng lặp compile-test, những đánh đổi này có thể chứng minh là đáng giá.
Tham khảo: Crate subsecond