V deň oslavy desiateho výročia od vydania programovacieho jazyka Rust 1.0 (projekt Rust bol založený v roku 2006, vydanie 0.1 bolo vytvorené v roku 2012 a prvá stabilná verzia bola navrhnutá v roku 2015) bol zverejnený release Rust 1.87. Jazyk sa zameriava na bezpečné nakladanie s pamäťou a poskytuje prostriedky na dosiahnutie vysokého paralelizmu vykonávania úloh, pričom sa zaobíde bez použitia garbage collectora a runtime (runtime sa redukuje na základnú inicializáciu a sprievodnú činnosť štandardnej knižnice).
Metódy práce s pamäťou v Rust zbavujú vývojára chýb pri manipulácii s ukazovateľmi a chránia pred problémami, ktoré vznikajú z nízkoúrovňovej práce s pamäťou, ako je prístup do oblasti pamäte po jej uvoľnení, dereferencovanie nulových ukazovateľov, prekročenie hraníc bufra atď. Na distribúciu knižníc, zabezpečenie zostavy a správu závislostí sa vyvíja balíčkový manažér Cargo. Pre umiestnenie knižníc sa podporuje repozitár crates.io.
Bezpečné zaobchádzanie s pamäťou je v Rust zabezpečené už pri kompilácii prostredníctvom kontroly odkazov, sledovania vlastníctva objektov, zohľadňovania životnosti objektov (rozsah viditeľnosti) a posudzovania správnosti prístupu k pamäti počas vykonávania kódu. Rust tiež poskytuje prostriedky na ochranu pred celočíselnými pretečeniami, vyžaduje povinnú inicializáciu hodnôt premenných pred použitím, lepšie spracováva chyby v štandardnej knižnici, aplikuje koncept nemennosti (immutable) odkazov a premenných ako predvolené a ponúka silnú statickú typizáciu na minimalizáciu logických chýb.
Hlavné novinky:
- Do štandardnej knižnice bola pridaná podpora anonymných kanálov (anonymous pipe). Na vytvorenie anonymných kanálov bol navrhnutý metóda std::io::pipe(), ktorá sa môže používať v kombinácii s std::process::Command na spracovanie štandardných vstupných a výstupných tokov, ako aj na zlúčenie tokov 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") // zlúčenie stdout a stderr do jedného kanála .stdout(send.try_clone()?) .stderr(send) .spawn()?; let mut output = Vec::new(); recv.read_to_end(&mut output)?; assert!(command.wait()?.success());
- Povolil sa volanie z safe-kódu väčšiny zabudovaných funkcií (Intrinsics) std::arch. Zmena sa uplatňuje na zabudované funkcie std::arch, ktoré sú označené ako unsafe len kvôli väzbe na špecifickú funkcionalitu, ak je táto funkcionalita zapnutá. Napríklad, _mm256_add_epi32 je možné volať z safe-kódu, ak sa v aplikácii používa ‘#[target_feature(enable = "avx2")]’.
- Z blokov «asm!» s assemblerovým kódom je povolené uskutočňovať prechody na bloky s kódom v jazyku Rust, čo zjednodušuje vývoj nízkoúrovnového kódu, napríklad implementáciu optimalizácií v jadre alebo organizáciu interakcie s hardvérom. Bod pre prechod pre assemblerový príkaz «jmp» sa stanovuje v makre «asm!» pomocou nového operandu «label», ktorý obsahuje blokový výraz s kódom v jazyku Rust. unsafe { asm!( «jmp {}», label { println!(«Skok z asm!»); } ); }
- Povolené je presne uvádzať zachytené generické typy a časové trvanie v definíciách typov s použitím návratových typov 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; }
- Do oblasti stabilných bol prenesený nový balík API, vrátane stabilizovaných metód a implementácií traitov:
- 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
- Príznak „const“ bol použitý v funkciá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 pre cieľovú platformu i586-pc-windows-msvc bola odstránená. Odporúča sa používať platformu i686-pc-windows-msvc, ktorá sa líši podporou inštrukcií SSE2. Platforma i586-pc-windows-msvc stratila význam, pretože pre Windows 10 je potrebná podpora SSE2 a staršie verzie Windows v Rust nie sú podporované.
Zdroj: opennet.ru
