เบžเบฒเบชเบฒเบเบฒเบ™เบ‚เบฝเบ™เป‚เบ›เบฅเปเบเบฅเบกเบ—เบตเปˆเบกเบตเบˆเบธเบ”เบ›เบฐเบชเบปเบ‡เบ—เบปเปˆเบงเป„เบ› Rust 1.73, เบชเป‰เบฒเบ‡เบ•เบฑเป‰เบ‡เบ‚เบถเป‰เบ™เป‚เบ”เบเป‚เบ„เบ‡เบเบฒเบ™ Mozilla เปเบ•เปˆเปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเบžเบฒเบเปƒเบ•เป‰เบเบฒเบ™เบญเบธเบ›เบฐเบ–เปเบฒเบ‚เบญเบ‡เบญเบปเบ‡เบเบฒเบ™เป€เบญเบเบฐเบฅเบฒเบ”เบ—เบตเปˆเบšเปเปˆเบซเบงเบฑเบ‡เบœเบปเบ™เบเปเบฒเป„เบฅ Rust Foundation, เป„เบ”เป‰เบ–เบทเบเบ›เปˆเบญเบเบญเบญเบเบกเบฒ. เบžเบฒเบชเบฒเบ—เบตเปˆเป€เบ™เบฑเป‰เบ™เปƒเบชเปˆเบ„เบงเบฒเบกเบ›เบญเบ”เป„เบžเบ‚เบญเบ‡เบ„เบงเบฒเบกเบŠเบปเบ‡เบˆเปเบฒเปเบฅเบฐเบชเบฐเบซเบ™เบญเบ‡เบงเบดเบ—เบตเบเบฒเบ™เป€เบžเบทเปˆเบญเบšเบฑเบ™เบฅเบธเบ„เบงเบฒเบกเบ‚เบฐเบซเบ™เบฒเบ™เบ‚เบญเบ‡เบงเบฝเบเบชเบนเบ‡เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเบซเบผเบตเบเป€เบงเบฑเป‰เบ™เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เป€เบเบฑเบšเบ‚เบตเป‰เป€เบซเบเบทเป‰เบญเปเบฅเบฐเป€เบงเบฅเบฒเปเบฅเปˆเบ™ (runtime เบซเบผเบธเบ”เบฅเบปเบ‡เป€เบ›เบฑเบ™เบžเบทเป‰เบ™เบ–เบฒเบ™เป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™เปเบฅเบฐเบเบฒเบ™เบฎเบฑเบเบชเบฒเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™).

เบงเบดเบ—เบตเบเบฒเบ™เบˆเบฑเบ”เบเบฒเบ™เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบ‚เบญเบ‡ Rust เบŠเปˆเบงเบเบ›เบฐเบขเบฑเบ”เบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒเบˆเบฒเบเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆ manipulating pointers เปเบฅเบฐเบ›เป‰เบญเบ‡เบเบฑเบ™เบšเบฑเบ™เบซเบฒเบ—เบตเปˆเป€เบเบตเบ”เบ‚เบทเป‰เบ™เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบเบฒเบ™เบˆเบฑเบ”เบเบฒเบ™เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบฅเบฐเบ”เบฑเบšเบ•เปˆเปเบฒ, เป€เบŠเบฑเปˆเบ™: เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบžเบทเป‰เบ™เบ—เบตเปˆเบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบซเบผเบฑเบ‡เบˆเบฒเบเบ—เบตเปˆเบกเบฑเบ™เป„เบ”เป‰เบ–เบทเบเบ›เบปเบ”เบ›เปˆเบญเบ, dereferencing null pointers, buffer overruns, เปเบฅเบฐเบญเบทเปˆเบ™เป†. เป€เบžเบทเปˆเบญเปเบˆเบเบขเบฒเบเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”, เบชเบฐเบซเบ™เบญเบ‡เบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡เปเบฅเบฐเบเบฒเบ™เบ„เบธเป‰เบกเบ„เบญเบ‡เบเบฒเบ™เป€เบžเบดเปˆเบ‡เบžเบฒเบญเบฒเป„เบช, เป‚เบ„เบ‡เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเบœเบนเป‰เบˆเบฑเบ”เบเบฒเบ™เบŠเบธเบ”เบชเบดเบ™เบ„เป‰เบฒ. เบ„เบฑเบ‡เป€เบเบฑเบš crates.io เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบ›เบฑเบ™เป€เบˆเบปเป‰เบฒเบžเบฒเบšเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”.

เบ„เบงเบฒเบกเบ›เบญเบ”เป„เบžเบ‚เบญเบ‡เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเปเบกเปˆเบ™เบชเบฐเบซเบ™เบญเบ‡เปƒเบซเป‰เบขเบนเปˆเปƒเบ™ Rust เปƒเบ™เป€เบงเบฅเบฒเบฅเบงเบšเบฅเบงเบกเป‚เบ”เบเบœเปˆเบฒเบ™เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบเบฒเบ™เบญเป‰เบฒเบ‡เบญเบดเบ‡, เบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบกเบ„เบงเบฒเบกเป€เบ›เบฑเบ™เป€เบˆเบปเป‰เบฒเบ‚เบญเบ‡เบงเบฑเบ”เบ–เบธ, เบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบกเบญเบฒเบเบธเบ‚เบญเบ‡เบงเบฑเบ”เบ–เบธ (เบ‚เบญเบšเป€เบ‚เบ”), เปเบฅเบฐเบเบฒเบ™เบ›เบฐเป€เบกเบตเบ™เบ„เบงเบฒเบกเบ–เบทเบเบ•เป‰เบญเบ‡เบ‚เบญเบ‡เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบฅเบฐเบซเบฑเบ”. Rust เบเบฑเบ‡เบชเบฐเบซเบ™เบญเบ‡เบเบฒเบ™เบ›เป‰เบญเบ‡เบเบฑเบ™เบเบฒเบ™ overflows integer, เบฎเบฝเบเบฎเป‰เบญเบ‡เปƒเบซเป‰เบกเบตเบเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบšเบฑเบ‡เบ„เบฑเบšเบ‚เบญเบ‡เบ„เปˆเบฒเบ•เบปเบงเปเบ›เบเปˆเบญเบ™เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰, เบˆเบฑเบ”เบเบฒเบ™เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ—เบตเปˆเบ”เบตเบเบงเปˆเบฒเปƒเบ™เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™, เบ™เปเบฒเปƒเบŠเป‰เปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เบ‚เบญเบ‡เบเบฒเบ™เบญเป‰เบฒเบ‡เบญเบดเบ‡ immutable เปเบฅเบฐเบ•เบปเบงเปเบ›เป‚เบ”เบเบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™, เบชเบฐเบซเบ™เบญเบ‡เบเบฒเบ™เบžเบดเบกเบ„เบปเบ‡เบ—เบตเปˆเบ—เบตเปˆเป€เบ‚เบฑเป‰เบกเปเบ‚เบ‡เป€เบžเบทเปˆเบญเบซเบผเบธเบ”เบœเปˆเบญเบ™เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบขเปˆเบฒเบ‡เบกเบตเป€เบซเบ”เบœเบปเบ™.

เบ™เบฐเบงเบฑเบ”เบ•เบฐเบเปเบฒเบ•เบปเป‰เบ™เบ•เป:

  • ะŸะตั€ะตั€ะฐะฑะพั‚ะฐะฝะพ ะพั„ะพั€ะผะปะตะฝะธะต ัะพะพะฑั‰ะตะฝะธะน, ะฒั‹ะดะฐะฒะฐะตะผั‹ั… ะฟั€ะธะผะตะฝัะตะผั‹ะผ ะฟะพ ัƒะผะพะปั‡ะฐะฝะธัŽ ะพะฑั€ะฐะฑะพั‚ั‡ะธะบะพะผ ะฐะฒะฐั€ะธะนะฝะพะณะพ ะทะฐะฒะตั€ัˆะตะฝะธั ะฟั€ะพะณั€ะฐะผะผั‹ (panic). ะขะตะบัั‚, ัƒะบะฐะทะฐะฝะฝั‹ะน ะฒ ะผะฐะบั€ะพัะต ยซpanic!ยป ั‚ะตะฟะตั€ัŒ ะฟะพะบะฐะทั‹ะฒะฐะตั‚ัั ะฒ ะพั‚ะดะตะปัŒะฝะพะน ัั‚ั€ะพะบะต ะฑะตะท ะพะฑั€ะฐะผะปะตะฝะธั ะบะฐะฒั‹ั‡ะบะฐะผะธ, ั‡ั‚ะพ ัƒะฟั€ะพั‰ะฐะตั‚ ั‡ะธั‚ะฐะตะผะพัั‚ัŒ ัะพะพะฑั‰ะตะฝะธั ะธ ัƒัั‚ั€ะฐะฝัะตั‚ ะฟัƒั‚ะฐะฝะธั†ัƒ ะฟั€ะธ ะฝะฐะปะธั‡ะธะธ ะฒ ะฒะปะพะถะตะฝะฝั‹ั… ะบะฐะฒั‹ั‡ะตะบ ะธะปะธ ั€ะฐะทะดะตะปะตะฝะธั ะฝะฐ ะฝะตัะบะพะปัŒะบะพ ัั‚ั€ะพะบ. fn main() { let file = ยซferris.txtยป; panic!(ยซoh no! {file:?} not found!ยป); } ะ‘ั‹ะปะพ thread โ€˜mainโ€™ panicked at โ€˜oh no! ยซferris.txtยป not found!โ€™, src/main.rs:3:5 ะกั‚ะฐะปะพ thread โ€˜mainโ€™ panicked at src/main.rs:3:5: oh no! ยซferris.txtยป not found!

    ะขะฐะบะถะต ะฟะตั€ะตั€ะฐะฑะพั‚ะฐะฝ ะฒั‹ะฒะพะด ัะพะพะฑั‰ะตะฝะธะน, ะฟะพะบะฐะทั‹ะฒะฐะตะผั‹ั… ะฟั€ะธ ัั€ะฐะฑะฐั‚ั‹ะฒะฐะฝะธะธ ะผะฐะบั€ะพัะพะฒ ยซassert_eqยป ะธ ยซassert_neยป. fn main() { assert_eq!(ยซ๐Ÿฆ€ยป, ยซ๐ŸŸยป, ยซferris is not a fishยป); } ะ‘ั‹ะปะพ thread โ€˜mainโ€™ panicked at โ€˜assertion failed: `(left == right)` left: `ยป๐Ÿฆ€ยป`, right: `ยป๐ŸŸยป`: ferris is not a fishโ€™, src/main.rs:2:5 Cั‚ะฐะปะพ thread โ€˜mainโ€™ panicked at src/main.rs:2:5: assertion `left == right` failed: ferris is not a fish left: ยซ๐Ÿฆ€ยป right: ยซ๐ŸŸยป

  • ะ’ ัะพะพั‚ะฒะตั‚ัั‚ะฒะธะธ ั RFC 3184 ะดะพะฑะฐะฒะปะตะฝะฐ ะฒะพะทะผะพะถะฝะพัั‚ัŒ ะฟั€ัะผะพะน ะผะฐะฝะธะฟัƒะปัั†ะธะธ ะปะพะบะฐะปัŒะฝั‹ะผะธ ะดะปั ะฟะพั‚ะพะบะฐ (thread_local) ะบะปัŽั‡ะฐะผะธ ั…ั€ะฐะฝะธะปะธั‰ะฐ LocalKey<Cell<T>> ะธ LocalKey<RefCell<T>> ั‡ะตั€ะตะท ะธัะฟะพะปัŒะทะพะฒะฐะฝะธะต ะผะตั‚ะพะดะพะฒ get(), set(), take() ะธ replace(), ะฒะผะตัั‚ะพ ะธัะฟะพะปัŒะทะพะฒะฐะฝะธั ะทะฐะผั‹ะบะฐะฝะธั ยซwith(|inner| โ€ฆ)ยป, ั‡ั‚ะพ ะฟะพะทะฒะพะปัะตั‚ ะฝะต ะฒั‹ะฟะพะปะฝัั‚ัŒ ะดะพะฟะพะปะฝะธั‚ะตะปัŒะฝั‹ะน ะบะพะด ะธะฝะธั†ะธะฐะปะธะทะฐั†ะธะธ ะดะปั ะทะฝะฐั‡ะตะฝะธะน ะฟะพ ัƒะผะพะปั‡ะฐะฝะธัŽ, ัƒะบะฐะทะฐะฝะฝั‹ั… ะดะปั ะฝะพะฒั‹ั… ะฟะพั‚ะพะบะพะฒ ะฟั€ะธ ะฟะพะผะพั‰ะธ ะผะฐะบั€ะพัะฐ ยซthread_local!ยป. thread_local! { static THINGS: Cell<Vec<i32>> = Cell::new(Vec::new()); } fn f() { // ะฑั‹ะปะพ THINGS.with(|i| i.set(vec![1, 2, 3])); // ัั‚ะฐะปะพ THINGS.set(vec![1, 2, 3]); // โ€ฆ // ะฑั‹ะปะพ let v = THINGS.with(|i| i.take()); // ัั‚ะฐะปะพ let v: Vec<i32> = THINGS.take(); }
  • เบžเบฒเบเบชเปˆเบงเบ™เปƒเบซเบกเปˆเบ‚เบญเบ‡ API เป„เบ”เป‰เบ–เบทเบเบเป‰เบฒเบเป„เบ›เบขเบนเปˆเปƒเบ™เบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡เบ„เบงเบฒเบกเบซเบกเบฑเป‰เบ™เบ„เบปเบ‡, เบฅเบงเบกเบ—เบฑเบ‡เบงเบดเบ—เบตเบเบฒเบ™เปเบฅเบฐเบเบฒเบ™เบˆเบฑเบ”เบ•เบฑเป‰เบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”เบฅเบฑเบเบชเบฐเบ™เบฐเบ•เปˆเบฒเบ‡เป†เปเบกเปˆเบ™เบกเบตเบ„เบงเบฒเบกเบซเบกเบฑเป‰เบ™เบ„เบปเบ‡:
    • Unsigned {integer}::div_ceil
    • Unsigned {integer}::next_multiple_of
    • Unsigned {integer}::checked_next_multiple_of
    • std::ffi::FromBytesUntilNulError
    • std::os::unix::fs::chown
    • std::os::unix::fs::fchown
    • std::os::unix::fs::lfchown
    • LocalKey::<Cell<T>>::get
    • LocalKey::<Cell<T>>::set
    • LocalKey::<Cell<T>>::take
    • LocalKey::<Cell<T>>::replace
    • LocalKey::<RefCell<T>>::with_borrow
    • LocalKey::<RefCell<T>>::with_borrow_mut
    • LocalKey::<RefCell<T>>::set
    • LocalKey::<RefCell<T>>::take
    • LocalKey::<RefCell<T>>::replace
  • เบ„เบธเบ™เบฅเบฑเบเบชเบฐเบ™เบฐ "const", เป€เบŠเบดเปˆเบ‡เบเปเบฒเบ™เบปเบ”เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ‚เบญเบ‡เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบกเบฑเบ™เปƒเบ™เบชเบฐเบžเบฒเบšเบเบฒเบ™เปƒเบ”เบเปเปˆเบ•เบฒเบกเปเบ—เบ™เบ—เบตเปˆเบˆเบฐเป€เบ›เบฑเบ™เบ„เปˆเบฒเบ„เบปเบ‡เบ—เบตเปˆ, เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เปƒเบ™เบซเบ™เป‰เบฒเบ—เบตเปˆ:
    • rc::Weak::new
    • sync::Weak::new
    • NonNull::as_ref
  • ะ’ ะบะพะผะฟะธะปัั‚ะพั€ะต ะพะฑะตัะฟะตั‡ะตะฝะฐ ะทะฐะฟะธััŒ ะธะฝั„ะพั€ะผะฐั†ะธะธ ะพ ะฒะตั€ัะธะธ ะฒ ัะตะบั†ะธัŽ ยซ.commentยป ะฟะพ ะฐะฝะฐะปะพะณะธะธ ั GCC ะธ Clang.
  • ะ ะตะฐะปะธะทะพะฒะฐะฝ ั‚ั€ะตั‚ะธะน ัƒั€ะพะฒะตะฝัŒ ะฟะพะดะดะตั€ะถะบะธ ะดะปั ะฟะปะฐั‚ั„ะพั€ะผ aarch64-unknown-teeos, csky-unknown-linux-gnuabiv2, riscv64-linux-android, riscv64gc-unknown-hermit, x86_64-unikraft-linux-musl ะธ x86_64-unknown-linux-ohos. ะขั€ะตั‚ะธะน ัƒั€ะพะฒะตะฝัŒ ะฟะพะดั€ะฐะทัƒะผะตะฒะฐะตั‚ ะฑะฐะทะพะฒัƒัŽ ะฟะพะดะดะตั€ะถะบัƒ, ะฝะพ ะฑะตะท ะฐะฒั‚ะพะผะฐั‚ะธะทะธั€ะพะฒะฐะฝะฝะพะณะพ ั‚ะตัั‚ะธั€ะพะฒะฐะฝะธั, ะฟัƒะฑะปะธะบะฐั†ะธะธ ะพั„ะธั†ะธะฐะปัŒะฝั‹ั… ัะฑะพั€ะพะบ ะธ ะฟั€ะพะฒะตั€ะบะธ ะฒะพะทะผะพะถะฝะพัั‚ะธ ัะฑะพั€ะบะธ ะบะพะดะฐ.
  • ะ ะตะฐะปะธะทะพะฒะฐะฝ ะฒั‚ะพั€ะพะน ัƒั€ะพะฒะตะฝัŒ ะฟะพะดะดะตั€ะถะบะธ ั†ะตะปะตะฒะพะน ะฟะปะฐั‚ั„ะพั€ะผั‹ wasm32-wasi-preview1-threads. ะ’ั‚ะพั€ะพะน ัƒั€ะพะฒะตะฝัŒ ะฟะพะดะดะตั€ะถะบะธ ะฟะพะดั€ะฐะทัƒะผะตะฒะฐะตั‚ ะณะฐั€ะฐะฝั‚ะธัŽ ัะฑะพั€ะบะธ.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: opennet.ru

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™