Uscita di Rust 1.87.

Nel giorno della celebrazione del decimo anniversario del rilascio del linguaggio di programmazione Rust 1.0 (il progetto Rust è stato fondato nel 2006, la versione 0.1 è stata creata nel 2012 e la prima versione stabile è stata proposta nel 2015) è stata pubblicata la versione Rust 1.87. Il linguaggio è incentrato sulla gestione sicura della memoria e fornisce strumenti per ottenere un alto parallelismo nell'esecuzione delle attività, facendo a meno di un garbage collector e di un runtime (il runtime si limita all'inizializzazione di base e al supporto della libreria standard).

I metodi di gestione della memoria in Rust liberano gli sviluppatori dagli errori di manipolazione dei puntatori e li proteggono da problemi derivanti da operazioni a basso livello con la memoria, come l'accesso a aree di memoria dopo il loro rilascio, la dereferenziazione di puntatori nulli, l'uscita dai limiti del buffer, ecc. Per la distribuzione delle librerie, l'assicurazione della compilazione e la gestione delle dipendenze, il progetto promuove il gestore di pacchetti Cargo. È supportato un repository per l'hosting delle librerie su crates.io.

La gestione sicura della memoria in Rust è garantita durante la compilazione attraverso il controllo dei riferimenti, il tracciamento della proprietà degli oggetti, la considerazione del tempo di vita degli oggetti (ambiti di visibilità) e la valutazione della correttezza dell'accesso alla memoria durante l'esecuzione del codice. Rust fornisce anche strumenti per proteggere da overflow interi, richiede l'inizializzazione obbligatoria delle variabili prima dell'uso, gestisce meglio gli errori nella libreria standard, applica il concetto di riferimenti e variabili immutabili per impostazione predefinita e offre una forte tipizzazione statica per minimizzare gli errori logici.

Novità principali:

  • La libreria standard ha aggiunto il supporto per pipe anonime. Per creare pipe anonime è stato proposto il metodo std::io::pipe(), che può essere utilizzato insieme a std::process::Command per gestire i flussi di input e output standard, oltre che per combinare i flussi stdout e stderr. use std::process::Command; use std::io::Read; let (mut recv, send) = std::io::pipe()?; let mut command = Command::new(«path/to/bin») // combinazione di stdout e stderr in un'unica pipe .stdout(send.try_clone()?) .stderr(send) .spawn()?; let mut output = Vec::new(); recv.read_to_end(&mut output)?; assert!(command.wait()?.success());
  • È stato consentito il richiamo da codice safe della maggior parte delle funzioni integrate nel compilatore (Intrinsics) std::arch. La modifica si applica alle funzioni integrate std::arch, che sono contrassegnate come unsafe solo a causa di vincoli a funzionalità specifiche, se tale funzionalità è abilitata. Ad esempio, _mm256_add_epi32 può essere richiamato da codice safe, se l'applicazione utilizza ‘#[target_feature(enable = «avx2»)]’.
  • Dai blocchi «asm!» contenenti codice assembler, è consentito effettuare salti verso blocchi con codice in Rust, semplificando lo sviluppo di codice a basso livello, ad esempio, implementazioni di ottimizzazioni nel kernel o organizzazioni di interazione con l'hardware. Il punto di salto per il comando assembler «jmp» è definito nel macro «asm!» utilizzando il nuovo operando «label», che contiene un'espressione di blocco con codice in Rust. unsafe { asm!( «jmp {}», label { println!(«Jumped from asm!»); } ); }
  • È consentito specificare con precisione i tipi generali acquisiti e la vita utile nelle definizioni dei trait utilizzando i tipi restituiti 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; }
  • Una nuova serie di API è stata trasformata in versioni stabili, inclusi i metodi stabilizzati e le implementazioni delle trait:
    • 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
  • Il segnale «const» è stato applicato nelle funzioni:
    • 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
  • Il secondo livello di supporto per la piattaforma target i586-pc-windows-msvc è stato rimosso. Si consiglia di utilizzare la piattaforma i686-pc-windows-msvc, che supporta le istruzioni SSE2. La piattaforma i586-pc-windows-msvc ha perso significato, poiché il supporto SSE2 è necessario per Windows 10, e le versioni precedenti di Windows in Rust non sono più supportate.

Fonte: opennet.ru

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster