Rilascio del linguaggio di programmazione Rust 1.57

È stata pubblicata la versione del linguaggio di programmazione di sistema Rust 1.57, nato dal progetto Mozilla, ma ora sviluppato sotto l'egida dell'organizzazione no-profit indipendente Rust Foundation. Il linguaggio si concentra sulla sicurezza della memoria, fornisce la gestione automatica della memoria e fornisce i mezzi per ottenere un elevato parallelismo delle attività senza utilizzare un garbage collector o un runtime (il runtime è ridotto all'inizializzazione di base e alla manutenzione della libreria standard).

La gestione automatica della memoria di Rust elimina gli errori durante la manipolazione dei puntatori e protegge dai problemi derivanti dalla manipolazione della memoria di basso livello, come l'accesso a una regione di memoria dopo che è stata liberata, dereferenziazioni di puntatori nulli, sovraccarichi del buffer, ecc. Per distribuire le librerie, garantire l'assemblaggio e gestire le dipendenze, il progetto sta sviluppando il gestore di pacchetti Cargo. Il repository crates.io è supportato per ospitare le librerie.

Principali innovazioni:

  • L'uso della macro “panico!” è stato stabilizzato. in contesti creati durante la compilazione, come le dichiarazioni "const fn". Inoltre, oltre a utilizzare "panico!" const consentono l'uso della macro “assert!”. e alcune altre API della libreria standard. La stabilizzazione non copre ancora l'intera infrastruttura di formattazione, quindi nella sua forma attuale la macro "panico!" può essere utilizzato solo con stringhe statiche (panic!(“...”)) o con un singolo valore interpolato "&str" in caso di sostituzione (panic!("{}", a)), che dovrebbe limitarsi alla sostituzione di "{ }" senza specificatori di formattazione e altri tipi. In futuro, l'applicabilità delle macro in contesti costanti verrà ampliata, ma le capacità stabilizzate sono già sufficienti per eseguire controlli di assert in fase di compilazione: const _: () = assert!(std::mem::size_of:: () == 64); const _: () = assert!(std::mem::size_of:: () == 8);
  • Il gestore pacchetti Cargo consente l'uso di profili con nomi arbitrari, non limitati a "dev", "release", "test" e "bench". Ad esempio, per abilitare l'ottimizzazione nella fase di collegamento (LTO) solo quando vengono generati gli assemblaggi del prodotto finale, è possibile creare un profilo di "produzione" in Cargo.toml e aggiungervi il flag "lto = true". Tuttavia, quando si definiscono i propri profili, è necessario specificare un profilo esistente da cui ereditare le impostazioni predefinite. L'esempio seguente crea un profilo "produzione" che integra il profilo "rilascio" includendo il flag "lto = true". Il profilo stesso viene attivato richiamando cargo con l'opzione “--profile production” e gli artefatti di assemblaggio verranno inseriti nella directory “target/production”. [profile.production] eredita = "rilascio" lto = true
  • Stabilizzato l'utilizzo di try_reserve per i tipi Vec, String, HashMap, HashSet e VecDeque, che permette di riservare anticipatamente spazio per un certo numero di elementi di un dato tipo in modo da ridurre la frequenza delle operazioni di allocazione della memoria ed evitare si blocca durante il funzionamento a causa della mancanza di memoria.
  • È consentito specificare macro con parentesi graffe in espressioni come "m!{ .. }.method()" e "m!{ .. }?".
  • L'esecuzione delle funzioni File::read_to_end e read_to_string è stata ottimizzata.
  • Il supporto per la specifica Unicode è stato aggiornato alla versione 14.0.
  • Ampliato il numero di funzioni contrassegnate con "#[must_use]" per emettere un avviso se il valore restituito viene ignorato, il che aiuta a identificare gli errori causati dal presupposto che una funzione modificherà i valori anziché restituire un nuovo valore.
  • Aggiunto backend sperimentale per la generazione di codice utilizzando libgccjit.
  • Una nuova porzione dell'API è stata spostata nella categoria stabile, inclusi i metodi e le implementazioni dei tratti sono stati stabilizzati:
    • [T; N]::as_mut_slice
    • [T; N]::come_fetta
    • collezioni::TryReserveError
    • HashMap::try_reserve
    • HashSet::try_reserve
    • Stringa::try_reserve
    • Stringa::try_reserve_exact
    • Vec::try_reserve
    • Vec::try_reserve_exact
    • VecDeque::try_reserve
    • VecDeque::try_reserve_exact
    • Iteratore::map_mentre
    • iter::MapWhile
    • proc_macro::è_disponibile
    • Comando::get_programma
    • Comando::get_args
    • Comando::get_envs
    • Comando::get_dir_corrente
    • ComandoArgs
    • CommandEnvs
  • L'attributo “const”, che determina se può essere utilizzato in qualsiasi contesto al posto delle costanti, viene utilizzato nella funzione hind::unreachable_unchecked.
  • Il terzo livello di supporto è stato implementato per armv6k-nintendo-3ds, armv7-unknown-linux-uclibceabihf, m68k-unknown-linux-gnu, aarch64-kmc-solid_asp3, armv7a-kmc-solid_asp3-eabi e armv7a-kmc- piattaforme solid_asp3-eabihf. Il terzo livello prevede il supporto di base, ma senza test automatizzati, pubblicazione di build ufficiali o verifica se il codice può essere creato.

Fonte: opennet.ru

Aggiungi un commento