Rust 1.82 objavljen. Novi pretraživač baziran na Rustu. Korištenje Rust u Volvu

Objavljeno je izdanje Rust 1.82 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:

  • Komanda “info” je dodana menadžeru teretnih paketa za prikaz informacija o paketu u spremištu.
  • Dodata podrška za "use<..>" sintaksu u "impl Trait", koja specificira informacije o skrivenim tipovima. Na primjer, "impl Trait + use<'x, T>" specificira da se samo parametri "x" i "T" smiju koristiti u skrivenom tipu.
  • Predložena je zasebna sintaksa za kreiranje sirovih pokazivača, koja zamjenjuje prethodno korištene makroe: makro “addr_of!(expr)” je zamijenjen operatorom “&raw const expr”, a makro “addr_of_mut!(expr)” je zamijenjen pomoću “&raw mut” operatora expr. struct Packed { not_aligned_field: i32, } fn main() { let p = Packed { not_aligned_field: 1_82 }; // Stari način za kreiranje sirovog pokazivača neka ptr = std::ptr::addr_of!(p.not_aligned_field); // Novi način za kreiranje sirovog pokazivača let ptr = &raw const p.not_aligned_field; let val = nesigurno { ptr.read_unaligned() }; }
  • Moguće je definirati sigurne funkcije i konstante sa 'statičkim' vijekom trajanja unutar eksternih blokova sa atributom "unsafe" (ranije su svi elementi u "unsafe extern" mogli imati samo atribut "unsafe"): unsafe extern { pub safe statički TAU: f64; pub sef fn sqrt(x: f64) -> f64; pub nesiguran fn strlen(p: *const u8) -> koristiti; }
  • Atributi no_mangle, link_section i export_name, koji mogu dovesti do nedefiniranog ponašanja, sada se smatraju nesigurnima i zahtijevaju eksplicitnu "nesigurnu" zastavicu, na primjer: #[unsafe(no_mangle)] pub fn my_global_function() { }
  • Uparivanje uzoraka omogućava preskakanje praznih tipova, kao što je "enum Void {}" ili strukture sa vidljivim praznim poljem. koristite std::convert::Infallible; pub fn unwrap_without_panic (x: Rezultat ) -> T { neka Ok(x) = x; // "Err" se može preskočiti x }
  • Tipovi za brojeve s pomičnim zarezom (f32 i f64) imaju standardizirano ponašanje prilikom obrade nenumeričkih NaN vrijednosti (0.0/0.0), a također dozvoljavaju korištenje operacija s pomičnim zarezom u const fn.
  • Umetci sklopa pružaju mogućnost korištenja operanada s atributom “const” za direktnu upotrebu cjelobrojnih numeričkih vrijednosti bez prethodnog pohranjivanja u registar. const MSG: &str = "Zdravo, svijete!\n"; unsafe { core::arch::asm!( “mov rdx, {LEN} // instrukcija 'mov rdx, 14′” će biti generisana, LEN = const MSG.len(), … ); }
  • Adresiranje izraza sa “statičnim” atributom je dozvoljeno u sigurnom kontekstu bez definiranja nesigurnog bloka (operatori “&raw mut” i “&raw const” ne utječu na vrijednost operanda i samo kreiraju pokazivač na njega): static mut STATIC_MUT: Tip = Tip::nov(); extern "C" { static EXTERN_STATIC: Tip; } fn main() { let static_mut_ptr = &raw mut STATIC_MUT; neka extern_static_ptr = &raw const EXTERN_STATIC; }
  • Novi dio API-ja je premješten u kategoriju stabilnih, uključujući metode i implementacije osobina koje su stabilizirane:
    • std::thread::Builder::spawn_unchecked
    • std::str::CharIndices::offset
    • std::option::Option::is_none_or
    • [T]::je_sortirano
    • [T]::je_sortirano_po
    • [T]::je_sortirano_po_ključu
    • Iterator::is_sorted
    • Iterator::is_sorted_by
    • Iterator::is_sorted_by_key
    • std::future::Ready::into_inner
    • std::iter::repeat_n
    • impl DoubleEndedIterator za Take

      izvor: opennet.ru

Dodajte komentar