Utgivningen av Rust 1.77 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:
- Lade till stöd för literaler för C-strängar (c"text"), vilka lagras i minnet med ett avslutande nulltecken och associeras med typen "CStr". Stöd för C-strängar förväntas förenkla skrivandet av kod som interagerar med lager i programmeringsspråk som använder null-terminerade strängar, och möjliggöra att nödvändiga kontroller utförs vid kompileringstillfället. const HALLO: &core::ffi::CStr = c"Hej världen!";
- Asynkront exekverade funktioner deklarerade med uttrycket "async fn" tillåts använda rekursion, d.v.s. sådana funktioner kan nu anropa sig själva. async fn fib(n: u32) -> u32 { matcha n { 0 | 1 => 1, _ => Box::pin(fib(n-1)).await + Box::pin(fib(n-2)).await } }
- Förskjutningen_av! Makrot har stabiliserats, vilket gör att du kan bestämma byte-offset för fält för strukturer, uppräkningar, unioner och tupler i förhållande till början av typen. I praktiken kan makrot vara användbart i situationer där du behöver arbeta på fältoffset-nivå i avsaknad av en typinstans. I synnerhet behövs offset_of-funktionen vid utveckling av lågnivåkomponenter som drivrutiner. använd std::mem; #[repr(C)] struct FieldStruct { första: u8, andra: u16, tredje: u8 } assert_eq!(mem::offset_of!(FieldStruct, första), 0); assert_eq!(mem::offset_of!(FieldStruct, sekund), 2); assert_eq!(mem::offset_of!(FieldStruct, tredje), 4);
- I Cargo-pakethanteraren, i releaseprofiler, är rensning av filer från felsökningsdata aktiverad som standard (strip = “debuginfo”), om inte felsökningsläget uttryckligen är aktiverat i Cargo-profilen, dvs. om parameter debug = 0.
- Alternativet "-Zthir-unsafeck=on" är aktiverat som standard, vilket ger en osäker kontroll för THIR (Typed High-Level Intermediate Representation).
- Lade till lint-kontroll för static_mut_refs för att ge en varning när referenser till föränderliga statiska värden används.
- Möjligheten att använda "Från<&[T;" typen har implementerats. N]>" för typen "Ko<[T]>". fn foo(data: impl Into >) { /* … */ } fn main() { foo(&[“hej”, “världen”]); }
- Kompilatorn tillhandahåller anpassning av 16-byte i128- och u128-typerna för x86-system.
- En ny del av API:t har flyttats till kategorin stabil, inklusive metoder och implementeringar av egenskaper har stabiliserats:
- array::each_ref
- array::each_mut
- kärna::net
- f32::round_ties_even
- f64::round_ties_even
- mem::offset_of!
- skiva::first_chunk
- skiva::first_chunk_mut
- skiva::split_first_chunk
- skiva::split_first_chunk_mut
- skiva::last_chunk
- skiva::last_chunk_mut
- skiva::split_last_chunk
- skiva::split_last_chunk_mut
- skiva::chunk_by
- skiva::chunk_by_mut
- Inbunden::karta
- File::create_new
- Mutex::clear_poison
- RwLock::clear_poison
- Implementerade tredje nivån av stöd för plattformarna aarch64-unknown-illumos, hexagon-unknown-none-elf, riscv32imafc-esp-espidf och riscv32im-risc0-zkvm-elf. Den tredje nivån innebär grundläggande stöd, men utan automatiserad testning, publicering av officiella versioner och kontroll av möjligheten att bygga kod.
Källa: opennet.ru
