Uscita di Rust 1.93. Progetti Rex, Fjall 3 e Arti 1.9.0

È stata pubblicata la versione del linguaggio di programmazione Rust 1.93, originariamente sviluppato da Mozilla, ora mantenuto da un'organizzazione no-profit indipendente, la Rust Foundation. Il linguaggio è focalizzato sulla gestione sicura della memoria e offre strumenti per raggiungere elevate prestazioni di parallelismo nell'esecuzione delle attività, senza l'uso di un garbage collector e di un runtime (il runtime si riduce a una semplice inizializzazione e gestione 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 C standard Musl, inclusa nella fornitura di Rust, utilizzata per il linking statico su piattaforme di destinazione «*-linux-musl» (aarch64-unknown-linux-musl, x86_64-unknown-linux-musl, powerpc64le-unknown-linux-musl, ecc.) su sistemi privi di Musl, è stata aggiornata alla versione 1.2.5. La versione minima supportata di Musl per linking dinamico è stata anch'essa aggiornata alla release 1.2.5. In precedenza, in Rust era utilizzata la versione Musl 1.2.3, che presentava problemi nell'implementazione del DNS resolver. Nella versione Musl 1.2.4 è stata aggiunta la possibilità di inviare la richiesta via TCP in caso di fallimento con UDP nel DNS resolver, risolvendo il problema con richieste di grandi record DNS e migliorando la compatibilità con server DNS ricorsivi che non supportano la consegna parziale dei risultati nelle risposte UDP troncate. Nella versione Musl 1.2.5 è stata implementata la gestione delle risposte con lunghe sequenze CNAME nel DNS resolver, e risolto il problema per cui venivano scartate alcune risposte di grandi dimensioni trasmesse tramite TCP.
  • La libreria standard è stata riprogettata per risolvere problemi di rientrabilità quando utilizzata in allocatori di memoria globali scritti in Rust, con l'uso del macro std::thread_local! e della funzione std::thread::current, che portavano a ricorsioni infinite. Per evitare situazioni in cui std::thread_local! e std::thread::current richiamavano lo stesso allocatore utilizzato durante le operazioni di allocazione della memoria, ora vengono applicati direttamente meccanismi di allocazione della memoria di sistema.
  • All'interno dei blocchi «asm!» con codice assembly è ora consentito l'uso degli attributi «cfg», il che consente, ad esempio, di controllare l'attivazione di set estesi di istruzioni CPU nel contesto di singole espressioni all'interno del blocco asm (in precedenza, gli attributi «cfg» potevano essere specificati solo per l'intero blocco asm). asm!( // o global_asm! o naked_asm! «nop», #[cfg(target_feature = «sse2»)] «nop», // ... #[cfg(target_feature = «sse2»)] a = const 123, // utilizzato solo su sse2 );
  • Una nuova serie di API è stata trasformata in versioni stabili, inclusi i metodi stabilizzati e le implementazioni delle trait:
    • <[MaybeUninit]>::assume_init_drop
    • <[MaybeUninit]>::assume_init_ref
    • <[MaybeUninit]>::assume_init_mut
    • <[MaybeUninit]>::write_copy_of_slice
    • <[MaybeUninit]>::write_clone_of_slice
    • String::into_raw_parts
    • Vec::into_raw_parts
    • ::unchecked_neg
    • ::unchecked_shl
    • ::unchecked_shr
    • ::unchecked_shl
    • ::unchecked_shr
    • ::as_array
    • ::as_array_mut
    • ::as_array
    • ::as_mut_array
    • VecDeque::pop_front_if
    • VecDeque::pop_back_if
    • Duration::from_nanos_u128
    • char::MAX_LEN_UTF8
    • char::MAX_LEN_UTF16
    • std::fmt::from_fn
    • std::fmt::FromFn
  • La piattaforma target «riscv64a23-unknown-linux-gnu» è stata portata al secondo livello di supporto, che implica una garanzia di compilazione, ma l'assenza di garanzie durante il superamento del set di test.

In aggiunta, ci sono alcuni progetti correlati a Rust:

  • Per il kernel Linux si sta sviluppando il framework Rex, che consente di creare estensioni per il kernel Linux in Rust, utilizzabili per espandere la funzionalità del kernel al posto di eBPF. Rex fornisce le stesse garanzie di sicurezza di eBPF, ma utilizza le capacità di isolamento e sicurezza del linguaggio Rust e un runtime leggero. Non viene utilizzato un verificatore per questi programmi e i programmi vengono compilati in codice nativo dal compilatore Rust.

    Nei programmi Rex è permesso l'uso di un sottoinsieme del linguaggio Rust, fornendo garanzie di sicurezza. Attualmente, sono supportati 5 tipi di programmi eBPF: kprobe, perf_event, tracepoint, xdp e tc. È possibile invocare funzioni ausiliarie eBPF, interagire con le strutture map di eBPF, gestire le risorse del kernel, gestire eccezioni e utilizzare binding e astrazioni sulle strutture del kernel.

  • È disponibile il rilascio di Fjall 3, un archivio embedded scritto in Rust che lavora con dati in formato chiave-valore. La memorizzazione dei dati è effettuata sotto forma di log utilizzando un albero LSM (Log-Structured-Merge), come in RocksDB, dove le modifiche vengono registrate aggiungendo dati alla fine del file. Per interagire con il database è offerto un API in stile BTreeMap. Sono supportate funzionalità come spazi dei nomi, ricerca diretta e inversa basata su intervalli, compressione integrata, transazioni serializzabili, memorizzazione separata di chiavi e dei loro valori molto grandi, e manutenzione automatica in background del database. Il codice è aperto con licenza Apache 2.0.
  • Il progetto Tor ha rilasciato la versione Arti 1.9.0, un'implementazione degli strumenti Tor scritta in Rust. Quando il codice Arti raggiungerà un livello in grado di sostituire completamente la variante in C, gli sviluppatori di Tor intendono conferire ad Arti lo status di implementazione principale di Tor e gradualmente interrompere il supporto per l'implementazione in C. Nella nuova versione è continuata l'implementazione delle funzionalità per i relè e server le directory (Directory Authority), è stato migliorato il supporto per i porti dinamicamente assegnati (proxy.socks_listen = «auto»), è stata aggiunta un'API sperimentale per la gestione delle chiavi per i servizi onion.

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