Üldotstarbeline programmeerimiskeel Rust 1.77, mille on välja andnud Mozilla projekt, kuid mille arengut toetab sõltumatu mittetulundusühing Rust Foundation, on nüüd avaldatud. Keel keskendub mälus turvalisele töötlemisele ning pakub vahendeid kõrge paralleelsuse saavutamiseks, vältides samas prügikoristuse ja runtime'i kasutamist (runtime piirdub põhihalduse ja standardbiblioteegi hooldamisega).
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:
- Lisatud tugi C-stringide tekstiliteraalidele (c»tekst»), mis salvestatakse mällu nullmärgiga ja on seotud tüübiga „CStr”. Eeldatakse, et C-stringide tugi lihtsustab koodi kirjutamist, mis suhtleb liideste vahel, kus kasutatakse nulliga lõppevaid stringe, ning võimaldab teostatavaid kontrollimisi kompilatsiooni ajal. const HELLO: &core::ffi::CStr = c»Hello, world!»;
- Asünkroonselt täidetavates funktsioonides, mis on deklareeritud koos väljendiga «async fn», on lubatud rekursiooni kasutamine, st sellised funktsioonid võivad nüüd endid ise kutsuda. async fn fib(n: u32) -> u32 { match n { 0 | 1 => 1, _ => Box::pin(fib(n-1)).await + Box::pin(fib(n-2)).await } }
- Makseoffset_of! makro on stabiliseeritud, võimaldades määrata struktuuride, enumeratsioonide, liidete ja tuple'ite väljade baitide nihke algtüübist. Praktikas võib makro olla kasulik olukordades, kus on vajalik väljade nihe töötlemine ilma tüübi eksemplarita. Eelkõige on offset_of funktsionaalsus vajalik madalama taseme komponentide, nagu draiverite, arendamisel. use std::mem; #[repr(C)] struct FieldStruct { first: u8, second: u16, third: u8 } assert_eq!(mem::offset_of!(FieldStruct, first), 0); assert_eq!(mem::offset_of!(FieldStruct, second), 2); assert_eq!(mem::offset_of!(FieldStruct, third), 4);
- Paketihalduris Cargo on väljalaskekava profiilides vaikevalikuna lubatud seadme puhastamine silumisandmete eest (strip = «debuginfo»), kui Cargo profiilis pole selgelt lubatud silumise režiim, st kui parameeter debug = 0.
- Vaikimisi on sisse lülitatud „-Zthir-unsafeck=on“ valik, mis tagab THIR-i („Typed High-Level Intermediate Representation“) ohutu kontrolli.
- Lisatud on lint-kontroll static_mut_refs, mis annab hoiatuse, kui kasutatakse viiteid muudetavatele staatilistele väärtustele.
- Tuvastatud on tüübist „From<&[T; N]>“ kasutamise võimalus tüübile „Cow<[T]>“. fn foo(data: impl Into<Cow<‘static, [&’static str]>>) { /* … */ } fn main() { foo(&[„hello“, „world“]); }
- Kompilaator tagab 16-baidiste i128 ja u128 tüüpide ühtimise x86 süsteemides.
- Stabiilsete versioonide hulka on lisatud uus komplekt API-sid, sealhulgas on stabiliseeritud meetodid ja tüüpide rakendused:
- array::each_ref
- array::each_mut
- core::net
- f32::round_ties_even
- f64::round_ties_even
- mem::offset_of!
- slice::first_chunk
- slice::first_chunk_mut
- slice::split_first_chunk
- slice::split_first_chunk_mut
- slice::last_chunk
- slice::last_chunk_mut
- slice::split_last_chunk
- slice::split_last_chunk_mut
- slice::chunk_by
- slice::chunk_by_mut
- Bound::map
- File::create_new
- Mutex::clear_poison
- RwLock::clear_poison
- Kolmandat tugitaset on rakendatud platvormidele aarch64-unknown-illumos, hexagon-unknown-none-elf, riscv32imafc-esp-espidf ja riscv32im-risc0-zkvm-elf. Kolmas tase hõlmab põhitugi, kuid ilma automatiseeritud testimise, ametlike versioonide avaldamise ja koodi koostamise võimaluse kontrollimiseta.
Allikas: opennet.ru
