Objavljeno je izdanje Rust 1.59 programskog jezika opšte namjene, koji je osnovan od strane Mozilla projekta, a koji je sada razvijen pod okriljem nezavisne neprofitne organizacije Rust Foundation. Jezik se fokusira na sigurnost memorije i pruža sredstva za postizanje visokog paralelizma poslova uz izbjegavanje upotrebe sakupljača smeća i vremena izvođenja (vrijeme izvođenja je svedeno na osnovnu inicijalizaciju i održavanje standardne biblioteke).
Rustove metode rukovanja memorijom spašavaju programera od grešaka prilikom manipulacije pokazivačima i štite od problema koji nastaju zbog rukovanja memorijom na niskom nivou, kao što je pristup memorijskoj oblasti nakon što je ona oslobođena, dereferenciranje nultih pokazivača, prekoračenje bafera itd. Za distribuciju biblioteka, izradu i upravljanje ovisnostima, projekt razvija Cargo paket menadžer. Crates.io spremište je podržano za hostovanje biblioteka.
Sigurnost memorije je osigurana u Rustu u vrijeme kompajliranja kroz provjeru referenci, praćenje vlasništva nad objektom, praćenje životnog vijeka objekata (opsega) i procjenu ispravnosti pristupa memoriji tokom izvršavanja koda. Rust također pruža zaštitu od prekoračenja cijelih brojeva, zahtijeva obaveznu inicijalizaciju vrijednosti varijabli prije upotrebe, bolje obrađuje greške u standardnoj biblioteci, primjenjuje koncept nepromjenjivih referenci i varijabli po defaultu, nudi snažno statičko kucanje kako bi se minimizirale logičke greške.
Glavne inovacije:
- Moguće je koristiti umetke asemblerskog jezika, koji su traženi u aplikacijama koje trebaju kontrolirati izvršenje na niskom nivou ili biti u mogućnosti koristiti specijalizirane strojne instrukcije. Montažni umetci se dodaju pomoću makroa "asm!" i "global_asm!" koristeći sintaksu oblikovanja nizova za imenovanje registara slično onoj koja se koristi za zamjene stringova u Rustu. Kompajler podržava instrukcije za sklapanje za x86, x86-64, ARM, AArch64 i RISC-V arhitekture. Primjer umetanja: use std::arch::asm; // Pomnožimo x sa 6 koristeći pomake i sabirke 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);
- Dodata podrška za destrukturirane (paralelne) dodjele, u kojima je nekoliko osobina, isječaka ili struktura specificirano na lijevoj strani izraza. Na primjer: neka (a, b, c, d, e); (a, b) = (1, 2); [c, .., d, _] = [1, 2, 3, 4, 5]; Struktura { e, .. } = Struktura { e: 5, f: 3 }; assert_eq!([1, 2, 1, 4, 5], [a, b, c, d, e]);
- Omogućena je mogućnost specificiranja zadanih vrijednosti za const generike: struct ArrayStorage { arr: [T; N], } impl ArrayStorage { fn new(a: T, b: T) -> ArrayStorage { ArrayStorage { arr: [a, b], } } }
- Upravitelj paketa Cargo daje upozorenja o korištenju nevažećih struktura u ovisnostima koje se obrađuju zbog grešaka u kompajleru (na primjer, zbog greške je dozvoljeno posuđivanje polja upakovanih struktura u sigurnim blokovima). Takve konstrukcije više neće biti podržane u budućoj verziji Rusta.
- Cargo i rustc imaju ugrađenu mogućnost generiranja izvršnih datoteka bez podataka za otklanjanje grešaka (strip = "debuginfo") i simbola (strip = "symbols"), bez potrebe za pozivanjem posebnog uslužnog programa. Postavka čišćenja se implementira kroz parametar “strip” u Cargo.toml: [profile.release] strip = “debuginfo”, “symbols”
- Inkrementalna kompilacija je podrazumevano onemogućena. Rečeno je da je razlog privremeno rješenje za grešku u kompajleru koja dovodi do pada i grešaka deserializacije. Ispravka greške je već pripremljena i bit će uključena u sljedeće izdanje. Da biste vratili inkrementalnu kompilaciju, možete koristiti varijablu okruženja RUSTC_FORCE_INCREMENTAL=1.
- Novi dio API-ja je premješten u kategoriju stabilnih, uključujući metode i implementacije osobina koje su stabilizirane:
- std::thread::available_parallelism
- Rezultat::kopirano
- Rezultat::klonirano
- arch::asm!
- arch::global_asm!
- ops::ControlFlow::is_break
- ops::ControlFlow::is_continue
- TryFrom for u8
- char::TryFromCharError (klon, otklanjanje grešaka, prikaz, parcijalna jednačina, kopiranje, ekv, greška)
- 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 za strukturu ToLowercase
- DoubleEndedIterator za strukturu ToUppercase
- PokušajteFrom<&mut [T]> za [T; N]
- UnwindSafe za strukturu Once
- RefUnwindSafe za jednom
- armv8 neon podržava funkcije ugrađene u kompajler za aarch64
- Atribut "const", koji određuje mogućnost korištenja u bilo kojem kontekstu umjesto konstanti, koristi se u funkcijama:
- mem::MaybeUninit::as_ptr
- mem::MaybeUninit::assume_init
- mem::MaybeUninit::assume_init_ref
- ffi::CStr::from_bytes_with_nul_unchecked
izvor: opennet.ru
