Avalikustatud on ĂŒldotstarbeline programmeerimiskeel Rust 1.86, mis pĂ”hineb Mozilla projektist, kuid mida arendatakse nĂŒĂŒd sĂ”ltumatu mittetulundusĂŒhingu Rust Foundationi toetusel. Keele fookus on mĂ€luga töötamise ohutusele ning see pakub vahendeid ĂŒlesannete kĂ”rge paralleelsuse saavutamiseks, ilma et oleks vaja kasutusele vĂ”tta prĂŒgikoristajat ja runtime'i (runtime piirdub baasi initsialiseerimise ja standardraamatukogu toetamisega).
MÀluga töötamise meetodid Rust'is vabastavad arendajad pointerite manipulatsiooni vigadest ja kaitsevad neid probleemide eest, mis tulenevad madala taseme mÀlu haldamisest, nagu mÀlualale pÀrast selle vabastamist juurdepÀÀs, null-pointerite dereferentseerimine, puhverserveri piiridest vÀljumine jne. Raamatukogude levitamiseks, kokkupaneku tagamiseks ja sÔltuvuste haldamiseks arendatakse paketihaldurit Cargo. Raamatukogude majutamiseks toetatakse repoturite crates.io.
MĂ€luhĂŒgieen Rust'is tagatakse kompileerimise ajal viidete kontrollimise, objektide omandi jĂ€lgimise, objektide eluaja (vaateala) arvestamise ja mĂ€lule juurdepÀÀsu korrektuse hindamise kaudu koodi tĂ€itmise ajal. Rust pakub ka vahendeid tĂ€isarvude ĂŒlevoolude vĂ€ltimiseks, nĂ”uab muutujate vÀÀrtuste kohustuslikku initsialiseerimist enne kasutamist, kĂ€sitleb vigu paremini standardraamatukogus, rakendab muutumatuse (immutable) mĂ”istet viidete ja muutujate jaoks vaikimisi ning pakub tugevat staatilist tĂŒĂŒpimist loogiliste vigade vĂ€hendamiseks.
Peamised uuendused:
- Lisatud on tugi tĂŒĂŒpide (upcast) tĂ”stmiseks supertĂŒĂŒpi (supertrait), st nĂŒĂŒd on vĂ”imalik otse objektist saadud viite teisendamine supertĂŒĂŒbi objektiviidaks ilma, et oleks vaja luua erimeetodit tĂŒĂŒpides, mis tagastab viite supertĂŒĂŒbile. Sarnast toimingut saab teha ka teiste nutikate viidete liikidega, nagu âArc<dyn Trait> -> Arc<dyn Supertrait>â ja â*const dyn Trait -> *const dyn Supertraitâ. trait Trait: Supertrait {} trait Supertrait {} fn upcast(x: &dyn Trait) -> &dyn Supertrait { x }
- HashMapis ja viidetes (slices) on lisatud meetod get_disjoint_mut(), mis vÔimaldab korraga saada mitmeid muudetavaid viiteid elementidele. Varem ei vÔimaldanud borrow checker samal ajal kasutada viiteid, mis saadi meetodi get_mut() abil. 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]);
- On lubatud mĂ€rkida ohutud funktsioonid atribuudiga â#[target_feature]â, mis nĂ€itab, et funktsioon kasutab mÀÀratud CPU vĂ”imalusi. Ohutut funktsiooni, mis on mĂ€rgitud atribuudi â#[target_feature]â all, saab teine ohutu funktsioon ohutult kutsuda ainult juhul, kui see on samuti mĂ€rgitud â#[target_feature]â (vastasel juhul tuleb neid funktsioone kutsuda unsafe-blokis). Nende ĂŒlekandmine funktsioonidesse, mis vĂ”tavad vastu ĂŒldised (generic) parameetrid, mis on piiratud Fn*-tĂŒĂŒpidena, ei ole lubatud. Varem sai atribuuti â#[target_feature]â kasutada ainult funktsioonide puhul, mis olid mĂ€rgitud kui â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() }; } }
- Rusti kompilaatoris on sisse lĂŒlitatud tĂ”rkeverifitseerimise (debug-assert) automaatne asendamine, et nĂ€ha, et nĂ€itaja ei sisalda NULL-i vÀÀrtust, kui loetakse ja kirjutatakse mitte-nullide suurustega, samuti nĂ€itaja uuesti laenamisel (reborrow) viitena. NĂ€iteks, kui tĂ”rkeverifitseerimine on sisse lĂŒlitatud, viib allolev kood nĂŒĂŒd 'panic' olekusse: let _x = *std::ptr::null::(); let _x = &*std::ptr::null::();
- Vaikimisi on sisse lĂŒlitatud lint-verify 'missing_abi', mis genereerib hoiatuse, kui sĂ”na 'extern' jĂ€rel ei ole ABI-d mÀÀratud. Varem, kui 'extern' jĂ€rel ABI-d ei olnud, peeti vaikimisi kasutuseks ABI-d 'C'. NĂŒĂŒd soovitatakse ABI 'C' selgelt mÀÀrata, nĂ€iteks 'extern "C" {}' ja 'extern "C" fn'
- Uus hulk API-d on viidud stabiilsuse tasemele, sealhulgas on stabiliseeritud meetodid ja tĂŒĂŒbispetsiifikatsioonide rakendused:
- {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
- MĂ€rgis âconstâ on rakendatud funktsioonides:
- 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
- Kolmanda taseme tugi platvormade jaoks {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 ja thumbv7a-nuttx-{eabi,eabihf} on nĂŒĂŒd rakendatud. Kolmas tase tĂ€hendab pĂ”hitoetust, kuid ilma automatiseeritud testimise, ametlike presettide avaldamise ja koodi koostamise kontrollimise vĂ”imaluseta.
- On lisatud hoiatus teise taseme toe lÔpetamise kohta sihtplatvormile i586-pc-windows-msvc jÀrgmises vÀljaandes (1.87). Soovitame kasutada platvormi i686-pc-windows-msvc, mis toetab SSE2 instruktsioone. Platvorm i586-pc-windows-msvc on kaotanud mÔtte, kuna Windows 10 jaoks on vajalik SSE2 toe olemasolu, ning varasemaid Windowsi versioone Rustis enam ei toetata.
Lisaks tasub mĂ€rkida, et ettevĂ”te Ferrocene on edastanud kogukonnale Rusti keele spetsifikatsiooni (FLS â Ferrocene Language Specification), mis loodi oma Rusti kompilaatori arendamise kĂ€igus kriitiliselt oluliste sĂŒsteemide jaoks ning mida sĂŒnkroonitakse aeg-ajalt peamise Rusti kompilaatori kĂ€esoleva olekuga. FLS spetsifikatsioon sisaldab struktureeritud ja detailset juhendit Rusti sĂŒntaksi, semantika ja kĂ€itumise kohta, mis sobib verifitseerimiseks, ĂŒhilduvuse hindamiseks ja standardiseerimiseks.
Ettetatud materjale kasutatakse Rusti keele referentsspetsifikatsiooni loomiseks, mida saab kasutada alternatiivsete kompilaatorite arendamiseks ja kompilatori testimiseks kriitilistes, ohutusega seotud valdkondades.
Allikas: opennet.ru
