V den oslav desátého výročí vydání programovacího jazyka Rust 1.0 (projekt Rust byl založen v roce 2006, vydání 0.1 proběhlo v roce 2012 a první stabilní verze byla navržena v roce 2015) byl zveřejněn release Rust 1.87. Jazyk se zaměřuje na bezpečnou práci s pamětí a poskytuje prostředky pro dosažení vysokého paralelismu zpracování úloh, přičemž se obejde bez použití správy paměti a runtime (runtime se omezuje na základní inicializaci a údržbu standardní knihovny).
Metody práce s pamětí v Rustu zbavují vývojáře chyb při manipulaci s ukazateli a chrání před problémy, které vznikají z nízkoúrovňové manipulace s pamětí, jako je přístup k oblasti paměti po jejím uvolnění, dereferencování nulových ukazatelů, přetečení bufferu atd. Pro distribuci knihoven, zajištění sestavení a správu závislostí se vyvíjí balíčkový manažer Cargo. Pro hostování knihoven je k dispozici repozitář crates.io.
Bezpečné manipulace s pamětí jsou v Rustu zajištěny během kompilace prostřednictvím kontroly referencí, sledování vlastnictví objektů, zohlednění doby života objektů (viditelnosti) a hodnocení správnosti přístupu k paměti při vykonávání kódu. Rust také poskytuje prostředky pro ochranu proti přetečení celých čísel, vyžaduje povinnou inicializaci hodnot proměnných před použitím, lépe zpracovává chyby ve standardní knihovně, aplikuje koncept neměnnosti (immutable) referencí a proměnných ve výchozím nastavení a nabízí silnou statickou typizaci pro minimalizaci logických chyb.
Hlavní novinky:
- Do standardní knihovny byla přidána podpora anonymních kanálů (anonymous pipe). Pro vytvoření anonymních kanálů byl navržen metod std::io::pipe(), který lze použít ve spojení s std::process::Command pro zpracování standardních vstupních a výstupních proudů, stejně jako pro sloučení proudů stdout a stderr. use std::process::Command; use std::io::Read; let (mut recv, send) = std::io::pipe()?; let mut command = Command::new("path/to/bin") // sloučení stdout a stderr do jednoho kanálu .stdout(send.try_clone()?) .stderr(send) .spawn()?; let mut output = Vec::new(); recv.read_to_end(&mut output)?; assert!(command.wait()?.success());
- Byl povolen požadavek na většinu zabudovaných funkcí kompilátoru (Intrinsics) std::arch z safe-kódu. Změna se vztahuje na zabudované funkce std::arch, které jsou označeny jako unsafe pouze kvůli vazbě na určitou funkčnost, pokud je tato funkčnost povolena. Například, _mm256_add_epi32 lze volat z safe-kódu, pokud aplikace používá ‘#[target_feature(enable = "avx2")]’.
- Z bloků „asm!“ s assemblerovým kódem bylo povoleno provádět skoky na bloky s kódem v jazyce Rust, což usnadňuje vývoj low-level kódu, například implementaci optimalizací v jádře nebo organizaci interakce s hardwarem. Místo pro skok pro assemblerovou instrukci „jmp“ je určeno v makru „asm!“ pomocí nového operandu „label“, který obsahuje blokový výraz s kódem v jazyce Rust. unsafe { asm!( "jmp {}", label { println!("Skoku z asm!"); } ); }
- Je povoleno přesně vymezit zachycené obecné typy a dobu jejich života v definicích vlastních typů pomocí vracených typů 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; }
- Nová sada API byla převedena do stabilního stavu, včetně stabilizovaných metod a implementací typů:
- 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
- Příznak „const“ byl použit ve funkcích:
- 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
- Druhý úroveň podpory pro cílovou platformu i586-pc-windows-msvc byla odstraněna. Doporučuje se použít platformu i686-pc-windows-msvc, která se liší podporou instrukcí SSE2. Platforma i586-pc-windows-msvc ztratila smysl, protože pro Windows 10 je potřebná podpora SSE2, zatímco starší verze Windows v Rustu nejsou podporovány.
Zdroj: opennet.ru
