Izdanje programskog jezika Rust 1.59 s podrškom za asemblerske umetke

Objavljen je programski jezik opće namjene Rust 1.59, 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:

  • Moguće je koristiti umetke asemblerskog jezika, koji su traženi u aplikacijama koje trebaju kontrolirati izvođenje na niskoj razini ili biti u mogućnosti koristiti specijalizirane strojne instrukcije. Montažni umetci se dodaju pomoću makronaredbi "asm!" i "globalni_asm!" koristeći sintaksu oblikovanja niza za imenovanje registara sličnu onoj koja se koristi za zamjene nizova u Rustu. Kompajler podržava upute za sklapanje za x86, x86-64, ARM, AArch64 i RISC-V arhitekture. Primjer umetanja: koristite std::arch::asm; // Množimo x sa 6 koristeći shifts i zbrajamo let mut x: u64 = 4; nesigurno { asm!( "mov {tmp}, {x}", "shl {tmp}, 1", "shl {x}, 2", "dodaj {x}, {tmp}", x = inout(reg ) x, tmp = out(reg) _, ); } assert_eq!(x, 4 * 6);
  • Dodana podrška za destrukturirane (paralelne) dodjele, u kojima je nekoliko značajki, odsječaka ili struktura navedeno 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 određivanja zadanih vrijednosti za const generike: struct ArrayStorage { arr: [T; N], } impl ArrayStorage { fn novo(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 pogrešaka u prevoditelju (na primjer, zbog pogreške, polja zapakiranih struktura bilo je dopušteno posuditi 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 pogrešaka (strip = "debuginfo") i simbola (strip = "symbols"), bez potrebe za pozivanjem posebnog uslužnog programa. Postavka čišćenja implementirana je kroz parametar "strip" u Cargo.toml: [profile.release] strip = "debuginfo", "symbols"
  • Inkrementalna kompilacija je prema zadanim postavkama onemogućena. Razlog je navodno privremeno rješenje za grešku u kompajleru koja dovodi do padova i grešaka deserijalizacije. Ispravak programske pogreške već je pripremljen i bit će uključen u sljedeće izdanje. Za vraćanje inkrementalne kompilacije, možete koristiti varijablu okruženja RUSTC_FORCE_INCREMENTAL=1.
  • Novi dio API-ja premješten je u kategoriju stabilnih, uključujući metode i implementacije karakteristika 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 za u8
    • char::TryFromCharError (Clone, Debug, Display, PartialEq, Copy, Eq, Error)
    • iter::zip
    • NonZeroU8::je_snaga_dva
    • NonZeroU16::je_snaga_dva
    • NonZeroU32::je_snaga_dva
    • NonZeroU64::je_snaga_dva
    • NonZeroU128::je_snaga_dva
    • DoubleEndedIterator za ToLowercase strukturu
    • DoubleEndedIterator za strukturu ToUppercase
    • TryFrom<&mut [T]> za [T; N]
    • UnwindSafe za strukturu Once
    • RefUnwindSafe za jednom
    • armv8 neon funkcije podrške 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_neoznačeno

Izvor: opennet.ru

Dodajte komentar