PÄ dagen för firandet av tioÄrsjubileet av lanseringen av programmeringssprÄket Rust 1.0 (Rust-projektet startades 2006, version 0.1 skapades 2012 och den första stabila versionen föreslogs 2015) publicerades version 1.87 av Rust. SprÄket fokuserar pÄ sÀker minneshantering och erbjuder medel för att uppnÄ hög parallellism i exekvering av uppgifter, utan att anvÀnda en skrÀparesurs och runtime (runtime begrÀnsas till grundlÀggande initialisering och underhÄll av standardbiblioteket).
Minneshanteringsmetoderna i Rust skyddar utvecklare frÄn att göra fel vid manipulering av pekare och skyddar mot problem som uppstÄr vid lÄg nivÄ minnesarbete, sÄsom att komma Ät minnesomrÄden efter att de har frigjorts, dereferera nullpekare, buffer overflow, etc. För distribution av bibliotek, byggande och hantering av projektberoenden utvecklas paketförvaltaren Cargo. För lagring av bibliotek stöds ett repository pÄ crates.io.
SÀker minneshantering sÀkerstÀlls i Rust under kompilering genom att kontrollera referenser, spÄra Àgandeskap över objekt, ta hÀnsyn till livslÀngden av objekt (synlighet) och utvÀrdera korrekt minnesÄtkomst under körning av koden. Rust erbjuder ocksÄ verktyg för att skydda mot heltalsöverflöden, krÀver obligatorisk initialisering av variabelvÀrden innan de anvÀnds, hanterar fel bÀttre i standardbiblioteket, tillÀmpar konceptet av oförÀnderliga (immutable) referenser och variabler som standard och erbjuder stark statisk typning för att minimera logiska fel.
Huvudsakliga nyheter:
- Den standardbiblioteket har lagts till stöd för anonyma kanaler (anonymous pipe). Metoden std::io::pipe() har föreslagits för att skapa anonyma kanaler och kan anvÀndas tillsammans med std::process::Command för att hantera standard in- och utflöden, samt för att kombinera strömmarna stdout och stderr. use std::process::Command; use std::io::Read; let (mut recv, send) = std::io::pipe()?; let mut command = Command::new(«path/to/bin») // kombinera stdout och stderr i en kanal .stdout(send.try_clone()?) .stderr(send) .spawn()?; let mut output = Vec::new(); recv.read_to_end(&mut output)?; assert!(command.wait()?.success());
- Det Ă€r nu tillĂ„tet att anropa de flesta av de inbyggda funktionerna (Intrinsics) std::arch frĂ„n sĂ€kert kod. Ăndringen gĂ€ller inbyggda funktioner i std::arch som endast Ă€r mĂ€rkta som osĂ€kra pĂ„ grund av kopplingen till specifik funktionalitet om denna funktionalitet Ă€r aktiverad. Till exempel, _mm256_add_epi32 kan anropas frĂ„n sĂ€ker kod om applikationen anvĂ€nder â#[target_feature(enable = «avx2»)]â.
- FrÄn blocken «asm!» med assemblerkod Àr det nu tillÄtet att övergÄ till block med kod i Rust, vilket förenklar utvecklingen av lÄgnivÄkod, till exempel implementering av optimeringar i kÀrnan eller organisering av interaktion med maskinvaran. Punkten för övergÄng till assemblerkommandot «jmp» anges i makrot «asm!» med hjÀlp av den nya operanden «label», som innehÄller ett blockuttryck med kod pÄ Rust. unsafe { asm!( «jmp {}», label { println!(«Jumped from asm!»); } ); }
- Det Àr nu möjligt att exakt ange fÄngade generiska typer och livslÀngd i trait-definitioner med hjÀlp av ÄtervÀndande typer impl Trait. trait Foo { fn method(&'a self) -> impl Sized; type Implicit1: Sized; fn method_desugared(&'a self) -> Self::Implicit1; fn precise(&'a self) -> impl Sized + use; type Implicit2: Sized; fn precise_desugared(&'a self) -> Self::Implicit2; }
- En ny uppsÀttning API har blivit stabiliserad, inklusive stabilisering av metoder och implementeringar av traits:
- Vec::extract_if
- vec::ExtractIf
- LinkedList::extract_if
- linked_list::ExtractIf
- ::split_off
- ::split_off_mut
- ::split_off_first
- ::split_off_first_mut
- ::split_off_last
- ::split_off_last_mut
- String::extend_from_within
- os_str::Display
- OsString::display
- OsStr::display
- io::pipe
- io::PipeReader
- io::PipeWriter
- impl From for OwnedHandle
- impl From for OwnedHandle
- impl From for Stdio
- impl From for Stdio
- impl From for OwnedFd
- impl From for OwnedFd
- Box<MaybeUninit>::write
- impl TryFrom<Vec> for String
- ::offset_from_unsigned
- ::byte_offset_from_unsigned
- ::offset_from_unsigned
- ::byte_offset_from_unsigned
- NonNull::offset_from_unsigned
- NonNull::byte_offset_from_unsigned
- ::cast_signed
- NonZero::::cast_signed.
- ::cast_unsigned.
- NonZero::::cast_unsigned.
- ::is_multiple_of
- ::unbounded_shl
- ::unbounded_shr
- ::unbounded_shl
- ::unbounded_shr
- ::midpoint
- ::from_utf8
- ::from_utf8_mut
- ::from_utf8_unchecked
- ::from_utf8_unchecked_mut
- Indikatorn "const" har tillÀmpats i funktioner:
- core::str::from_utf8_mut
- ::copy_from_slice
- SocketAddr::set_ip
- SocketAddr::set_port,
- SocketAddrV4::set_ip
- SocketAddrV4::set_port,
- SocketAddrV6::set_ip
- SocketAddrV6::set_port
- SocketAddrV6::set_flowinfo
- SocketAddrV6::set_scope_id
- char::is_digit
- char::is_whitespace
- <N::as_flattened
- <N::as_flattened_mut
- String::into_bytes
- String::as_str
- String::capacity
- String::as_bytes
- String::len
- String::is_empty
- String::as_mut_str
- String::as_mut_vec
- Vec::as_ptr
- Vec::as_slice
- Vec::capacity
- Vec::len
- Vec::is_empty
- Vec::as_mut_slice
- Vec::as_mut_ptr
- Andra nivÄn av stöd för den riktade plattformen i586-pc-windows-msvc har tagits bort. Det rekommenderas att anvÀnda plattformen i686-pc-windows-msvc, som har stöd för SSE2-instruktioner. Plattformen i586-pc-windows-msvc har blivit meningslös, eftersom stöd för SSE2 krÀvs för Windows 10, och tidigare versioner av Windows stöds inte av Rust.
KĂ€lla: opennet.ru
