Në ditën e festimit të dhjetëvjetorit të lëshimit të gjuhës së programimit Rust 1.0 (projekti Rust u themelua në vitin 2006, lëshimi 0.1 u formua në vitin 2012, dhe versioni i parë stabil u propozua në vitin 2015) u publikua rishikimi Rust 1.87. Gjuha fokusohet në punën e sigurt me memorjen dhe ofron mjete për të arritur një paralelizëm të lartë në ekzekutimin e detyrave, duke shmangur përdorimin e mbledhësit të plehrave dhe runtime (runtime përfundon me inicializimin bazë dhe mbështetje për bibliotekën standarde).
Metodat e punës me kujtesën në Rust e çlirojnë zhvilluesin nga gabimet gjatë manipulimit me treguesit dhe e mbrojnë atë nga problemet që lindin për shkak të punës me kujtesën në nivel të ulët, si qasja në një zonë kujtese pas çlirimit të saj, dereferencimi i treguesve null, dalja jashtë kufijve të buffers etj. Për shpërndarjen e bibliothekave, sigurimin e ndërtimit dhe menaxhimin e varësive, projekti zhvillohet me menaxherin e paketave Cargo. Për mbështetje të bibliothekave, ekziston një repository crates.io.
Puna e sigurt me kujtesën sigurohet në Rust gjatë kompilimit përmes verifikimit të referencave, ndjekjes së pronësisë së objekteve, llogaritjes së kohëzgjatjes së jetës së objekteve (fushave të dukshmërisë) dhe vlerësimit të saktësisë së qasjes në kujtesë gjatë ekzekutimit të kodit. Rust gjithashtu ofron mjete për mbrojtjen nga tejkalimet e numrave të plotë, kërkon inicializimin e detyrueshëm të vlerave të variablave para përdorimit, trajton më mirë gabimet në bibliotekën standarde, aplikon konceptin e referencave dhe variablave të pandryshueshëm (immutable) si standard dhe ofron tipizimin e fortë statik për të minimizuar gabimet logjike.
Novitetet kryesore:
- Biblioteka standarde përfshin mbështetje për kanalet e paemëruar (anonymous pipe). Për të krijuar kanale të paemëruar, propozohet metoda std::io::pipe(), e cila mund të përdoret së bashku me std::process::Command për të përpunuar rrjedhat standarde të inputit dhe outputit, si dhe për të bashkuar rrjedhat stdout dhe stderr. use std::process::Command; use std::io::Read; let (mut recv, send) = std::io::pipe()?; let mut command = Command::new(«path/to/bin») // bashkimi i stdout dhe stderr në një kanal .stdout(send.try_clone()?) .stderr(send) .spawn()?; let mut output = Vec::new(); recv.read_to_end(&mut output)?; assert!(command.wait()?.success());
- Lejohet thirrja nga kodi tĂ« sigurt e shumicĂ«s sĂ« funksioneve tĂ« integruara (Intrinsics) std::arch. Ndryshimi aplikohet te funksionet e integruara std::arch, tĂ« cilat janĂ« tĂ« shĂ«nuara si unsafe vetĂ«m pĂ«r shkak tĂ« lidhjes me funksionalitete tĂ« caktuara, nĂ«se kĂ«to funksionalitete janĂ« aktivizuar. PĂ«r shembull, _mm256_add_epi32 mund tĂ« thirret nga kodi i sigurt, nĂ«se aplikacioni pĂ«rdor â#[target_feature(enable = «avx2»)]â.
- Nga blloqet «asm!» me kod assembler lejohet kalimi në blloqe me kod në gjuhën Rust, çka lehtëson zhvillimin e kodit me nivel të ulët, për shembull, realizimin e optimizimeve në bërthamë ose organizimin e bashkëpunimit me pajisjet. Pikëkalimi për komandën assembler «jmp» caktohet në makron «asm!» përmes një operandi të ri «label», që përmban një shprehje blloku me kod në gjuhën Rust. unsafe { asm!( «jmp {}», label { println!(«Kaluar nga asm!»); } ); }
- ĂshtĂ« e lejuar tĂ« specifikoni saktĂ«sisht llojet e pĂ«rgjithshme tĂ« kapura dhe jetĂ«gjatĂ«sinĂ« nĂ« pĂ«rkufizimet e tipave duke pĂ«rdorur tipet e kthimit 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; }
- Një grup i ri API u kalua në kategorinë e stabilizuar, përfshirë stabilizimin e metodave dhe implementimeve të trait-ëve:
- 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 për OwnedHandle
- impl From për OwnedHandle
- impl From për Stdio
- impl From për Stdio
- impl From për OwnedFd
- impl From për OwnedFd
- Box<MaybeUninit>::write
- impl TryFrom<Vec> për 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
- Priznaku «const» aplicohet në funksione:
- 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
- Niveli i dytë i mbështetjes për platformën e synuar i586-pc-windows-msvc është hequr. Rekomandohet të përdorni platformën i686-pc-windows-msvc, e cila ka mbështetje për instruktionet SSE2. Platforma i586-pc-windows-msvc ka humbur kuptimin, pasi për Windows 10 kërkohet mbështetje për SSE2, dhe versionet më të hershme të Windows nuk mbështeten në Rust.
Burimi: opennet.ru
