Ang pagpapalabas ng Rust 1.59 general-purpose programming language, na itinatag ng proyekto ng Mozilla, ngunit ngayon ay binuo sa ilalim ng auspice ng independiyenteng non-profit na organisasyon na Rust Foundation, ay nai-publish. Nakatuon ang wika sa kaligtasan ng memorya at nagbibigay ng paraan upang makamit ang mataas na parallelism sa trabaho habang iniiwasan ang paggamit ng isang basurero at runtime (runtime ay binabawasan sa pangunahing pagsisimula at pagpapanatili ng karaniwang library).
Ang mga paraan ng pangangasiwa ng memorya ng Rust ay nagliligtas sa developer mula sa mga error kapag nagmamanipula ng mga pointer at nagpoprotekta laban sa mga problemang lumitaw dahil sa mababang antas ng paghawak ng memorya, tulad ng pag-access sa isang lugar ng memorya pagkatapos na ito ay mapalaya, pag-derefer ng mga null pointer, pag-overrun ng buffer, atbp. Upang ipamahagi ang mga aklatan, magbigay ng mga build at pamahalaan ang mga dependency, bubuo ang proyekto ng Cargo package manager. Ang crates.io repository ay suportado para sa pagho-host ng mga aklatan.
Ang kaligtasan ng memorya ay ibinibigay sa Rust sa oras ng pag-compile sa pamamagitan ng pagsuri sa sanggunian, pagsubaybay sa pagmamay-ari ng bagay, pagsubaybay sa mga buhay ng bagay (mga saklaw), at pagtatasa ng kawastuhan ng pag-access sa memorya sa panahon ng pagpapatupad ng code. Nagbibigay din ang kalawang ng proteksyon laban sa mga overflow ng integer, nangangailangan ng mandatoryong pagsisimula ng mga variable na halaga bago gamitin, mas mahusay na pinangangasiwaan ang mga error sa karaniwang library, inilalapat ang konsepto ng hindi nababagong mga sanggunian at mga variable bilang default, nag-aalok ng malakas na static na pag-type upang mabawasan ang mga lohikal na error.
Mga pangunahing inobasyon:
- ΠΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠ½ΡΡ Π²ΡΡΠ°Π²ΠΎΠΊ, Π²ΠΎΡΡΡΠ΅Π±ΠΎΠ²Π°Π½Π½ΡΡ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡ , ΠΊΠΎΡΠΎΡΡΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΏΡΠ°Π²Π»ΡΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ Π½Π° Π½ΠΈΠ·ΠΊΠΎΠΌ ΡΡΠΎΠ²Π½Π΅ ΠΈΠ»ΠΈ ΠΈΠΌΠ΅ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΠΌΠ°ΡΠΈΠ½Π½ΡΡ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΉ. ΠΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠ½ΡΠ΅ Π²ΡΡΠ°Π²ΠΊΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡΡΡ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΠΌΠ°ΠΊΡΠΎΡΠΎΠ² Β«asm!Β» ΠΈ Β«global_asm!Β» Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π΄Π»Ρ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΡ ΡΠ΅Π³ΠΈΡΡΡΠΎΠ² ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ° ΡΠΎΡΠΌΠ°ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΡΡΠΎΠΊ, Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎΠ³ΠΎ ΡΠΎΠΌΡ, ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π² ΡΡΡΠΎΠΊΠΎΠ²ΡΡ ΠΏΠΎΠ΄ΡΡΠ°Π½ΠΎΠ²ΠΊΠ°Ρ Π² Rust. ΠΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠΎΠΌ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠ½ΡΠ΅ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ Π΄Π»Ρ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡ x86, x86-64, ARM, AArch64 ΠΈ RISC-V. ΠΡΠΈΠΌΠ΅Ρ Π²ΡΡΠ°Π²ΠΊΠΈ: use std::arch::asm; // Multiply x by 6 using shifts and adds let mut x: u64 = 4; unsafe { asm!( Β«mov {tmp}, {x}Β», Β«shl {tmp}, 1Β», Β«shl {x}, 2Β», Β«add {x}, {tmp}Β», x = inout(reg) x, tmp = out(reg) _, ); } assert_eq!(x, 4 * 6);
- ΠΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° Π΄Π΅ΡΡΡΡΠΊΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ (ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΡΡ ) ΠΏΡΠΈΡΠ²ΠΎΠ΅Π½ΠΈΠΉ, Π² ΠΊΠΎΡΠΎΡΡΡ Π² Π»Π΅Π²ΠΎΠΉ ΡΠ°ΡΡΠΈ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΈΠΏΠ°ΠΆΠ΅ΠΉ, ΡΠ»Π°ΠΉΡΠΎΠ² ΠΈΠ»ΠΈ ΡΡΡΡΠΊΡΡΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ: let (a, b, c, d, e); (a, b) = (1, 2); [c, .., d, _] = [1, 2, 3, 4, 5]; Struct { e, .. } = Struct { e: 5, f: 3 }; assert_eq!([1, 2, 1, 4, 5], [a, b, c, d, e]);
- ΠΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠΊΠ°Π·Π°Π½ΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π΄Π»Ρ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΡΡ Π΄ΠΆΠ΅Π½Π΅ΡΠΈΠΊΠΎΠ² (Β«const genericsΒ»): struct ArrayStorage<T, const N: usize = 2> { arr: [T; N], } impl<T> ArrayStorage<T> { fn new(a: T, b: T) -> ArrayStorage<T> { ArrayStorage { arr: [a, b], } } }
- Π ΠΏΠ°ΠΊΠ΅ΡΠ½ΠΎΠΌ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠ΅ Cargo ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ Π²ΡΠ²ΠΎΠ΄ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠΉ ΠΎΠ± ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡΡ Π½Π΅Π΄ΠΎΠΏΡΡΡΠΈΠΌΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΉ, ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΠΌΡΡ ΠΈΠ·-Π·Π° ΠΎΡΠΈΠ±ΠΎΠΊ Π² ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ΅ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈΠ·-Π·Π° ΠΎΡΠΈΠ±ΠΊΠΈ Π΄ΠΎΠΏΡΡΠΊΠ°Π»ΠΎΡΡ Π·Π°ΠΈΠΌΡΡΠ²ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΠ»Π΅ΠΉ ΡΠΏΠ°ΠΊΠΎΠ²Π°Π½Π½ΡΡ ΡΡΡΡΠΊΡΡΡ Π² safe-Π±Π»ΠΎΠΊΠ°Ρ ). ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΉ Π±ΡΠ΄Π΅Ρ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ΅Π½Π° Π² Π±ΡΠ΄ΡΡΠ΅ΠΉ Π²Π΅ΡΡΠΈΠΈ Rust.
- Π cargo ΠΈ rustc Π²ΡΡΡΠΎΠ΅Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΡ ΡΠ°ΠΉΠ»ΠΎΠ², ΠΎΡΠΈΡΠ΅Π½Π½ΡΡ ΠΎΡ ΠΎΡΠ»Π°Π΄ΠΎΡΠ½ΡΡ Π΄Π°Π½Π½ΡΡ (strip = Β«debuginfoΒ») ΠΈ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² (strip = Β«symbolsΒ»), Π±Π΅Π· Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ Π²ΡΠ·ΠΎΠ²Π° ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΉ ΡΡΠΈΠ»ΠΈΡΡ. ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° ΠΎΡΠΈΡΡΠΊΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΡΡΡ ΡΠ΅ΡΠ΅Π· ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ Β«stripΒ» Π² Cargo.toml: [profile.release] strip = Β«debuginfoΒ», Β«symbolsΒ»
- ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΎΡΠΊΠ»ΡΡΠ΅Π½Π° ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ°Π»ΡΠ½Π°Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ. Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΡΠΈΡΠΈΠ½Ρ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΉ ΠΎΠ±Ρ ΠΎΠ΄ ΠΎΡΠΈΠ±ΠΊΠΈ Π² ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ΅, ΠΏΡΠΈΠ²ΠΎΠ΄ΡΡΠ΅ΠΉ ΠΊ ΡΠ±ΠΎΡΠΌ ΠΈ Π²ΡΠ²ΠΎΠ΄Ρ ΠΎΡΠΈΠ±ΠΎΠΊ Π΄Π΅ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ. ΠΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ ΡΠΆΠ΅ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²Π»Π΅Π½ΠΎ ΠΈ Π²ΠΎΠΉΠ΄ΡΡ Π² ΡΠΎΡΡΠ°Π² ΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ Π²ΡΠΏΡΡΠΊΠ°. ΠΠ»Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Π½ΠΈΡ ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ°Π»ΡΠ½ΠΎΠΉ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ RUSTC_FORCE_INCREMENTAL=1.
- Ang isang bagong bahagi ng API ay inilipat sa kategorya ng stable, kabilang ang mga pamamaraan at pagpapatupad ng mga katangian ay na-stabilize:
- std::thread::available_parallelism
- Result::copied
- Result::cloned
- arch::asm!
- arch::global_asm!
- ops::ControlFlow::is_break
- ops::ControlFlow::is_continue
- TryFrom for u8
- char::TryFromCharError (Clone, Debug, Display, PartialEq, Copy, Eq, Error)
- iter::zip
- NonZeroU8::is_power_of_two
- NonZeroU16::is_power_of_two
- NonZeroU32::is_power_of_two
- NonZeroU64::is_power_of_two
- NonZeroU128::is_power_of_two
- DoubleEndedIterator Π΄Π»Ρ ΡΡΡΡΠΊΡΡΡΡ ToLowercase
- DoubleEndedIterator Π΄Π»Ρ ΡΡΡΡΠΊΡΡΡΡ ToUppercase
- TryFrom<&mut [T]> for [T; N]
- UnwindSafe Π΄Π»Ρ ΡΡΡΡΠΊΡΡΡΡ Once
- RefUnwindSafe Π΄Π»Ρ Once
- Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠ΅ Π² ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ armv8 neon Π΄Π»Ρ aarch64
- Ang katangiang "const", na tumutukoy sa posibilidad na gamitin ito sa anumang konteksto sa halip na mga constant, ay ginagamit sa mga function:
- mem::MaybeUninit::as_ptr
- mem::MaybeUninit::assume_init
- mem::MaybeUninit::assume_init_ref
- ffi::CStr::from_bytes_with_nul_unchecked
Pinagmulan: opennet.ru