Është publikuar publikimi i gjuhës programuese të sistemit Rust 1.51, i themeluar nga projekti Mozilla, por tashmë i zhvilluar nën kujdesin e organizatës së pavarur jofitimprurëse Rust Foundation. Gjuha fokusohet në sigurinë e kujtesës, siguron menaxhimin automatik të kujtesës dhe siguron mjetet për të arritur paralelizëm të lartë të detyrave pa përdorur një grumbullues mbeturinash ose kohëzgjatjeje (koha e funksionimit reduktohet në inicializimin bazë dhe mirëmbajtjen e bibliotekës standarde).
Menaxhimi automatik i kujtesës i Rust eliminon gabimet gjatë manipulimit të treguesve dhe mbron nga problemet që lindin nga manipulimi i nivelit të ulët të memories, të tilla si qasja në një rajon memorie pasi të jetë liruar, mosreferencat e treguesit null, tejkalimet e buferit, etj. Për të shpërndarë bibliotekat, për të siguruar montimin dhe për të menaxhuar varësitë, projekti po zhvillon menaxherin e paketave Cargo. Depoja e crates.io mbështetet për pritjen e bibliotekave.
Risitë kryesore:
- Funksionaliteti i lidhur me përdorimin e termave gjenerikë konst është përcaktuar si një produkt minimal i zbatueshëm (MVP), duke dhënë dritën jeshile për një përdorim të gjerë. Termat gjenerikë konst lejojnë përgjithësimin e llojeve për vlera konstante, d.m.th., përdorimin e argumenteve gjenerikë të kufizuar në një gamë vlerash konstante në vend të llojeve ose jetëgjatësive. Kjo aftësi mundëson përdorimin e llojeve të parametrizuara me numra të plotë dhe abstraksionin kur krijohen tipare për vargje të çdo madhësie, pa pasur nevojë të krijohet një lloj i veçantë për secilin gamë vlerash të vlefshme për të siguruar që diapazoni i vlefshëm të mos tejkalohet.
Duke filluar me versionin aktual, vargjet e tipit "[T; N]" (tipi T dhe madhësia N) tani kanë aftësinë të abstraktojnë llojin dhe madhësinë, duke përdorur vlerat e çdo lloji të plotë, boolean ose karakteri (tipet struct dhe enum nuk mbështeten ende). Gjenerikët e konsteve thjeshtojnë ndjeshëm zhvillimin e bibliotekës; për shembull, për të përdorur një varg që nuk është i lidhur me një lloj dhe madhësi specifike, mund të specifikoni: struct Array { // ^^^^^^^^^^^^^^^^^^^^^^^ përkufizimi i listës gjenerike të konstanteve: [T; LENGTH] // ^^^^^^^ përdorimi i saj }
Kur përdoret në të vërtetë me këtë përkufizim, "Matricë "Përpiluesi do të gjenerojë një version monomorfik të Array: struct Array {lista: [u8; 32] }
- API-ja std::array::IntoIter, e bazuar në gjenerikë konstante, është stabilizuar. Me të, ju mund të krijoni iteratorë sipas vlerës për çdo varg: fn main() { let array = [1, 2, 3, 4, 5]; // Më parë, për të iteruar mbi një vlerë, duhej të thirrej metoda .iter() për item në array.iter().copied() { println!(«{}», item); } // Tani mund të specifikoni për item në std::array::IntoIter::new(array) { println!(«{}», item); } }
- Menaxheri i paketave cargo tani mbështet një fushë të re zgjidhësi në Cargo.toml, e cila mund të përdoret për të aktivizuar versionin e dytë të zgjidhësit të veçorive. Ky zgjidhës i ri shmang bashkimin e veçorive të varësisë të listuara në seksionin "[veçoritë]" kur kjo është e papërshtatshme, si p.sh. kur përfshihet një varësi që kërkon një veçori standarde në skriptet dhe makrot e ndërtimit, por përdor një veçori jo standarde në skedarin ekzekutues përfundimtar.
Më parë, aftësitë e një pakete të përmendura shumë herë në një grafik varësie bashkoheshin. Për shembull, nëse një projekt përfshinte një varësi foo që përcaktonte aftësitë A dhe B, dhe kjo paketë përdorej në paketa të tjera bar dhe baz, dhe bar varej nga foo me aftësinë A, dhe baz varej nga foo me aftësinë B, atëherë cargo do t'i bashkonte këto aftësi dhe do të kompilonte foo me aftësitë A dhe B të aktivizuara. Kjo metodë mund të rezultonte në një aftësi të aktivizuar nga një varësi që do të ishte e papajtueshme me sistemin e synuar për të cilin u krye ndërtimi përfundimtar. Për shembull, kur një version i foo me "#![no_std]" kërkohej të përdorej në një skedar ekzekutues të ndërtuar me "#![no_std]", dhe foo me "std" kërkohej të përdorej gjatë ndërtimit në build.rs. Duke specifikuar resolver="2" në Cargo.toml, menaxheri i paketave tani do të përpiqet ta trajtojë saktë këtë konflikt, duke ndarë varësitë dev, host dhe target.
- Cargo zbaton opsionin split-debuginfo, të specifikuar në seksionin "[profile]", dhe flamurin përkatës "-Csplit-debuginfo=unpacked" në rustc, duke ofruar zbatimin e një metode të re për ruajtjen e informacionit të debugimit, e cila eliminon nevojën për të thirrur programin dsymutil dhe përshpejton ndjeshëm procesin e ndërtimit me informacionin e debugimit në macOS.
- Makrot "ptr::addr_of!" dhe "ptr::addr_of_mut!" janë stabilizuar, duke lejuar krijimin e treguesve të papërpunuar në fusha të pabazuara. 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ë pabazuar, duke çuar në sjellje të papërcaktuar let raw_f2 = ptr::addr_of!(packed.f2); assert_eq!(unsafe { raw_f2.read_unaligned() }, 2);
- Një grup i ri API-sh është zhvendosur në kategorinë e qëndrueshme, duke përfshirë metodat e mëposhtme:
- Arc::decrement_strong_count
- Arc::increment_strong_count
- Njëherë::call_once_force
- I shikueshëm::next_if_eq
- I shikueshëm::next_if
- Kërko::pozicioni_i_stream-it
- vargu::IntoIter
- panik::panic_any
- ptr::addr_of!
- ptr::addr_of_mut!
- fetë::mbush_me
- fetë::split_inclusive_mut
- fetë::split_inclusive
- slice::strip_prefix
- slice::strip_suffix
- str::split_inclusive
- sinkronizim::OnceState
- detyrë::Zgjim
- Mbështetja e Nivelit 3 është zbatuar 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 3 ofron mbështetje bazë, por pa testime automatike, ndërtime zyrtare ose verifikim ndërtimesh.
Burimi: opennet.ru
