Rilascio del linguaggio di programmazione Rust 1.75 e unikernel Hermit 0.6.7

È stato pubblicato il rilascio del linguaggio di programmazione general-purpose Rust 1.75, 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:

  • Aggiunta la possibilità di utilizzare "async fn" e la notazione "->impl Trait" nei tratti privati. Ad esempio, utilizzando “->impl Trait” puoi scrivere un metodo trait che restituisce un iteratore: trait Container { fn items(&self) -> impl Iterator; } Contenitore impl per MyContainer { fn items(&self) -> impl Iterator { self.items.iter().cloned() } }

    Puoi anche creare tratti usando "async fn": trait HttpService { async fn fetch(&self, url: Url) -> HtmlBody; // verrà espanso in: // fn fetch(&self, url: Url) -> impl Future; }

  • Aggiunta API per il calcolo degli offset dei byte relativi ai puntatori. Quando si lavora con puntatori semplici (“*const T” e “*mut T”), potrebbero essere necessarie operazioni per aggiungere un offset al puntatore. In precedenza, era possibile utilizzare una costruzione come “::add(1)”, aggiungendo il numero di byte corrispondente alla dimensione di “size_of::()”. La nuova API semplifica questa operazione e rende possibile manipolare gli offset dei byte senza prima convertire i tipi in "*const u8" o "*mut u8".
    • puntatore::byte_aggiungi
    • puntatore::byte_offset
    • puntatore::byte_offset_from
    • puntatore::byte_sub
    • puntatore::wrapping_byte_add
    • puntatore::wrapping_byte_offset
    • puntatore::wrapping_byte_sub
  • Lavoro continuo per aumentare le prestazioni del compilatore rusticc. Aggiunto l'ottimizzatore BOLT, che viene eseguito nella fase post-collegamento e utilizza le informazioni di un profilo di esecuzione pre-preparato. L'utilizzo di BOLT consente di accelerare l'esecuzione del compilatore di circa il 2% modificando il layout del codice della libreria librustc_driver.so per un utilizzo più efficiente della cache del processore.

    Inclusa la creazione del compilatore rusticc con l'opzione "-Ccodegen-units=1" per migliorare la qualità dell'ottimizzazione in LLVM. I test eseguiti mostrano un aumento delle prestazioni nel caso della build “-Ccodegen-units=1” di circa l'1.5%. Le ottimizzazioni aggiunte sono abilitate per impostazione predefinita solo per la piattaforma x86_64-unknown-linux-gnu.

    Le ottimizzazioni menzionate in precedenza sono state testate da Google per ridurre il tempo di creazione dei componenti della piattaforma Android scritti in Rust. L'utilizzo di "-C codegen-units=1" durante la creazione di Android ci ha permesso di ridurre le dimensioni del toolkit del 5.5% e di aumentarne le prestazioni dell'1.8%, mentre il tempo di creazione del toolkit stesso è quasi raddoppiato.

    L'abilitazione della garbage collection in fase di collegamento ("--gc-sections") ha portato il miglioramento delle prestazioni fino all'1.9%, consentendo l'ottimizzazione del tempo di collegamento (LTO) fino al 7.7% e le ottimizzazioni basate sul profilo (PGO) fino al 19.8%. Alla fine, sono state applicate ottimizzazioni utilizzando l'utilità BOLT, che ha permesso di aumentare la velocità di costruzione al 24.7%, ma la dimensione del toolkit è aumentata del 10.9%.

    Rilascio del linguaggio di programmazione Rust 1.75 e unikernel Hermit 0.6.7

  • Una nuova porzione dell'API è stata spostata nella categoria stabile, inclusi i metodi e le implementazioni dei tratti sono stati stabilizzati:
    • Atomico*::from_ptr
    • FileTimes
    • FileTimesExt
    • File::set_modificato
    • File::set_times
    • IpAddr::to_canonical
    • Ipv6Addr::to_canonical
    • Opzione::as_slice
    • Opzione::as_mut_slice
    • puntatore::byte_aggiungi
    • puntatore::byte_offset
    • puntatore::byte_offset_from
    • puntatore::byte_sub
    • puntatore::wrapping_byte_add
    • puntatore::wrapping_byte_offset
    • puntatore::wrapping_byte_sub
  • L'attributo "const", che determina la possibilità di utilizzarlo in qualsiasi contesto al posto delle costanti, viene utilizzato nelle funzioni:
    • Ipv6Addr::to_ipv4_mapped
    • ForseUninit::assume_init_read
    • ForseUninit::azzerato
    • mem::discriminante
    • mem::azzerato
  • Il terzo livello di supporto è stato implementato per le piattaforme csky-unknown-linux-gnuabiv2hf, i586-unknown-netbsd e mipsel-unknown-netbsd. Il terzo livello prevede il supporto di base, ma senza test automatizzati, pubblicazione di build ufficiali o verifica se il codice può essere creato.

Inoltre, possiamo notare una nuova versione del progetto Hermit, che sviluppa un kernel specializzato (unikernel), scritto nel linguaggio Rust, fornendo strumenti per creare applicazioni autonome che possono essere eseguite su un hypervisor o hardware nudo senza livelli aggiuntivi. e senza sistema operativo. Una volta creata, l'applicazione è collegata staticamente a una libreria, che implementa in modo indipendente tutte le funzionalità necessarie, senza essere vincolata al kernel del sistema operativo e alle librerie di sistema. Il codice del progetto è distribuito sotto le licenze Apache 2.0 e MIT. L'assembly è supportato per l'esecuzione autonoma di applicazioni scritte in Rust, Go, Fortran, C e C++. Il progetto sta inoltre sviluppando un proprio bootloader che consente di avviare Hermit utilizzando QEMU e KVM.

Fonte: opennet.ru

Aggiungi un commento