U publikua versioni i gjuhës së programimit të përgjithshëm Rust 1.86, e bazuar në projektin Mozilla, por tani në zhvillim nën mbikëqyrjen e organizatës së pavarur jofitimprurëse Rust Foundation. Gjuha përqendrohet në sigurinë e punës me kujtesën dhe ofron mjete për arritjen e një paralelizmi të lartë të ekzekutimit të detyrave, pa përdorur mbledhës mbeturinash dhe runtime (runtime reduktohet në inicializimin e bazës dhe mirëmbajtjen e bibliotekës standarde).
Metodat e punës me kujtesën në Rust e çlirojnë zhvilluesin nga gabimet gjatë manipulimit me treguesit dhe e mbrojnë atë nga problemet që lindin për shkak të punës me kujtesën në nivel të ulët, si qasja në një zonë kujtese pas çlirimit të saj, dereferencimi i treguesve null, dalja jashtë kufijve të buffers etj. Për shpërndarjen e bibliothekave, sigurimin e ndërtimit dhe menaxhimin e varësive, projekti zhvillohet me menaxherin e paketave Cargo. Për mbështetje të bibliothekave, ekziston një repository crates.io.
Puna e sigurt me kujtesën sigurohet në Rust gjatë kompilimit përmes verifikimit të referencave, ndjekjes së pronësisë së objekteve, llogaritjes së kohëzgjatjes së jetës së objekteve (fushave të dukshmërisë) dhe vlerësimit të saktësisë së qasjes në kujtesë gjatë ekzekutimit të kodit. Rust gjithashtu ofron mjete për mbrojtjen nga tejkalimet e numrave të plotë, kërkon inicializimin e detyrueshëm të vlerave të variablave para përdorimit, trajton më mirë gabimet në bibliotekën standarde, aplikon konceptin e referencave dhe variablave të pandryshueshëm (immutable) si standard dhe ofron tipizimin e fortë statik për të minimizuar gabimet logjike.
Novitetet kryesore:
- Shtuar mbështetje për ngritjen (upcast) të trait-eve në supertrait-in bazë, dmth, është bërë e mundur të konvertohet direkt një referencë ndaj një objekti trait në një referencë ndaj një objekti supertrait pa nevojën për të krijuar një metodë speciale në trait, që ktheu një referencë në supertrait. Një operacion të ngjashëm mund të kryhet edhe me lloje të tjera të treguesve inteligjentë, për shembull, "Arc<dyn Trait> -> Arc<dyn Supertrait>" dhe "*const dyn Trait -> *const dyn Supertrait". trait Trait: Supertrait {} trait Supertrait {} fn upcast(x: &dyn Trait) -> &dyn Supertrait { x }
- Në HashMap dhe slice është shtuar metoda get_disjoint_mut() për të marrë njëkohësisht disa referenca të ndryshueshme ndaj elementeve. Më parë, kontrolluesi i huazimit nuk lejonte përdorimin e njëkohshëm të referencave të marra përmes metodës get_mut(). let v = &mut [1, 2, 3]; if let Ok([a, b]) = v.get_disjoint_mut([0, 2]) { *a = 413; *b = 612; } assert_eq!(v, &[413, 2, 612]); if let Ok([a, b]) = v.get_disjoint_mut([0..1, 1..3]) { a[0] = 8; b[0] = 88; b[1] = 888; } assert_eq!(v, &[8, 88, 888]);
- Ăshte lejuar tĂ« shĂ«nohen funksionet safe me atribute "#[target_feature]", qĂ« tregon se funksioni pĂ«rdor tiparet e caktuara tĂ« CPU-sĂ«. NjĂ« funksion safe, i shĂ«nuar me atributin "#[target_feature]", mund tĂ« thirret nĂ« siguri nga njĂ« tjetĂ«r funksion safe vetĂ«m nĂ«se edhe ai Ă«shtĂ« i shĂ«nuar "#[target_feature]" (ndryshe, funksione tĂ« tilla duhet tĂ« thirren nĂ« bllokun unsafe). NdĂ«rkohĂ«, ato nuk mund tĂ« dĂ«rgohen nĂ« funksione qĂ« pranojnĂ« parametra tĂ« pĂ«rgjithshĂ«m (generic), tĂ« kufizuar nga trait-e tĂ« Fn*. MĂ« parĂ«, atributi "#[target_feature]" mund tĂ« aplikohej vetĂ«m pĂ«r funksione tĂ« shĂ«nuara si "unsafe". #[target_feature(enable = "avx2")] fn requires_avx2() { \/\/ ... } #[target_feature(enable = "avx2")] fn safe_callsite() { requires_avx2(); } fn unsafe_callsite() { if is_x86_feature_detected!("avx2") { unsafe { requires_avx2() }; } }
- Në kompiluesin Rust është përfshirë zëvendësimi i kontrollit të debuguar (debug-assert), që tregohet se treguesi nuk përmban vlerën NULL gjatë leximit dhe shkruajtjes së madhësive që nuk janë zero, si dhe gjatë huazimit të ri (reborrow) të treguesit në një referencë. Për shembull, me aktivizimin e kontrollit të debuguar, kodi më poshtë tani do të çojë në një gjendje "panic": let _x = *std::ptr::null::(); let _x = &*std::ptr::null::();
- Kontrolli lint "missing_abi" Ă«shtĂ« aktivizuar si parazgjedhje, duke çuar nĂ« shfaqjen e njĂ« paralajmĂ«rimi nĂ«se ABI nuk Ă«shtĂ« caktuar pas fjalĂ«s kyçe extern. MĂ« parĂ«, po tĂ« mos caktosh ABI pas extern, nĂ«nkuptohej se pĂ«rdorej ABI "C". Tani rekomandohet tĂ« caktosh qartazi ABI "C", pĂ«r shembull, âextern "C" {}â dhe âextern "C" fnâ
- Një grup i ri API u kalua në kategorinë e stabilizuar, përfshirë stabilizimin e metodave dhe implementimeve të trait-ëve:
- {float}::next_down
- {float}::next_up
- ::get_disjoint_mut
- ::get_disjoint_unchecked_mut
- slice::GetDisjointMutError
- HashMap::get_disjoint_mut
- HashMap::get_disjoint_unchecked_mut
- NonZero::count_ones
- Vec::pop_if
- sync::Once::wait
- sync::Once::wait_force
- sync::OnceLock::wait
- Priznaku «const» aplicohet në funksione:
- hint::black_box
- io::Cursor::get_mut
- io::Cursor::set_position
- str::is_char_boundary
- str::split_at
- str::split_at_checked
- str::split_at_mut
- str::split_at_mut_checked
- Niveli i tretë i mbështetjes është realizuar për platformat {aarch64-unknown,x86_64-pc}-nto-qnx710_iosock, {aarch64-unknown,x86_64-pc}-nto-qnx800, {x86_64,i686}-win7-windows-gnu, amdgcn-amd-amdhsa, x86_64-pc-cygwin, {mips,mipsel}-mti-none-elf, m68k-unknown-none-elf, armv7a-nuttx-{eabi,eabihf}, aarch64-unknown-nuttx dhe thumbv7a-nuttx-{eabi,eabihf}. Niveli i tretë nënkupton mbështetje bazë, por pa testim automatizuar, publikim të ndërtimeve zyrtare dhe verifikimin e mundësisë për ndërtimin e kodit.
- ĂshtĂ« shtuar njĂ« paralajmĂ«rim pĂ«r ndalimin e mbĂ«shtetjes sĂ« nivelit tĂ« dytĂ« pĂ«r platformĂ«n e synuar i586-pc-windows-msvc nĂ« lĂ«shimin e ardhshĂ«m (1.87). Rekomandohet pĂ«rdorimi i platformĂ«s i686-pc-windows-msvc, e cila ndryshon pĂ«r mbĂ«shtetje tĂ« instrukcioneve SSE2. Platforma i586-pc-windows-msvc ka humbur kuptimin, pasi pĂ«r Windows 10 Ă«shtĂ« e nevojshme mbĂ«shtetja pĂ«r SSE2, dhe versionet mĂ« tĂ« hershme tĂ« Windows nĂ« Rust nuk mbĂ«shteten.
Po ashtu, mund tĂ« theksohet se kompania Ferrocene ka dorĂ«zuar komunitetit specifikimin pĂ«r gjuhĂ«n Rust (FLS â Ferrocene Language Specification), e cila Ă«shtĂ« krijuar gjatĂ« zhvillimit tĂ« kompiluesit tĂ« saj Rust pĂ«r sisteme kritike dhe pĂ«rditĂ«sohet periodikisht me gjendjen aktuale tĂ« kompiluesit kryesor Rust. Specifikimi FLS pĂ«rfshin njĂ« udhĂ«zues tĂ« strukturuar dhe tĂ« detajuar pĂ«r sintaksĂ«n, semantikĂ«n dhe sjelljen e Rust, tĂ« dobishĂ«m pĂ«r verifikimin, vlerĂ«simin e pĂ«rputhshmĂ«risĂ« dhe standardizimin.
Materialet e dërguara do të përdoren për të krijuar një specifikim referencë për gjuhën Rust, i cili mund të përdoret për zhvillimin e kompilatorëve alternativë dhe për verifikimin e kompilatorit në fushat që janë kritikisht të rëndësishme për sigurinë.
Burimi: opennet.ru
