Objavljen Rust 1.82. Novi preglednik temeljen na Rustu. Korištenje Rusta u Volvu

Objavljen je programski jezik opće namjene Rust 1.82, utemeljen na projektu Mozilla, ali sada razvijen pod pokroviteljstvom nezavisne neprofitne organizacije Rust Foundation. Jezik se fokusira na sigurnost memorije i pruža sredstva za postizanje visokog paralelizma poslova uz izbjegavanje upotrebe skupljača smeća i vremena izvođenja (vrijeme izvođenja je smanjeno na osnovnu inicijalizaciju i održavanje standardne biblioteke).

Rustove metode rukovanja memorijom spašavaju programere od pogrešaka pri manipuliranju pokazivačima i štite od problema koji nastaju zbog rukovanja memorijom na niskoj razini, kao što je pristup memorijskom području nakon što je ono oslobođeno, dereferenciranje nultih pokazivača, prekoračenje međuspremnika, itd. Za distribuciju biblioteka, pružanje nadogradnji i upravljanje ovisnostima, projekt razvija upravitelja paketa Cargo. Repozitorij crates.io podržan je za smještaj knjižnica.

Sigurnost memorije osigurana je u Rustu tijekom kompajliranja provjerom referenci, praćenjem vlasništva objekta, praćenjem životnih vijekova objekta (opsega) i procjenom ispravnosti pristupa memoriji tijekom izvođenja koda. Rust također pruža zaštitu od prekoračenja cjelobrojnih brojeva, zahtijeva obaveznu inicijalizaciju vrijednosti varijabli prije upotrebe, bolje obrađuje pogreške u standardnoj biblioteci, primjenjuje koncept nepromjenjivih referenci i varijabli prema zadanim postavkama, nudi snažno statično tipkanje za smanjenje logičkih pogrešaka.

Glavne inovacije:

  • Naredba “info” dodana je upravitelju paketa tereta za prikaz informacija o paketu u repozitoriju.
  • Dodana je podrška za sintaksu "use<..>" u "impl Trait", koja navodi informacije o skrivenim tipovima. Na primjer, "impl Trait + use<'x, T>" navodi da je samo parametre "x" i "T" dopušteno koristiti u skrivenom tipu.
  • Predložena je zasebna sintaksa za stvaranje neobrađenih pokazivača, koja zamjenjuje prethodno korištene makronaredbe: makronaredba “addr_of!(expr)” zamijenjena je operatorom “&raw const expr”, a makronaredba “addr_of_mut!(expr)” je zamijenjena operatorom “&raw mut" izraz". struct Packed { not_aligned_field: i32, } fn main() { let p = Packed { not_aligned_field: 1_82 }; // Stari način za stvaranje sirovog pokazivača neka ptr = std::ptr::addr_of!(p.not_aligned_field); // Novi način stvaranja neobrađenog pokazivača let ptr = &raw const p.not_aligned_field; let val = unsafe { ptr.read_unaligned() }; }
  • Sada je moguće definirati sigurne funkcije i konstante sa 'statičkim' životnim vijekom unutar extern blokova s ​​"unsafe" atributom (ranije su svi elementi u "unsafe extern" mogli imati samo "unsafe" atribut): unsafe extern { pub siguran statički TAU : f64; pub sigurno fn sqrt(x: f64) -> f64; pub nesigurno fn strlen(p: *const u8) -> veličina; }
  • Atributi no_mangle, link_section i export_name, koji mogu dovesti do nedefiniranog ponašanja, sada se smatraju nesigurnima i zahtijevaju izričitu oznaku "nesigurno", na primjer: #[unsafe(no_mangle)] pub fn my_global_function() { }
  • Usklađivanje uzorka omogućuje preskakanje praznih tipova, poput "enum Void {}" ili struktura s vidljivim praznim poljem. koristiti std::convert::Infallible; pub fn odmotaj_bez_panike (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 pri obradi nenumeričkih NaN vrijednosti (0.0/0.0), a također dopuštaju korištenje operacija s pomičnim zarezom u const fn.
  • Umetci sklopa pružaju mogućnost korištenja operanda s atributom "const" za izravnu upotrebu cjelobrojnih numeričkih vrijednosti bez prethodnog pohranjivanja u registar. const MSG: &str = "Zdravo, svijete!\n"; nesigurno { core::arch::asm!( "mov rdx, {LEN} // instrukcija 'mov rdx, 14′" bit će generirana, LEN = const MSG.len(), … ); }
  • Adresiranje izraza s atributom "static" dopušteno je u sigurnom kontekstu bez definiranja nesigurnog bloka (operatori "&raw mut" i "&raw const" ne utječu na vrijednost operanda i samo stvaraju pokazivač na njega): static mut STATIC_MUT: Tip = Tip::novo(); extern "C" { static EXTERN_STATIC: Vrsta; } fn main() { let static_mut_ptr = &raw mut STATIC_MUT; neka extern_static_ptr = &raw const EXTERN_STATIC; }
  • Novi dio API-ja premješten je u kategoriju stabilnih, uključujući metode i implementacije karakteristika koje su stabilizirane:
    • std::thread::Builder::spawn_neoznačeno
    • std::str::CharIndices::offset
    • std::option::Option::is_none_or
    • [T]::je_razvrstano
    • [T]::je_razvrstano_po
    • [T]::je_razvrstano_po_ključu
    • Iterator::je_sortirano
    • Iterator::is_sorted_by
    • Iterator::je_razvrstan_po_ključu
    • std::future::Ready::into_inner
    • std::iter::repeat_n
    • impl DoubleEndedIterator za Take

      Izvor: opennet.ru

Dodajte komentar