Cu ocazia aniversării a zece ani de la lansarea limbajului de programare Rust 1.0 (proiectul Rust a fost înființat în 2006, versiunea 0.1 a fost creată în 2012, iar prima versiune stabilă a fost propusă în 2015) a fost publicată versiunea Rust 1.87. Limbajul se concentrează pe gestionarea sigură a memoriei și oferă instrumente pentru a atinge un grad ridicat de paralelism în execuția sarcinilor, fără a folosi un colector de gunoi și runtime (runtime-ul se rezumă la inițializarea de bază și la întreținerea bibliotecii standard).
Metodele de gestionare a memoriei în Rust scutesc dezvoltatorul de erori în manipularea pointerilor și protejează împotriva problemelor care apar din lucrul de nivel scăzut cu memoria, cum ar fi accesarea unui spațiu de memorie după ce acesta a fost eliberat, dereferința pointerilor nuli, depășirea limitelor buffer-ului etc. Pentru distribuirea bibliotecilor, asigurarea construirii și gestionarea dependențelor, se dezvoltă managerul de pachete Cargo. Pentru găzduirea bibliotecilor, suportul este oferit prin intermediul repository-ului crates.io.
Lucrul sigur cu memoria este asigurat în Rust în timpul compilării prin verificarea referințelor, urmărirea proprietății obiectelor, luarea în considerare a timpului de viață al obiectelor (domeniul de vizibilitate) și evaluarea corectitudinii accesului la memorie în timpul execuției codului. Rust oferă, de asemenea, instrumente pentru protejarea împotriva suprasaturării numerice, impune inițializarea obligatorie a valorilor variabilelor înainte de utilizare, gestionează mai bine erorile în biblioteca standard, aplică conceptul de referințe și variabile imutabile (immutable) din oficiu și oferă o tipizare statică puternică pentru a minimiza erorile logice.
Noutăți principale:
- În biblioteca standard a fost adăugată suport pentru pipe-uri anonime. Metoda std::io::pipe() a fost propusă pentru a crea pipe-uri anonime, care pot fi utilizate împreună cu std::process::Command pentru a gestiona fluxurile de intrare și ieșire standard, precum și pentru a combina fluxurile stdout și stderr. use std::process::Command; use std::io::Read; let (mut recv, send) = std::io::pipe()?; let mut command = Command::new(«path/to/bin») /// unificarea stdout și stderr într-un singur canal .stdout(send.try_clone()?) .stderr(send) .spawn()?; let mut output = Vec::new(); recv.read_to_end(&mut output)?; assert!(command.wait()?.success());
- Apelul majorității funcțiilor încorporate în compilator (Intrinsics) std::arch este permis din cod sigur. Modificarea se aplică funcțiilor încorporate std::arch, care sunt marcate ca unsafe doar din cauza legăturii cu o funcționalitate specifică, dacă această funcționalitate este activată. De exemplu, _mm256_add_epi32 poate fi apelat din cod sigur, dacă aplicația folosește ‘#[target_feature(enable = «avx2»)]’.
- Este permisă efectuarea tranzițiilor din blocuri «asm!» cu cod assembler către blocuri cu cod în limbajul Rust, ceea ce simplifică dezvoltarea codului de nivel scăzut, de exemplu, implementarea optimizărilor în nucleu sau organizarea interacțiunii cu hardware-ul. Punctul de tranziție pentru comanda assembler «jmp» este specificat în macro-ul «asm!» printr-un nou operand «label», care conține o expresie bloc cu cod în limbajul Rust. unsafe { asm!( «jmp {}», label { println!(«Jumped from asm!»); } ); }
- Este permis să especificăm cu exactitate tipurile generice capturate și durata de viață în definițiile tipurilor folosind tipurile de returnare 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; }
- O nouă porțiune de API a fost transformată în stabilitate, inclusiv metode și implementări ale tiparelor stabilize.
- 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
- Semnul „const” aplicat în funcții:
- 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
- Suportul pentru platforma țintă i586-pc-windows-msvc a fost eliminat. Se recomandă utilizarea platformei i686-pc-windows-msvc, care diferă prin suportul instrucțiunilor SSE2. Platforma i586-pc-windows-msvc a devenit irelevantă, deoarece pentru Windows 10 este necesar suportul SSE2, iar versiunile anterioare de Windows nu sunt acceptate în Rust.
Sursa: opennet.ro
