Tin tức

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.

August 5, 2026· 3 min read
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

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.
Ban biên tập Manul X
Sự tiến hóa của trình kiểm tra mượn
So sánh nhanh
Trình kiểm traNhạy cảm với luồngTrạng tháiGhi chú
AST borrowckKhôngĐã loại bỏ 2019Rất hạn chế, bị loại bỏ dần
NLLKhôngỔn định từ 2019Mặc định hiện tại, không nhạy cảm với luồng
Polonius AlphaNightly (2026)Nhạy cảm với luồng, chấp nhận nhiều mã hơn, suy giảm nhỏ
Polonius cũChưa bao giờ ổn địnhChậm, không khả thi về hiệu suất