Gjuha e programimit për qëllime të përgjithshme Rust 1.59, e themeluar nga projekti Mozilla, por tani e zhvilluar nën kujdesin e organizatës së pavarur jofitimprurëse Rust Foundation, është publikuar. Gjuha fokusohet në sigurinë e kujtesës dhe siguron mjetet për të arritur paralelizëm të lartë të punës duke shmangur përdorimin e një grumbulluesi të mbeturinave dhe kohën e funksionimit (koha e funksionimit reduktohet në inicializimin bazë dhe mirëmbajtjen e bibliotekës standarde).
Metodat e trajtimit të memories Rust e ruajnë zhvilluesin nga gabimet gjatë manipulimit të treguesve dhe mbrojnë nga problemet që lindin për shkak të trajtimit të nivelit të ulët të kujtesës, të tilla si qasja në një zonë memorie pasi të jetë liruar, mosreferencimi i treguesve null, tejkalimet e buferit, etj. Për të shpërndarë bibliotekat, për të ofruar ndërtime dhe për të menaxhuar varësitë, projekti zhvillon menaxherin e paketave Cargo. Depoja e crates.io mbështetet për pritjen e bibliotekave.
Siguria e memories sigurohet në Rust në kohën e përpilimit përmes kontrollit të referencës, mbajtjes së gjurmës së pronësisë së objektit, mbajtjes së gjurmëve të jetëgjatësisë së objektit (scopes) dhe vlerësimit të saktësisë së aksesit në kujtesë gjatë ekzekutimit të kodit. Rust siguron gjithashtu mbrojtje kundër tejmbushjeve të numrave të plotë, kërkon inicializimin e detyrueshëm të vlerave të variablave përpara përdorimit, trajton më mirë gabimet në bibliotekën standarde, zbaton konceptin e referencave dhe variablave të pandryshueshme si parazgjedhje, ofron shtypje të fortë statike për të minimizuar gabimet logjike.
Risitë kryesore:
- Tani është e disponueshme mundësia për të përdorur injeksione në gjuhën e asamblesë, të cilat janë të dobishme për aplikacionet që kërkojnë kontroll të ekzekutimit në nivel të ulët ose aftësinë për të përdorur udhëzime të specializuara të makinës. Injeksionet e asamblesë shtohen duke përdorur makrot "asm!" dhe "global_asm!", duke përdorur sintaksën e formatimit të vargjeve për emërtimin e regjistrave, të ngjashme me atë të përdorur në zëvendësimet e vargjeve në Rust. Kompiluesi mbështet udhëzimet e asamblesë për arkitekturat x86, x86-64, ARM, AArch64 dhe RISC-V. Shembull injektimi: përdorni std::arch::asm; // Shumëzoni x me 6 duke përdorur zhvendosje dhe mbledhje 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);
- U shtua mbështetje për caktimet e destrukturuara (paralele), ku specifikohen tipare, feta ose struktura të shumëfishta në anën e majtë të shprehjes. Për shembull: le të jetë (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]);
- Mundësia për të specifikuar vlerat e parazgjedhura për const generics tani është në dispozicion: struct ArrayStorage { arr: [T; N], } implikuar ArrayStorage { fn new(a: T, b: T) -> ArrayStorage { ArrayStorage { arr: [a, b], } } }
- Menaxheri i paketave Cargo tani shfaq paralajmërime rreth përdorimit të konstruksioneve të pavlefshme në varësi për shkak të gabimeve të kompiluesit (për shembull, një gabim lejoi huazimin e fushave të strukturave të paketuara në blloqe të sigurta). Mbështetja për konstruksione të tilla do të hiqet në një version të ardhshëm të Rust.
- Cargo dhe rustc kanë një aftësi të integruar për të gjeneruar ekzekutues të zhveshur nga informacioni i debugimit (strip = "debuginfo") dhe simbolet (strip = "symbols"), pa pasur nevojë për një program të veçantë. Ky zhveshje konfigurohet nëpërmjet parametrit "strip" në Cargo.toml: [profile.release] strip = "debuginfo", "symbols"
- Kompilimi rritës është çaktivizuar si parazgjedhje. Arsyeja e përmendur është një zgjidhje e përkohshme për një gabim të kompiluesit që shkakton rrëzime dhe gabime deserializimi. Një rregullim është përgatitur dhe do të përfshihet në versionin e ardhshëm. Për të riaktivizuar kompilimin rritës, mund të përdorni variablin e mjedisit RUSTC_FORCE_INCREMENTAL=1.
- Një pjesë e re e API-së është zhvendosur në kategorinë e qëndrueshme, duke përfshirë metodat dhe implementimet e tipareve janë stabilizuar:
- std::thread::available_parallelism
- Rezultati::kopjuar
- Rezultati::i klonuar
- arch::asm!
- arch::global_asm!
- ops::ControlFlow::is_break
- ops::ControlFlow::is_continue
- ProvoNga për u8
- char::TryFromCharError (Klonim, Debugim, Shfaqje, PartialEq, Kopjim, Eq, Gabim)
- 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 për strukturën ToLowercase
- DoubleEndedIterator për strukturën ToUppercase
- ProvoNga<&mut [T]> për [T; N]
- UnwindSafe për strukturën Once
- RefUnwindSafe për një herë
- Karakteristikat e mbështetjes së neonit armv8 të ndërtuara nga përpiluesi për aarch64
- Atributi "const", i cili përcakton mundësinë e përdorimit të tij në çdo kontekst në vend të konstanteve, përdoret në funksionet:
- mem::MaybeUninit::as_ptr
- mem::MaybeUninit::assume_init
- mem::MaybeUninit::assume_init_ref
- ffi::CStr::from_bytes_with_nul_unchecked
Burimi: opennet.ru
