A Rust 1.0 programozási nyelv kiadásának tizedik évfordulóján (a Rust projekt 2006-ban indult, az 0.1-es verzió 2012-ben készült el, az első stabil verziót pedig 2015-ben javasolták) megjelent a Rust 1.87. A nyelv a memória biztonságos kezelésére összpontosít, és eszközöket biztosít a feladatok magas párhuzamosságú végrehajtásához, mindezt anélkül, hogy szemétgyűjtőt és futtatási időt (runtime) használna (a futtatási idő a standard könyvtár alap inicializálására és karbantartására korlátozódik).
A Rust memória kezelésének módszerei megszüntetik a fejlesztők hibáit a mutatókkal való manipulálás során, és védelmet nyújtanak az alacsony szintű memória kezelésből adódó problémákkal szemben, mint például a már felszabadított memória területére való hivatkozás, null-pointer dereferálás, pufferméret túllépés stb. A könyvtárak terjesztésére, a build biztosítására és a függőségek kezelésére a Cargo csomagkezelő fejlesztés alatt áll. A könyvtárak elhelyezésére a crates.io tároló támogatott.
A memória biztonságos kezelése a Rustban a fordítási időben történik, a hivatkozások ellenőrzésén, az objektumok tulajdonjogának nyomon követésén, az objektumok élettartamának (láthatóságának) figyelembevételén és a memória hozzáférésének helyességének értékelésén keresztül a kód futtatásakor. A Rust emellett eszközöket biztosít az egész számok túllépésének elleni védelemhez, kötelezővé teszi a változók értékeinek inicializálását használat előtt, jobban kezeli a hibákat a standard könyvtárban, alkalmazza a változatlan (immutable) hivatkozások és változók fogalmát alapértelmezés szerint, és erős statikus típussal minimalizálja a logikai hibákat.
Főbb újítások:
- A standard könyvtárba bevezetésre került az anonim csatornák (anonymous pipe) támogatása. Az anonim csatornák létrehozására a std::io::pipe() metódus javasolt, amelyet a std::process::Command-dal lehet használni a standard bemeneti és kimeneti folyamatok feldolgozásához, valamint a stdout és stderr folyamatok egyesítésére. use std::process::Command; use std::io::Read; let (mut recv, send) = std::io::pipe()?; let mut command = Command::new("path/to/bin") // stdout és stderr egy csatornába egyesítése .stdout(send.try_clone()?) .stderr(send) .spawn()?; let mut output = Vec::new(); recv.read_to_end(&mut output)?; assert!(command.wait()?.success());
- Engedélyezve van a safe-kódból történő hívás a legtöbb beépített függvényre (Intrinsics) std::arch. A módosítás a std::arch beépített függvényeire vonatkozik, amelyeket csak a bizonyos funkcionalitáshoz való kötődés miatt jelöltek unsafe-ként, ha ez a funkcionalitás engedélyezve van. Például az _mm256_add_epi32 biztonságos kódból hívható, ha az alkalmazásban a '#[target_feature(enable = "avx2")]' van használatban.
- Az „asm!” blokkokból, amelyek assembler kódot tartalmaznak, megengedett az ugrások végrehajtása Rust nyelvű kódokra, ami megkönnyíti az alacsony szintű kód fejlesztését, például optimalizációk végrehajtását a kernelben vagy a hardverrel való kölcsönhatás szervezését. Az ugrási pont az assembler utasítás számára a "jmp" az „asm!” makróban van megadva egy új operátorral, a "label"-lel, amely tartalmaz egy blokkváltozatot Rust nyelven. unsafe { asm!( "jmp {}", label { println!("Ugrás asm-ból!"); } ); }
- Lehetővé teszi pontosan megadni a megszerzett általános típusokat és az élettartamokat a típusdefiníciókban az impl Trait által visszaadott típusok használatával. 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; }
- Új API-k kerültak a stabil kiadások közé, beleértve a metódusok és típusimplementációk stabilizálását:
- 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
- A «const» jelző alkalmazása a funkciókban:
- 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
- A célplatform i586-pc-windows-msvc második szintű támogatása eltávolítva. Ajánlott az i686-pc-windows-msvc platform használata, amely támogatja az SSE2 utasításokat. Az i586-pc-windows-msvc platform már nem releváns, mivel a Windows 10 SSE2 támogatását igényli, és a Rust nem támogatja a régebbi Windows kiadásokat.
Forrás: opennet.ru
