Rilascio del linguaggio di programmazione Rust 1.60

È stato pubblicato il rilascio del linguaggio di programmazione general-purpose Rust 1.60, fondato dal progetto Mozilla, ma ora sviluppato sotto gli auspici dell'organizzazione no-profit indipendente Rust Foundation. Il linguaggio si concentra sulla sicurezza della memoria e fornisce i mezzi per ottenere un elevato parallelismo del lavoro evitando l'uso di un Garbage Collector e del runtime (il runtime è ridotto all'inizializzazione di base e alla manutenzione della libreria standard).

I metodi di gestione della memoria di Rust salvano lo sviluppatore da errori durante la manipolazione dei puntatori e proteggono dai problemi che sorgono a causa della gestione della memoria di basso livello, come l'accesso a un'area di memoria dopo che è stata liberata, la dereferenziazione di puntatori nulli, sovraccarichi del buffer, ecc. Per distribuire le librerie, fornire build e gestire le dipendenze, il progetto sviluppa il gestore di pacchetti Cargo. Il repository crates.io è supportato per l'hosting di librerie.

La sicurezza della memoria viene fornita in Rust in fase di compilazione attraverso il controllo dei riferimenti, tenendo traccia della proprietà dell'oggetto, tenendo traccia della durata dell'oggetto (scopi) e valutando la correttezza dell'accesso alla memoria durante l'esecuzione del codice. Rust fornisce anche protezione contro gli overflow di numeri 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, offre una forte tipizzazione statica per ridurre al minimo gli errori logici.

Principali innovazioni:

  • Il compilatore rusticc dispone di un sistema stabilizzato basato su LLVM per la generazione di dati di copertura utilizzati per valutare la copertura del codice durante i test. Per abilitare i dati di copertura durante l'assemblaggio è necessario utilizzare il flag “-Cinstrument-coverage”, ad esempio avviando l'assemblaggio con il comando “RUSTFLAGS=”-C instrument-coverage” cargo build”. Dopo aver eseguito il file eseguibile compilato in questo modo, il file default.profraw verrà salvato nella directory corrente, per l'elaborazione della quale è possibile utilizzare l'utilità llvm-profdata dal componente llvm-tools-preview. L'output elaborato da llvm-profdata può quindi essere passato a llvm-cov per generare un report sulla copertura del codice con annotazioni. Le informazioni sul collegamento al codice sorgente vengono ricavate dal file eseguibile in esame, che contiene i dati necessari sul collegamento tra i contatori di copertura e il codice. 1| 1|fn principale() { 2| 1| println!("Ciao mondo!"); 3| 1|}
  • Nel gestore dei pacchetti cargo è stato stabilizzato il supporto al flag “-timings”, che prevede la generazione di un report dettagliato sullo stato di avanzamento della build e sul tempo di esecuzione di ogni step. Il report può essere utile per ottimizzare le prestazioni del processo di assemblaggio.
  • Il gestore dei pacchetti cargo offre una nuova sintassi per il meccanismo di compilazione condizionale e selezione delle dipendenze opzionali, configurata nel file Cargo.toml elencando un elenco di proprietà denominate nella sezione [features] e attivata abilitando le proprietà durante la creazione del pacchetto utilizzando il flag "--features". La nuova versione aggiunge il supporto per le dipendenze in spazi dei nomi separati e per le dipendenze deboli.

    Nel primo caso è possibile utilizzare elementi con prefisso “dep:” all'interno della sezione “[features]” per collegarsi esplicitamente ad una dipendenza opzionale senza rappresentare implicitamente tale dipendenza come una funzionalità. Nel secondo caso è stato aggiunto il supporto alla marcatura con il segno “?”. ("nome-pacchetto?/nome-funzione") dipendenze facoltative che dovrebbero essere incluse solo se qualche altra proprietà include la dipendenza facoltativa specificata. Ad esempio, nell'esempio seguente, abilitare la proprietà serde abiliterà la dipendenza "serde", così come la proprietà "serde" per la dipendenza "rgb", ma solo se la dipendenza "rgb" è abilitata altrove: [dipendenze] serde = { versione = " 1.0.133", opzionale = true } rgb = { versione = "0.8.25", opzionale = true } [caratteristiche] serde = ["dep:serde", "rgb?/serde"]

  • È stato ripristinato il supporto per la compilazione incrementale, che era disabilitata nell'ultima versione. Il bug del compilatore che causava la disabilitazione della funzionalità è stato risolto.
  • Risolti alcuni problemi relativi alla fornitura dei timer istantanei con garanzia di temporizzazione monotona, che tiene conto del tempo trascorso dal sistema in modalità sospensione. In precedenza, per il funzionamento del timer veniva utilizzata, quando possibile, l'API del sistema operativo, che non teneva conto di situazioni problematiche che interrompono la monotonia del tempo, come problemi hardware, utilizzo della virtualizzazione o errori nel sistema operativo.
  • Una nuova porzione dell'API è stata spostata nella categoria stabile, inclusi i metodi e le implementazioni dei tratti sono stati stabilizzati:
    • Arco::nuovo_ciclico
    • Rc::nuovo_ciclico
    • slice::EscapeAscii
    • <[u8]>::escape_ascii
    • u8::escape_ascii
    • Vec::spare_capacity_mut
    • ForseUninit::assume_init_drop
    • ForseUninit::assume_init_read
    • i8::diff_ass
    • i16::diff_ass
    • i32::diff_ass
    • i64::diff_ass
    • i128::diff_ass
    • issize::abs_diff
    • u8::diff_ass
    • u16::diff_ass
    • u32::diff_ass
    • u64::diff_ass
    • u128::diff_ass
    • usa::abs_diff
    • Visualizzazione per io::ErrorKind
    • Da per Codice di uscita
    • Non per ! (digitare "mai")
    • _Op_Assegna<$t>
    • arch::is_aarch64_feature_detected!
  • Il terzo livello di supporto è stato implementato per le piattaforme mips64-openwrt-linux-musl* e armv7-unknown-linux-uclibceabi (softfloat). Il terzo livello prevede il supporto di base, ma senza test automatizzati, pubblicazione di build ufficiali o verifica se il codice può essere creato.
  • Il compilatore è stato modificato per utilizzare LLVM 14.

Inoltre puoi notare:

  • Aggiunto il supporto per il bootstrap del compilatore ruggine utilizzando il backend rugginec_codegen_gcc, che consente di utilizzare la libreria libgccjit dal progetto GCC come generatore di codice in ruggine, che consente a ruggine di fornire supporto per le architetture e le ottimizzazioni disponibili in GCC. La promozione del compilatore implica la possibilità di utilizzare un generatore di codice basato su GCC in rusticc per creare il compilatore rusticc stesso. Dal punto di vista pratico, questa funzionalità consente di creare programmi Rust per architetture che non erano precedentemente supportate in Rustc.
  • È disponibile il rilascio del toolkit uutils coreutils 0.0.13, all'interno del quale è in fase di sviluppo un analogo del pacchetto GNU Coreutils, riscritto nel linguaggio Rust. Coreutils viene fornito con oltre un centinaio di utilità, tra cui sort, cat, chmod, chown, chroot, cp, date, dd, echo, hostname, id, ln e ls. L'obiettivo del progetto è creare un'implementazione alternativa multipiattaforma di Coreutils, in grado di funzionare su piattaforme Windows, Redox e Fuchsia, nonché di distribuire sotto la permissiva licenza MIT, invece della licenza copyleft GPL.

    La nuova versione ha migliorato le implementazioni di molte utilità, inclusa una compatibilità significativamente migliorata delle utilità cp, dd, df, split e tr con le loro controparti del progetto GNU. Documentazione online fornita. Il parser clap viene utilizzato per analizzare gli argomenti della riga di comando, che ha migliorato l'output per il flag "--help" e aggiunto il supporto per le abbreviazioni di comandi lunghi (ad esempio, puoi specificare "ls -col" invece di "ls -color ").

Fonte: opennet.ru

Aggiungi un commento