Polonius Alpha lên Nightly: Trình kiểm tra mượn của Rust trở nên nhạy cảm với luồng
Nhóm Rust đã kích hoạt phiên bản tiếp theo của trình kiểm tra mượn, Polonius Alpha, trên nightly. Nó mang lại phân tích nhạy cảm với luồng, chấp nhận nhiều mã hơn NLL, với suy giảm hiệu suất chủ yếu là nhỏ. Ổn định hóa được nhắm mục tiêu trước cuối năm.

Trình kiểm tra mượn của Rust đang có bản nâng cấp lớn đầu tiên kể từ khi NLL thay thế trình kiểm tra dựa trên AST ban đầu. Nhóm đã kích hoạt Polonius Alpha trên nightly, một công thức mới mang lại phân tích nhạy cảm với luồng cho các mối quan hệ outlives của lifetime. Đây là đỉnh cao của công việc bắt đầu từ 2018, với cách tiếp cận mới được hình dung vào 2023 đòi hỏi tái cấu trúc tối thiểu của triển khai NLL hiện tại.
Polonius Alpha mở khóa điều gì
Sự khác biệt chính so với NLL là Polonius Alpha nhạy cảm với luồng: nó hiểu rằng một khoản mượn không tồn tại trong các nhánh nơi nó không được sử dụng. Phân tích của NLL không nhạy cảm với luồng, điều này khiến nó từ chối mã thực sự an toàn.
Ví dụ kinh điển là một hàm trả về tham chiếu có thể thay đổi từ một map, chèn giá trị mặc định nếu khóa bị thiếu:
fn get_mut_or_default<'r, K: Hash + Eq + Copy, V: Default>(
map: &'r mut HashMap<K, V>,
key: K,
) -> &'r mut V {
match map.get_mut(&key) {
Some(value) => value,
None => {
map.insert(key, V::default());
map.get_mut(&key).unwrap()
}
}
}Dưới NLL, nhánh Some(value) => value khiến trình kiểm tra mượn nghĩ rằng khoản mượn từ map.get_mut tồn tại cho toàn bộ hàm, mặc dù nó không tồn tại trong nhánh None. Polonius Alpha biết rõ hơn.
Không hoàn hảo, nhưng gần
Polonius Alpha không phải là siêu tập của triển khai Polonius ban đầu (chậm). Một số chương trình biên dịch dưới Polonius cũ vẫn không biên dịch với Alpha, và ngược lại. Nhóm thừa nhận điều này và gọi nó là "Alpha" vì lý do đó.
Hiệu suất là mối quan tâm chính. Polonius Alpha thực hiện công việc bằng hoặc nhiều hơn NLL, và nhóm đã theo dõi các suy giảm. Trong top 10.000 crate theo lượt tải, ít suy giảm đáng kể được tìm thấy, và trường hợp xấu nhất ngoài tập đó là chậm 2-3 lần trên các crate có nhiều khoản mượn. Nhóm coi điều này là chấp nhận được với sức mạnh bổ sung.
Từ chối và các bước tiếp theo
Nếu bạn đang dùng nightly và muốn tiếp tục với NLL, bạn có thể truyền -Zpolonius=off cho rustc, đặt RUSTFLAGS=-Zpolonius=off, hoặc sử dụng tệp .cargo/config.toml:
[target.x86_64-unknown-linux-gnu]
rustflags = ["-Zpolonius=off"]Nhóm đang yêu cầu phản hồi trên GitHub và Zulip để bắt bất kỳ sự không an toàn, suy giảm hiệu suất, hoặc vấn đề chẩn đoán trước khi ổn định hóa, được nhắm mục tiêu trước cuối năm. Sau đó, công việc tính năng tích cực trên Polonius sẽ tạm dừng, với trọng tâm chuyển sang tối ưu hóa và các ưu tiên khác.
Polonius Alpha nhạy cảm với luồng: nó biết khoản mượn không tồn tại trong nhánh None, vì vậy mã biên dịch. Phân tích của NLL không nhạy cảm với luồng, vì vậy nó từ chối.
| Trình kiểm tra | Nhạy cảm với luồng | Trạng thái | Ghi chú |
|---|---|---|---|
| AST borrowck | Không | Đã loại bỏ 2019 | Rất hạn chế, bị loại bỏ dần |
| NLL | Không | Ổn định từ 2019 | Mặc định hiện tại, không nhạy cảm với luồng |
| Polonius Alpha | Có | Nightly (2026) | Nhạy cảm với luồng, chấp nhận nhiều mã hơn, suy giảm nhỏ |
| Polonius cũ | Có | Chưa bao giờ ổn định | Chậm, không khả thi về hiệu suất |