Rilascio di Rust 1.87

In occasione del decimo anniversario del rilascio del linguaggio di programmazione Rust 1.0 (il progetto Rust è stato avviato nel 2006, il rilascio 0.1 è stato completato nel 2012 e la prima versione stabile è stata proposta nel 2015), è stato pubblicato il rilascio di Rust 1.87. Il linguaggio si concentra su un uso sicuro della memoria e fornisce strumenti per raggiungere un elevato parallelismo nell'esecuzione dei compiti, evitando l'uso di garbage collector e runtime (il runtime si limita a una semplice inizializzazione e al supporto della libreria standard).

I metodi di gestione della memoria in Rust liberano gli sviluppatori dagli errori nella manipolazione dei puntatori e li proteggono da problematiche derivanti dal lavoro a basso livello con la memoria, come l'accesso a zone di memoria dopo la loro liberazione, la dereferenziazione di puntatori nulli, il superamento dei limiti del buffer, e così via. Per la distribuzione delle librerie, la gestione della compilazione e delle dipendenze, si è sviluppato un gestore di pacchetti chiamato Cargo. Le librerie sono ospitate nel repository crates.io.

La gestione sicura della memoria in Rust è garantita durante la compilazione tramite il controllo dei riferimenti, il tracciamento della proprietà degli oggetti, la gestione della durata degli oggetti (scope) e la valutazione della correttezza dell'accesso alla memoria durante l'esecuzione del codice. Rust offre anche strumenti per proteggere da overflow interi, richiede l'inizializzazione obbligatoria dei valori 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 ridurre al minimo gli errori logici.

Novità principali:

  • La libreria standard ha aggiunto il supporto per i canali anonimi (anonymous pipe). È stato proposto il metodo std::io::pipe() per creare canali anonimi, che possono essere utilizzati insieme a std::process::Command per gestire gli stream di input e output standard, e anche per unire gli stream 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") // unione di stdout e stderr in un unico canale .stdout(send.try_clone()?) .stderr(send) .spawn()?; let mut output = Vec::new(); recv.read_to_end(&mut output)?; assert!(command.wait()?.success());
  • È consentito chiamare la maggior parte delle funzioni incorporate (Intrinsics) std::arch da codice safe. La modifica si applica alle funzioni incorporate std::arch, contrassegnate come unsafe solo a causa della loro dipendenza da specifiche funzionalità, se tali funzionalità sono abilitate. Ad esempio, _mm256_add_epi32 può essere chiamato da codice safe, se l'applicazione utilizza '#[target_feature(enable = "avx2")]'.
  • È consentito effettuare salti da blocchi 'asm!' contenenti codice assembly a blocchi di codice Rust, semplificando lo sviluppo di codice a basso livello, come l'implementazione di ottimizzazioni nel kernel o l'interazione con l'hardware. Il punto di salto per il comando assembly "jmp" è definito nel macro "asm!" utilizzando un nuovo operando "label", contenente un'espressione di blocco con codice scritto in Rust. unsafe { asm!( "jmp {}", label { println!("Jumped from asm!"); } ); }
  • È consentito specificare con precisione i tipi generici catturati e i tempi di vita nelle definizioni dei trait utilizzando i tipi di ritorno 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 traslata nella categoria stabile, stabilizzando i metodi e le implementazioni dei tipi:
    • 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 flag «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
  • È stato rimosso il secondo livello di supporto per la piattaforma target i586-pc-windows-msvc. Si consiglia di utilizzare la piattaforma i686-pc-windows-msvc, che offre il supporto per le istruzioni SSE2. La piattaforma i586-pc-windows-msvc non ha più senso, poiché Windows 10 richiede il supporto SSE2, e le versioni precedenti di Windows non sono supportate in Rust.

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