Ăshte publikuar lĂ«vizja e gjuhĂ«s sĂ« programimit Rust 1.51, e cila fillimisht bazohej nĂ« projektin Mozilla, por tani zhvillohet nĂ«n mbrojtjen e njĂ« organizate tĂ« pavaruara, Rust Foundation. Gjuha fokusohet nĂ« punĂ«n e sigurt me memorien, ofron menaxhim automat tĂ« memorjes dhe siguron mjete pĂ«r arritjen e njĂ« paralelizmi tĂ« lartĂ« nĂ« ekzekutimin e detyrave, duke e shmangur pĂ«rdorimin e mbledhĂ«sve tĂ« mbeturinave dhe runtime (runtime reduktohet nĂ« iniciativĂ«n bazĂ« dhe mbĂ«shtetje tĂ« bibliotekĂ«s standarde).
Menaxhimi automatik i memories në Rust e shpëton zhvilluesin nga gabimet gjatë manipulimit të treguesve dhe mbron nga probleme që lindin nga puna në nivel të ulët me memorien, si aksesimi në një zonë të memories pas çlirimit të saj, dereferimi i treguesve nul, dalja jashtë kufijve të buffers dhe të tjerë. Për shpërndarjen e bibliotekave, sigurinë e ndërtimit dhe menaxhimin e varësive, projekti zhvillon menaxherin e pakove Cargo. Për hostimin e bibliotekave, mbështetet repozitari crates.io.
TĂ« rejat kryesore:
- Funksionaliteti që lidhet me aplikimin e gjenerikëve të konstantës ("const generics") ka marrë statusin e një produkti minimalisht funksional (MVP), duke i dhënë dritën e gjelbër për aplikim të gjerë. Gjenerikët e konstantës lejojnë të përgjithësohen tipet për vlera konstante, dmth të përdoren argumente të përgjithësuara, të kufizuara në një gamë vlerash konstante, për të shmangur përdorimin e tipeve dhe skemave të jetës.
Deri në këtë lëshim, për arrays me tipin "[T; N]" (tipi T dhe madhësia N) është ofruar mundësia për të u përgjithësuar nga tipi dhe madhësia, duke përdorur vlera me çdo tip int, boolean dhe character (tipat strukt dhe enum për momentin nuk janë të mbështetur). Gjenerikët e konstantës thjeshtojnë ndjeshëm zhvillimin e bibliotekave, për shembull, për përdorimin e një array që nuk është i lidhur me një tip dhe madhësi të caktuar, mund të specifikohet: struct Array<T, const LENGTH: usize> { // ^^^^^^^^^^^^^^^^^^^ përkufizimi i gjenerikut të konstantës list: [T; LENGTH] // ^^^^^^ përdorimi i tij }
Kur përdoret konkretisht me këtë përkufizim "Array<u8, 32>" kompilaatori do të gjenerojë një version monomorfik të Array: struct Array<u8, 32> { list: [u8; 32] }
- ĂshtĂ« stabilizuar API std::array::IntoIter, i bazuar nĂ« gjenerikĂ«t e konstantĂ«s, me tĂ« cilin mund tĂ« krijohen iteratoret pĂ«r çdo array pĂ«r vlera: fn main() { let array = [1, 2, 3, 4, 5]; // MĂ« parĂ«, pĂ«r tĂ« arritur njĂ« vlerĂ«, duhej tĂ« thĂ«rriste metodĂ«n .iter() for item in array.iter().copied() { println!("{}", item); } // Tani mund tĂ« specifikohet for item in std::array::IntoIter::new(array) { println!("{}", item); } }
- Në menaxherin e paketave cargo është implementuar mbështetja për fushën e re resolver në Cargo.toml, me të cilin mund të aktivizohet versioni i dytë i përcaktuesit të mundësive të disponueshme (feature resolver). Versioni i ri i përcaktuesit shmang lidhjen e mundësive të varësive, të listuara në seksionin "[features]", atje ku kjo është e papërshtatshme, për shembull, kur lidhen një varësi që kërkon ndonjë mundësi standarde në skripti ndërtimi dhe makro, por përdor një mundësi të pazakontë në skedarët ekzekutiv.
Derisa mundësitë e paketës, të përmendura disa herë në kolona të varësive, janë bashkuar. Për shembull, nëse projekti lidh varësinë foo, në të cilën janë përcaktuar mundësitë A dhe B, dhe ky paketë përdoret në paketat e tjera bar dhe baz, kur bar varet nga foo me mundësinë A, ndërsa baz nga foo me mundësinë B, atëherë në fund cargo do t'i bashkojë këto mundësi dhe do ta kompilojë foo duke përfshirë mundësitë A dhe B. Ky metod mund të çojë në një mundësi të përfshirë për shkak të ndonjë varësie që mund të jetë e papajtueshme me sistemin përfundimtar për të cilin po bëhet ndërtimi.
- Në cargo është implementuar opsioni split-debuginfo, i vendosur në seksionin "[profile]" dhe flamuri përkatës "-Csplit-debuginfo=unpacked" në rustc, që ofron një implementim të metodës së re për ruajtjen e informacionit të ndihmës, e cila lejon shmangien e nevojës për thirrjen e utilitarit dsymutil dhe përshpejton ndjeshëm procesin e ndërtimit me informacion ndihmës në macOS.
- Sot janë stabilizuar makrot "ptr::addr_of!" dhe "ptr::addr_of_mut!", që lejojnë krijimin e treguesve të papërpunuar për fusha të pa rrokur. use std::ptr; #[repr(packed)] struct Packed { f1: u8, f2: u16, } let packed = Packed { f1: 1, f2: 2 }; // &packed.f2 do të krijojë një tregues të pa rrokur, duke çuar në sjellje të paqartë let raw_f2 = ptr::addr_of!(packed.f2); assert_eq!(unsafe { raw_f2.read_unaligned() }, 2);
- Një grup i ri API-sh është transferuar në klasën e stabilizuar, duke përfshirë stabilizimin e metodave:
- Arc::decrement_strong_count
- Arc::increment_strong_count
- Once::call_once_force
- Peekable::next_if_eq
- Peekable::next_if
- Seek::stream_position
- array::IntoIter
- panic::panic_any
- ptr::addr_of!
- ptr::addr_of_mut!
- slice::fill_with
- slice::split_inclusive_mut
- slice::split_inclusive
- slice::strip_prefix
- slice::strip_suffix
- str::split_inclusive
- sync::OnceState
- task::Wake
- ĂshtĂ« realizuar niveli i tretĂ« i mbĂ«shtetjes pĂ«r platformat i386-unknown-linux-gnu, i486-unknown-linux-gnu, aarch64_be-unknown-linux-gnu, aarch64-unknown-linux-gnu_ilp32 dhe aarch64_be-unknown-linux-gnu_ilp32. Niveli i tretĂ« nĂ«nkupton mbĂ«shtetje bazike, por pa testim automatizuar, publikimin e ndĂ«rtimeve zyrtare dhe verifikimin e mundĂ«sisĂ« pĂ«r ndĂ«rtimin e kodit.
Burimi: opennet.ru
