ĂshtĂ« publikuar versioni Rust 1.53 i gjuhĂ«s sĂ« programimit sistemor, e krijuar fillimisht nga projekti Mozilla, por qĂ« sot zhvillohet nĂ«n kujdesin e organizatĂ«s sĂ« pavarur jofitimprurĂ«se Rust Foundation. Gjuha Ă«shtĂ« e pĂ«rqendruar te puna e sigurt me memorien, ofron menaxhim automatik tĂ« memories dhe mjete pĂ«r arritjen e paralelizmit tĂ« lartĂ« gjatĂ« ekzekutimit tĂ« detyrave, pa pĂ«rdorur garbage collector dhe runtime (runtime kufizohet nĂ« inicializimin bazĂ« dhe mirĂ«mbajtjen e bibliotekĂ«s standarde).
Menaxhimi automatik i memories në Rust e çliron zhvilluesin nga gabimet gjatë manipulimit të pointerëve dhe e mbron nga problemet që lindin nga puna në nivel të ulët me memorien, si qasja në një zonë memorieje pas lirimit të saj, dereferencimi i pointerëve null, dalja jashtë kufijve të buffer-it etj. Për shpërndarjen e bibliotekave, sigurimin e build-it dhe menaxhimin e varësive, projekti zhvillon menaxherin e paketave Cargo. Për publikimin e bibliotekave mbështetet repozitori crates.io.
Novitetet kryesore:
- Për vargjet është implementuar trait-i IntoIterator, i cili mundëson iterimin e elementeve të vargut sipas vlerave: for i in [1, 2, 3] { .. }
Gjithashtu është shtuar mundësia e kalimit të vargjeve te metodat që pranojnë iteratorë, për shembull: let set = BTreeSet::from_iter([1, 2, 3]); for (a, b) in some_iterator.chain([1]).zip([1, 2, 3]) { .. }
Më parë, IntoIterator ishte implementuar vetëm për referenca ndaj vargjeve, pra për iterim sipas vlerave kërkohej përdorimi i referencave («&[1, 2, 3]») ose «[1, 2, 3].iter()». Implementimi i IntoIterator për vargjet pengohej nga probleme të përputhshmërisë, të shkaktuara nga transformimi i shtuar më herët në kompilator, i cili e kthente metodën array.into_iter() në (&array).into_iter(). Këto probleme u zgjidhën me një rrugë alternative: kompilatori do të vazhdojë ta transformojë array.into_iter() në (&array).into_iter(), sikur implementimi i trait-it IntoIterator të mos ekzistonte, por vetëm kur metoda thirret me sintaksën «.into_iter()», pa prekur thirrjet në formatin «in [1, 2, 3]», «iter.zip([1, 2, 3])», «IntoIterator::into_iter([1, 2, 3])».
- ĂshtĂ« ofruar mundĂ«sia e pĂ«rdorimit tĂ« shprehjeve «|» (operacioni logjik OR) nĂ« çdo pjesĂ« tĂ« pattern-it, pĂ«r shembull, nĂ« vend tĂ« «Some(1) | Some(2)» tani mund tĂ« shkruhet «Some(1 | 2)»: match result { Ok(Some(1 | 2)) => { .. } Err(MyError { kind: FileNotFound | PermissionDenied, .. }) => { .. } _ => { .. } }
- Lejohet pĂ«rdorimi i simboleve jo-ASCII nĂ« identifikues, pĂ«rfshirĂ« çdo simbol kombĂ«tar tĂ« pĂ«rcaktuar nĂ« specifikimin Unicode UAX 31, por jo simbolet emoji. Kur pĂ«rdoren simbole tĂ« ndryshme, por me pamje tĂ« ngjashme, kompajleri do tĂ« shfaqĂ« njĂ« paralajmĂ«rim. const BLĂ HAJ: &str = «đŠÂ»; struct äșș { ćć: String, } let α = 1; let ïœos = 2; warning: identifier pair considered confusable between âïœâ and âsâ
- Një pjesë e re e API-ve është kaluar në kategorinë stable, përfshirë stabilizimin e këtyre elementeve:
- array::from_ref
- array::from_mut
- AtomicBool::fetch_update
- AtomicPtr::fetch_update
- BTreeSet::retain
- BTreeMap::retain
- BufReader::seek_relative
- cmp::min_by
- cmp::min_by_key
- cmp::max_by
- cmp::max_by_key
- DebugStruct::finish_non_exhaustive
- Duration::ZERO
- Duration::MAX
- Duration::is_zero
- Duration::saturating_add
- Duration::saturating_sub
- Duration::saturating_mul
- f32::is_subnormal
- f64::is_subnormal
- IntoIterator për vargje
- {integer}::BITS
- io::Error::Unsupported
- NonZero*::leading_zeros
- NonZero*::trailing_zeros
- Option::insert
- Ordering::is_eq
- Ordering::is_ne
- Ordering::is_lt
- Ordering::is_gt
- Ordering::is_le
- Ordering::is_ge
- OsStr::make_ascii_lowercase
- OsStr::make_ascii_uppercase
- OsStr::to_ascii_lowercase
- OsStr::to_ascii_uppercase
- OsStr::is_ascii
- OsStr::eq_ignore_ascii_case
- Peekable::peek_mut
- Rc::increment_strong_count
- Rc::decrement_strong_count
- slice::IterMut::as_slice
- AsRef për slice::IterMut
- impl SliceIndex për (Bound, Bound)
- Vec::extend_from_within
- ĂshtĂ« zbatuar niveli i tretĂ« i mbĂ«shtetjes pĂ«r platformĂ«n wasm64-unknown-unknown. Niveli i tretĂ« nĂ«nkupton mbĂ«shtetje bazĂ«, por pa testim tĂ« automatizuar, publikim tĂ« build-eve zyrtare dhe verifikim tĂ« mundĂ«sisĂ« sĂ« kompilimit tĂ« kodit.
- Menaxheri i paketave Cargo tani përdor si parazgjedhje emrin «main» për degën kryesore të depozitës Git (HEAD). Për varësitë e vendosura në depo që përdorin emrin main në vend të master, nuk kërkohet më të specifikohet te cilësimet branch = «main».
- Në kompajler, kërkesat për versionin minimal të LLVM janë rritur në LLVM 10.
PĂ«r mĂ« tepĂ«r, vlen tĂ« theksohet sigurimi i financimit pĂ«r zhvillimin e integrimit nĂ« kernelin Linux tĂ« mjeteve pĂ«r krijimin e komponentĂ«ve nĂ« gjuhĂ«n Rust. Puna do tĂ« zhvillohet nĂ« kuadĂ«r tĂ« projektit Prossimo nĂ«n kujdesin e organizatĂ«s ISRG (Internet Security Research Group), e cila Ă«shtĂ« themeluese e projektit Letâs Encrypt dhe mbĂ«shtet pĂ«rhapjen e HTTPS-sĂ« dhe zhvillimin e teknologjive pĂ«r rritjen e sigurisĂ« sĂ« internetit. Fondet do tĂ« sigurohen nga kompania Google, e cila do tĂ« financojĂ« punĂ«n e Miguel Ojeda, autorit tĂ« projektit Rust-for-Linux. MĂ« parĂ«, ISRG dhe Google kanĂ« financuar tashmĂ« krijimin e njĂ« backend-i alternativ HTTP pĂ«r mjetin curl dhe zhvillimin e njĂ« moduli tĂ« ri TLS pĂ«r serverin HTTP Apache.
Sipas të dhënave nga Microsoft dhe Google, rreth 70% e cenueshmërive shkaktohen nga menaxhimi jo i sigurt i memories. Supozohet se përdorimi i gjuhës Rust për zhvillimin e komponentëve të kernelit, si p.sh. driverët e pajisjeve, do të ulë rrezikun e shfaqjes së cenueshmërive të shkaktuara nga puna jo e sigurt me memorien dhe do të eliminojë gabime të tilla si qasja në një zonë memorieje pas lirimit të saj dhe dalja jashtë kufijve të buffer-it.
Trajtimi i sigurt i memories garantohet në Rust gjatë kompilimit përmes verifikimit të referencave, ndjekjes së pronësisë së objekteve dhe marrëveshjes së kohëzgjatjes së objekteve (zona e dukshmërisë), si dhe përmes vlerësimit të saktësisë së qasjes në memory gjatë ekzekutimit të kodit. Rust gjithashtu ofron mjete për mbrojtjen nga mbushjet e 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ë pazëvendësueshëm (immutable) si standard, dhe ofron tipizim të fortë statik për minimizimin e gabimeve logjike.
Burimi: opennet.ru
