Release av programmeringsspråket Rust 1.59 med stöd för monteringsinsatser

Utgivningen av Rust 1.59 allmänt programmeringsspråk, grundat av Mozilla-projektet, men nu utvecklat under överinseende av den oberoende ideella organisationen Rust Foundation, har publicerats. Språket fokuserar på minnessäkerhet och ger möjlighet att uppnå hög jobbparallellism samtidigt som man undviker användningen av en skräpsamlare och körtid (körtiden reduceras till grundläggande initiering och underhåll av standardbiblioteket).

Rusts minneshanteringsmetoder räddar utvecklaren från fel vid manipulering av pekare och skyddar mot problem som uppstår på grund av minneshantering på låg nivå, som att komma åt ett minnesområde efter att det har frigjorts, avläsning av nollpekare, buffertöverskridningar, etc. För att distribuera bibliotek, tillhandahålla builds och hantera beroenden utvecklar projektet Cargo package manager. Crates.io-förvaret stöds för värdbibliotek.

Minnessäkerhet tillhandahålls i Rust vid kompilering genom referenskontroll, hålla reda på objektägande, hålla reda på objektlivslängder (scopes) och bedöma riktigheten av minnesåtkomst under kodexekvering. Rust ger också skydd mot heltalsspill, kräver obligatorisk initiering av variabelvärden innan användning, hanterar fel bättre i standardbiblioteket, tillämpar konceptet med oföränderliga referenser och variabler som standard, erbjuder stark statisk typning för att minimera logiska fel.

Huvudsakliga innovationer:

  • Det är möjligt att använda assembly-språkinlägg, som efterfrågas i applikationer som behöver styra utförande på låg nivå eller kunna använda specialiserade maskininstruktioner. Monteringsinlägg läggs till med hjälp av makron "asm!" och "global_asm!" använder strängformateringssyntax för att namnge register liknande den som används för strängersättningar i Rust. Kompilatorn stöder monteringsinstruktioner för x86, x86-64, ARM, AArch64 och RISC-V arkitekturer. Insättningsexempel: använd std::arch::asm; // Multiplicera x med 6 med skift och addera let mut x: u64 = 4; osäker { asm!( "mov {tmp}, {x}", "shl {tmp}, 1", "shl {x}, 2", "lägg till {x}, {tmp}", x = inout(reg ) x, tmp = out(reg) _, ); } assert_eq!(x, 4 * 6);
  • Tillagt stöd för destrukturerade (parallella) uppdrag, där flera egenskaper, segment eller strukturer anges på vänster sida av uttrycket. Till exempel: låt (a, b, c, d, e); (a, b) = (1, 2); [c, .., d, _] = [1, 2, 3, 4, 5]; Struktur { e, .. } = Struktur { e: 5, f: 3 }; assert_eq!([1, 2, 1, 4, 5], [a, b, c, d, e]);
  • Möjligheten att ange standardvärden för const generics har tillhandahållits: struct ArrayStorage { arr: [T; N], } impl ArrayStorage { fn new(a: T, b: T) -> ArrayStorage { ArrayStorage { arr: [a, b], } } }
  • Lastpakethanteraren ger varningar om användningen av ogiltiga strukturer i beroenden som bearbetas på grund av fel i kompilatorn (till exempel på grund av ett fel fick fält med packade strukturer lånas i säkra block). Sådana konstruktioner kommer inte längre att stödjas i en framtida version av Rust.
  • Cargo och rustc har en inbyggd förmåga att generera körbara filer utan att behöva anropa ett separat verktyg. Rengöringsinställningen implementeras genom parametern "strip" i Cargo.toml: [profile.release] strip = "debuginfo", "symbols"
  • Inkrementell kompilering är inaktiverad som standard. Anledningen sägs vara en tillfällig lösning för en bugg i kompilatorn som leder till krascher och deserialiseringsfel. En buggfix har redan förberetts och kommer att inkluderas i nästa utgåva. För att returnera inkrementell kompilering kan du använda miljövariabeln RUSTC_FORCE_INCREMENTAL=1.
  • En ny del av API:t har flyttats till kategorin stabil, inklusive metoder och implementeringar av egenskaper har stabiliserats:
    • std::thread::available_parallelism
    • Resultat::kopierat
    • Resultat::klonad
    • arch::asm!
    • arch::global_asm!
    • ops::ControlFlow::is_break
    • ops::ControlFlow::is_continue
    • TryFrom för u8
    • char::TryFromCharError (Clone, Debug, Display, PartialEq, Copy, Eq, Error)
    • 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 för Tolowercase-struktur
    • DoubleEndedIterator för ToUppercase-struktur
    • TryFrom<&mut [T]> för [T; N]
    • UnwindSafe for the Once-strukturen
    • RefUnwindSafe för en gångs skull
    • armv8 neon stödfunktioner inbyggda i kompilatorn för aarch64
  • Attributet "const", som bestämmer möjligheten att använda det i alla sammanhang istället för konstanter, används i funktioner:
    • mem::MaybeUninit::as_ptr
    • mem::MaybeUninit::assume_init
    • mem::MaybeUninit::assume_init_ref
    • ffi::CStr::from_bytes_with_nul_unchecked

Källa: opennet.ru

Lägg en kommentar