Rilascio del linguaggio di programmazione Rust 1.38

pubblicato rilascio del linguaggio di programmazione del sistema Ruggine 1.38, fondato dal progetto Mozilla. Il linguaggio si concentra sulla sicurezza della memoria, fornisce la gestione automatica della memoria e fornisce un mezzo per ottenere un elevato parallelismo delle attività senza utilizzare un garbage collector o un runtime.

La gestione automatica della memoria di Rust libera lo sviluppatore dalla manipolazione dei puntatori e protegge dai problemi derivanti dalla manipolazione della memoria di basso livello, come accessi alla memoria after-free, dereferenziazioni di puntatori nulli, sovraccarichi del buffer e simili. È in fase di sviluppo un gestore di pacchetti per distribuire le librerie, garantire l'assemblaggio e gestire le dipendenze del progetto. ufficio, che ti consente di ottenere le librerie necessarie per il programma in un clic. È supportato un repository per ospitare le librerie casse.io.

Il principale innovazioni:

  • Aggiunta una modalità di compilazione pipeline (pipelined), in cui la compilazione di un pacchetto crate dipendente inizia non appena i metadati della dipendenza diventano disponibili, senza attendere il completamento della sua compilazione. Quando si compila un pacchetto, non è necessario che le dipendenze siano completamente assemblate, ma è sufficiente definire i metadati, che includono elenchi di tipi, dipendenze ed elementi esportati. I metadati vengono resi disponibili nelle prime fasi del processo di compilazione, quindi i pacchetti collegati ora possono essere compilati molto prima. Quando si creano pacchetti singoli, la modalità proposta non influisce sulle prestazioni, ma se la compilazione copre pacchetti con dipendenze ramificate, il tempo di compilazione complessivo può essere ridotto del 10-20%;
  • Garantisce il rilevamento dell'uso errato delle funzioni std::mem::non inizializzato и std::mem::azzerato. Ad esempio, std::mem::uninitialized è utile per creare rapidamente array, ma inganna il compilatore perché sembra inizializzato, ma in realtà il valore rimane non inizializzato. La funzione mem::uninitialized è già contrassegnata come deprecata e si consiglia invece di utilizzare un tipo intermedio ForseUnità. Per quanto riguarda mem::zeroed, questa funzione può causare problemi con tipi che non possono accettare valori zero.

    Per aiutare a identificare il comportamento indefinito, la nuova versione aggiunge un controllo lint al compilatore che rileva alcuni problemi con mem::uninitialized o mem::zeroed. Ad esempio, ora ricevi un errore quando provi a utilizzare mem::uninitialized o mem::zeroed con i tipi &T e Box‹T›, che rappresentano oggetti puntatore che non possono accettare valori null;

  • L'attributo "#[deprecato]" è stato espanso per consentire ai pacchetti di crate di essere contrassegnati come obsoleti e programmati per la futura eliminazione. A partire da Rust 1.38, questo attributo può essere utilizzato anche per le macro;
  • Aggiunta la possibilità di utilizzare l'attributo “#[global_allocator]” nei sottomoduli;
  • Funzione aggiunta std::any::nome_tipo, che permette di scoprire il nome del tipo, che può essere utile per scopi di debug. Ad esempio durante l'esecuzione del programma puoi scoprire per quale tipo è stata chiamata la funzione:

    fn valore_gen‹T: predefinito>() -› T {
    println!("Inizializzazione di un'istanza di {}", std::any::type_name::‹T›());
    Predefinito::predefinito()
    }

    fn principale() {
    let _: i32 = gen_value(); # Verrà stampato "i32".
    let _: String = gen_value(); # stamperà "alloc::string::String"
    }

  • Funzioni estese della libreria standard:
    • slice::{concat, connect, join} ora può assumere il valore &[T] oltre a &T;
    • "*const T" e "*mut T" ora implementano marker::Unpin;
    • "Arc‹[T]›" e "Rc‹[T]›" ora implementano FromIterator‹T›;
    • iter::{StepBy, Peekable, Take} ora implementa DoubleEndedIterator.
    • ascii::EscapeDefault implementa Clone e Display.
  • Una nuova porzione di API è stata trasferita nella categoria stabile, inclusi i metodi che sono stati stabilizzati
    • ‹*const T›::cast, ‹*mut T›::cast,
    • Durata::as_secs_f{32|64},
    • Durata::div_duration_f{32|64},
    • Durata::div_f{32|64},
    • Durata::da_sec_f{32|64},
    • Durata::mul_f{32|64},
    • operazioni di divisione con resto
      div_euclid e rem_euclid per tutte le primitive intere;

  • Aggiunto supporto per specificare più volte l'opzione "--features" per abilitare diverse funzionalità nel gestore dei pacchetti cargo;
  • Il compilatore ne fornisce un terzo livello supporto per piattaforme di destinazione aarch64-uwp-windows-msvc, i686-uwp-windows-gnu, i686-uwp-windows-msvc, x86_64-uwp-windows-gnu, x86_64-uwp-windows-msvc, armv7-unknown-linux -gnueabi, armv7-unknown-linux-musleabi, esagono-unknown-linux-musl e riscv32i-unknown-none-elf. Il terzo livello prevede il supporto di base, ma senza test automatizzati e pubblicazione di build ufficiali.

Fonte: opennet.ru

Aggiungi un commento