Uscita del linguaggio di programmazione Rust 1.77

È stata pubblicata la versione 1.77 del linguaggio di programmazione di uso generale Rust, originariamente sviluppato da Mozilla e ora mantenuto da un'organizzazione non profit indipendente, la Rust Foundation. Il linguaggio si concentra sulla gestione sicura della memoria e offre strumenti per raggiungere un elevato parallelo nell'esecuzione dei compiti, senza l'uso di garbage collector e 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 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:

  • È stata aggiunta la supporto per i letterali delle stringhe C (c»testo»), che sono memorizzati in memoria con un carattere di null terminator e associati al tipo «CStr». Si prevede che il supporto per le stringhe C semplifichi la scrittura di codice che interagisce con strati in linguaggi di programmazione che utilizzano stringhe terminate da byte null, consentendo anche le necessarie verifiche in fase di compilazione. const HELLO: &core::ffi::CStr = c»Hello, world!»;
  • Nelle funzioni eseguite in modo asincrono dichiarate con l'espressione «async fn», è ora consentito l'uso della ricorsione, ovvero queste funzioni possono ora chiamare se stesse. async fn fib(n: u32) -> u32 { match n { 0 | 1 => 1, _ => Box::pin(fib(n-1)).await + Box::pin(fib(n-2)).await } }
  • È stato stabilizzato il macro offset_of!, che consente di determinare l'offset in byte dei campi di strutture, enumerazioni, unioni e tuple, rispetto all'inizio del tipo. Nella pratica, il macro può essere utile in situazioni in cui è necessario lavorare a livello di offset dei campi in assenza di un'istanza del tipo. In particolare, la funzionalità di offset_of è necessaria nello sviluppo di componenti a basso livello, come i driver. use std::mem; #[repr(C)] struct FieldStruct { first: u8, second: u16, third: u8 } assert_eq!(mem::offset_of!(FieldStruct, first), 0); assert_eq!(mem::offset_of!(FieldStruct, second), 2); assert_eq!(mem::offset_of!(FieldStruct, third), 4);
  • Nel gestore di pacchetti Cargo, nei profili di rilascio è abilitata di default la pulizia dei file dai dati di debug (strip = «debuginfo»), se nel profilo Cargo non è esplicitamente attivata la modalità di debug, ovvero se il parametro debug = 0.
  • È attivata di default l'opzione «-Zthir-unsafeck=on», che garantisce il controllo di unsafe per la rappresentazione intermedia THIR («Typed High-Level Intermediate Representation»).
  • È stata aggiunta la verifica lint static_mut_refs per generare avvisi sull'uso di riferimenti a valori statici mutabili.
  • È stata implementata la possibilità di utilizzare il trait «From<&[T; N]>» per il tipo «Cow<[T]>». fn foo(data: impl Into<Cow<‘static, [&’static str]>>) { /* … */ } fn main() { foo(&[«hello», «world»]); }
  • Nel compilatore è garantito l'allineamento dei tipi i128 e u128 a 16 byte per sistemi x86.
  • Una nuova serie di API è stata traslata nella categoria stabile, stabilizzando i metodi e le implementazioni dei tipi:
    • array::each_ref
    • array::each_mut
    • core::net
    • f32::round_ties_even
    • f64::round_ties_even
    • mem::offset_of!
    • slice::first_chunk
    • slice::first_chunk_mut
    • slice::split_first_chunk
    • slice::split_first_chunk_mut
    • slice::last_chunk
    • slice::last_chunk_mut
    • slice::split_last_chunk
    • slice::split_last_chunk_mut
    • slice::chunk_by
    • slice::chunk_by_mut
    • Bound::map
    • File::create_new
    • Mutex::clear_poison
    • RwLock::clear_poison
  • È stato implementato il terzo livello di supporto per le piattaforme aarch64-unknown-illumos, hexagon-unknown-none-elf, riscv32imafc-esp-espidf e riscv32im-risc0-zkvm-elf. Il terzo livello implica supporto di base, ma senza test automatizzati, pubblicazione di build ufficiali e verifica della capacità di costruzione del codice.

Fonte: opennet.ru

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