Rilascio del linguaggio di programmazione Rust 1.45

pubblicato versione 1.45 del linguaggio di programmazione del sistema Rugginefondato dal progetto Mozilla. Il linguaggio si concentra sulla gestione sicura della memoria, fornisce una gestione automatica della memoria e fornisce i mezzi per ottenere un elevato parallelismo dei lavori evitando l'uso di un garbage collector e runtime.

La gestione automatica della memoria di Rust salva lo sviluppatore da errori durante la manipolazione dei puntatori e protegge dai problemi che sorgono a causa della manipolazione della memoria di basso livello, come l'accesso a un'area di memoria dopo che è stata liberata, il dereferenziamento di puntatori nulli, sovraccarichi del buffer, ecc. Per distribuire le librerie, garantire l'assemblaggio e gestire le dipendenze, il progetto sviluppa un gestore di pacchetti 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:

  • Eliminato da molto tempo imperfezione quando si eseguono conversioni tra numeri interi e numeri in virgola mobile. Poiché il compilatore Rust utilizza LLVM come backend, le operazioni di conversione del tipo sono state eseguite tramite istruzioni del codice intermedio LLVM come fptoui, che hanno una caratteristica significativa: comportamento indefinito se il valore risultante non rientra nel tipo di destinazione. Ad esempio, quando si converte il valore float 300 dal tipo f32 al tipo intero u8, il risultato è imprevedibile e può variare su sistemi diversi. Il problema è che questa funzionalità appare nel codice che non è contrassegnato come “non sicuro”.

    A partire da Rust 1.45, il comportamento dell'overflow della dimensione del tipo è strettamente regolato e l'operazione di conversione "as" controlla l'overflow e forza la conversione del valore nel valore massimo o minimo del tipo di destinazione (per l'esempio sopra, un valore di 300 verrebbe convertito in 255). Per disabilitare tali controlli, vengono fornite chiamate API aggiuntive “{f64, f32}::to_int_unchecked”, che operano in modalità non sicura.

    fn cast(x: f32) -> u8 {
    x come u8
    }

    fn principale() {
    lascia che too_big = 300.0;
    lascia che troppo_piccolo = -100.0;
    nan = f32::NAN;

    sia x: f32 = 1.0;
    let y: u8 = unsafe { x.to_int_unchecked() };

    println!("troppo_grande_casted = {}", cast(troppo_grande)); // emette 255
    println!("troppo_piccolo_casted = {}", cast(troppo_piccolo)); // uscita 0
    println!("not_a_number_casted = {}", cast(nan)); // uscita 0
    }

  • Utilizzare stabilizzato macro proceduraliespressioni, modelli e istruzioni simili a funzioni. In precedenza, tali macro non potevano essere chiamate ovunque, ma solo in alcune parti del codice (come chiamata separata, non intrecciata con altro codice). Ampliare il modo in cui è possibile richiamare le macro, in modo simile alle funzioni, era uno dei requisiti per far funzionare il framework web razzo nelle versioni stabili di Rust. In precedenza, per ottenere ulteriore flessibilità nella definizione dei gestori in Rocket era necessario abilitare una funzionalità sperimentale chiamata “proc_macro_hygiene”, che non è disponibile nelle versioni stabili di Rust. Questa funzionalità è ora integrata nelle versioni stabili del linguaggio.
  • È consentito utilizzare intervalli con tipo "char" per scorrere i valori dell'intervallo (ops::{Range, RangeFrom, RangeFull, RangeInclusive, RangeTo}):

    per ch in 'a'..='z' {
    stampa!("{}", cap);
    }
    stampaln!(); // Stamperà "abcdefghijklmnopqrstuvwxyz"

  • Una nuova porzione dell'API è stata trasferita nella categoria stabile, compresa quella stabilizzata
    Arco::as_ptr,
    BTreeMap::remove_entry,
    Rc::as_ptr,
    rc::Debole::as_ptr,
    rc::Debole::da_raw,
    rc::Weak::into_raw,
    str::strip_prefix,
    str::suffisso_strip,
    sync::Weak::as_ptr,
    sync::Weak::from_raw,
    sync::Weak::into_raw,
    carattere::VERSIONE_UNICODE,
    Intervallo::risolto_at,
    Intervallo::situato_a,
    Intervallo::sito_misto,
    unix::process::CommandExt::arg0.

  • Il compilatore rusticc ha aggiunto il supporto per sovrascrivere varie funzionalità della piattaforma di destinazione utilizzando il flag "target-feature", ad esempio "-C target-feature=+avx2,+fma". Sono state aggiunte anche nuove bandiere:
    "force-unwind-tables" per generare tabelle di chiamate di rimozione, indipendentemente dalla strategia di gestione degli arresti anomali; "embed-bitcode" per controllare se il bitcode LLVM è incluso negli rlib generati. Il flag "embed-bitcode" è abilitato per impostazione predefinita in Cargo per ottimizzare il tempo di creazione e il consumo di spazio su disco.

  • Un terzo livello di supporto è stato fornito per le piattaforme mipsel-sony-psp e Thumbv7a-uwp-windows-msvc. Il terzo livello prevede il supporto di base, ma senza test automatizzati e pubblicazione di build ufficiali.

Inoltre si può notare la storia sulla creazione del più semplice приложения nel linguaggio Rust, iniziando a utilizzare il bootloader del sistema e pronto per il caricamento autonomo al posto del sistema operativo.
L'articolo è il primo di una serie dedicata alla dimostrazione delle tecniche richieste nella programmazione di basso livello e nello sviluppo del sistema operativo.

Fonte: opennet.ru

Aggiungi un commento