Avaldatud on ĂŒldotstarbelise programmeerimiskeele Rust 1.59 vĂ€ljaanne, mis algselt pĂ”hines Mozilla projektist, kuid nĂŒĂŒd arendab seda sĂ”ltumatu mittetulundusĂŒhing Rust Foundation. Keel keskendub mĂ€luga ohutule töötamisele ja pakub vahendeid ĂŒlesannete kĂ”rge paralleelsuse saavutamiseks, samas vĂ€ltides prĂŒgikorjajat ja runtime'i (runtime piirdub pĂ”hikonfiguratsiooni ja standardraamatukogu toetamisega).
Rustis olevad mĂ€luhaldusmeetodid vabastavad arendajad probleemidest, mis on seotud osutitega, ning kaitsevad madala taseme mĂ€lutöötlusest tulenevate probleemide, nagu vabanenud mĂ€lu alale juurdepÀÀs, nullosutite de-referentseerimine, mĂ€lupiiride ĂŒletamine jne. Raamatukogude levitamiseks, projekti koostamise ja sĂ”ltuvuste haldamiseks arendatakse pakihaldurit Cargo. Raamatukogude paigutamiseks toetatakse repo crates.io.
Rust tagab turvalise mĂ€lutöötluse kompilatsiooni ajal, kontrollides viiteid, jĂ€lgides objektide omandit, arvestades objektide elutsĂŒklit (nĂ€htavust) ja hinnates mĂ€lule juurdepÀÀsu Ă”igsust koodi kĂ€itamise ajal. Rust pakub ka meetmeid enamike tĂ€isarvude ĂŒletamiste vĂ€ltimiseks, nĂ”uab muutujate vÀÀrtuste algvÀÀrtustamist enne kasutamist, kĂ€sitleb vigasid paremini oma standardraamatukogus, rakendab immutamatuse (immutable) kontseptsiooni viidetes ja muutujates vaikimisi ning pakub tugevat staatilist tĂŒĂŒpimist loogiliste vigade minimeerimiseks.
PÔhilised uuendused:
- Saadi on kasutusele vĂ”etud assembleri manuseid, mis on nĂ”utud rakendustes, kus on vajalik madala taseme tĂ€itmisest juhtimine vĂ”i spetsialiseeritud masina juhiste kasutamine. Assembleri manuseid lisatakse makrodega "asm!" ja "global_asm!" ning registrite nimetamiseks kasutatakse stringi vormingusĂŒntaksit, mis sarnaneb Rustis kasutatavatele stringi asendustele. Kompilaator toetab assembleri juhiseid arhitektuuridele x86, x86-64, ARM, AArch64 ja RISC-V. NĂ€ide manusest: use std::arch::asm; // Korruta x kuuega, kasutades nihkeid ja liiteid let mut x: u64 = 4; unsafe { asm!( "mov {tmp}, {x}", "shl {tmp}, 1", "shl {x}, 2", "add {x}, {tmp}", x = inout(reg) x, tmp = out(reg) _, ); } assert_eq!(x, 4 * 6);
- Lisatud on toetatud destruktureeritud (paralleelsed) mÀÀramised, kus vĂ€ljendi vasakus osas on mitmeid tĂŒpse, lĂ”ike vĂ”i struktuure. NĂ€iteks: let (a, b, c, d, e); (a, b) = (1, 2); [c, .., d, _] = [1, 2, 3, 4, 5]; Struct { e, .. } = Struct { e: 5, f: 3 }; assert_eq!([1, 2, 1, 4, 5], [a, b, c, d, e]);
- Kohandatud on vĂ”imalus mÀÀrata vaikevÀÀrtusi konstantsetele generikatele (âconst genericsâ): struct ArrayStorage { arr: [T; N], } impl ArrayStorage { fn new(a: T, b: T) -> ArrayStorage { ArrayStorage { arr: [a, b], } } }
- Paketihaldur Cargo tagab hoiatuste vÀljastamise sÔltuvuste vÀÀrtuslikust konstruktsioonide kasutamise kohta, mis on kÀideldavad kompilatsioonivigade tÔttu (nÀiteks vale tÔttu lubati pakitud struktuuride vÀljade laenamine safe-blokkides). Selliste konstruktsioonide toetus lÔpetatakse tulevases Rusti versioonis.
- Cargo ja rustc-s on sisse ehitatud vĂ”imalus genereerida töötavaid faile, mis on puhastatud silumisandmetest (strip = âdebuginfoâ) ja sĂŒmbolitest (strip = âsymbolsâ), ilma et oleks vajalik eraldi utiliidi kĂ€ivitamine. Puhastamise seadistamine toimub parameetri âstripâ kaudu Cargo.toml-is: [profile.release] strip = âdebuginfoâ, âsymbolsâ
- Vaikimisi on inkrementeeriv kompileerimine keelatud. PÔhjuseks on ajutine lahendus kompilatori veale, mis pÔhjustab tÔrkeid ja deserialiseerimisveateateid. Veaparanduse eest on juba valmistatud ja see lisatakse jÀrgmistesse vÀljaannetesse. Inkrementeeriva kompileerimise lubamiseks saab kasutada keskkonnamuutujat RUSTC_FORCE_INCREMENTAL=1.
- Stabiilsete versioonide hulka on lisatud uus komplekt API-sid, sealhulgas on stabiliseeritud meetodid ja tĂŒĂŒpide rakendused:
- std::thread::available_parallelism
- Result::copied
- Result::cloned
- arch::asm!
- arch::global_asm!
- ops::ControlFlow::is_break
- ops::ControlFlow::is_continue
- TryFrom for u8
- char::TryFromCharError (Clone, Debug, Display, PartialEq, Copy, Eq, Error)
- iter::zip
- NonZeroU8::is_power_of_two
- NonZeroU16::is_power_of_two
- NonZeroU32::is_power_of_two
- NonZeroU64::is_power_of_two
- NonZeroU128::is_power_of_two
- DoubleEndedIterator struktuur ToLowercase jaoks
- DoubleEndedIterator struktuur ToUppercase jaoks
- TryFrom<&mut [T]> for [T; N]
- UnwindSafe struktuur Once jaoks
- RefUnwindSafe struktuur Once jaoks
- kompilaatorisse sisse ehitatud funktsioonid armv8 neon toeks aarch64
- Konstantse mÀrgendiga `const`, mis mÀÀrab vÔimaluse kasutada konstandina igas kontekstis, on rakendatud funktsioonides:
- mem::MaybeUninit::as_ptr
- mem::MaybeUninit::assume_init
- mem::MaybeUninit::assume_init_ref
- ffi::CStr::from_bytes_with_nul_unchecked
Allikas: opennet.ru
