Async Rust từ lâu đã được ca ngợi là một bước tiến lớn, cho phép lập trình viên viết mã chạy đồng thời trên cả máy chủ lớn lẫn vi điều khiển nhỏ. Tuy nhiên, một bài phân tích kỹ thuật gần đây chỉ ra rằng async Rust thực chất vẫn ở trạng thái MVP (Minimum Viable Product), chưa đạt được lời hứa "zero-cost abstraction" (trừu tượng hóa không tốn chi phí).
Vấn đề bloat trong async Rust
Điểm yếu lớn nhất là kích thước binary. Trên các thiết bị nhúng (microcontroller), mỗi byte đều quý giá. Async Rust tạo ra rất nhiều mã thừa (bloat) so với code không async. Cụ thể, một hàm async đơn giản có thể tạo ra tới 360 dòng MIR (Mid-level Intermediate Representation), trong khi phiên bản không async chỉ cần 23 dòng. Bloat này tồn tại ở cả máy tính để bàn, nhưng ít ảnh hưởng hơn vì tài nguyên dồi dào.
Bên trong state machine của async Rust
Các kỹ sư tại Tweede Golf đã phân tích cấu trúc của một future async. Họ phát hiện ra rằng compiler tạo ra một state machine với nhiều trạng thái không cần thiết, bao gồm cả trạng thái Returned và Panicked. Những trạng thái này tồn tại vì lý do an toàn bộ nhớ, nhưng khiến binary phình to. Hiện tại, cộng đồng đã có một Pull Request (PR) để giải quyết vấn đề future chiếm quá nhiều bộ nhớ và phải sao chép nhiều, nhưng đó là vấn đề riêng, không phải bloat từ state machine.
Tại sao lập trình viên nên quan tâm?
Nếu bạn từng thấy binary Rust của mình phình to hơn dự kiến, có thể async Rust là thủ phạm. Bài toán này ảnh hưởng trực tiếp đến các startup làm phần mềm nhúng, IoT, hoặc các hệ thống real-time. Việc hiểu rõ bloat không chỉ giúp tối ưu code, mà còn định hướng cho công nghệ compiler tương lai. Các nhà phát triển tại Tweede Golf đã đề xuất một Project Goal để cải thiện trình biên dịch, hứa hẹn mang lại async Rust thực sự hiệu quả.






