Release del linguaggio di programmazione Rust 1.45

Pubblicato rilascio 1.45 del linguaggio di programmazione di sistema Rust, sviluppato da Mozilla. Il linguaggio è focalizzato sulla gestione sicura della memoria, offre gestione automatica della memoria e fornisce strumenti per raggiungere un elevato parallelismo nell'esecuzione dei compiti, evitando l'uso del garbage collector e runtime.

La gestione automatica della memoria in Rust libera lo sviluppatore da errori durante la manipolazione dei puntatori e protegge da problemi derivanti da un lavoro a basso livello con la memoria, come l'accesso alla memoria dopo che è stata liberata, la dereferenziazione di puntatori nulli, l'uscita dai limiti del buffer, ecc. Per la distribuzione delle librerie, l'assicurazione della build e la gestione delle dipendenze, è in fase di sviluppo un gestore di pacchetti Cargo, che consente di ottenere le librerie necessarie per il programma con un clic. Per l'hosting delle librerie è supportato il repository crates.io.

Principali novità:

  • Risolto un problema di lunga data nella conversione tra tipi interi e numeri a virgola mobile. Poiché il compilatore Rust utilizza LLVM come backend, le operazioni di conversione dei tipi venivano eseguite tramite istruzioni di codice intermedio LLVM, come fptoui , che presentano una particolare caratteristica: comportamento indefinito se il valore risultante non si adatta al tipo di destinazione. Ad esempio, convertendo il valore reale 300 di tipo f32 in un tipo intero u8, il risultato è imprevedibile e può variare tra i diversi sistemi. Il problema è che questa caratteristica si manifesta nel codice non contrassegnato come «unsafe»., в которых имеется одна существенная особенность — неопределённое поведение, если результирующее значение не умещается в целевой тип. Например, при преобразовании вещественного значения 300 с типом f32 в целый тип u8 результат непредсказуем и может отличаться на разных системах. Проблема в том, что подобная особенность проявляется в коде, не помеченном как «unsafe».

    A partire da Rust 1.45, il comportamento in caso di overflow del tipo è rigorosamente regolamentato e l'operazione di conversione «as» esegue un controllo per l'overflow, portando il valore convertito al massimo o al minimo valore del tipo di destinazione (nel caso sopra citato, il valore 300 verrà convertito in 255). Per disabilitare tali controlli, sono previste chiamate API aggiuntive «{f64, f32}::to_int_unchecked», che operano in modalità unsafe.

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

    fn main() {
    let too_big = 300.0;
    let too_small = -100.0;
    let nan = f32::NAN;

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

    println!(«too_big_casted = {}», cast(too_big)); // in output 255
    println!(«too_small_casted = {}», cast(too_small)); // in output 0
    println!(«not_a_number_casted = {}», cast(nan)); // in output 0
    }

  • Stabilizzato l'uso di macro procedurali, simili a funzioni, in espressioni, schemi e affermazioni. In precedenza, tali macro potevano essere richiamate non ovunque, ma solo in parti specifiche del codice (con una chiamata separata, non mescolata con altro codice). L'estensione dei modi per richiamare macro simili a funzioni era una delle necessità per garantire il funzionamento del web framework Rocket nelle versioni stabili di Rust. In precedenza, per ottenere un'ulteriore flessibilità nella definizione dei gestori in Rocket era necessaria l'attivazione della funzionalità sperimentale «proc_macro_hygiene», non disponibile nelle versioni stabili di Rust. Ora, questa funzionalità è integrata nelle versioni stabili del linguaggio.
  • È consentito l'uso di intervalli con il tipo «char» per l'iterazione sui valori dell'intervallo (ops::{Range, RangeFrom, RangeFull, RangeInclusive, RangeTo}):

    for ch in ‘a’..=’z’ {
    print!(«{}», ch);
    }
    println!(); // Sarà stampato «abcdefghijklmnopqrstuvwxyz»

  • È stata tradotta una nuova serie di API in una versione stabile, tra cui sono state stabilizzate
    Arc::as_ptr,
    BTreeMap::remove_entry,
    Rc::as_ptr,
    rc::Weak::as_ptr,
    rc::Weak::from_raw,
    rc::Weak::into_raw,
    str::strip_prefix,
    str::strip_suffix,
    sync::Weak::as_ptr,
    sync::Weak::from_raw,
    sync::Weak::into_raw,
    char::UNICODE_VERSION,
    Span::resolved_at,
    Span::located_at,
    Span::mixed_site,
    unix::process::CommandExt::arg0.
  • Nel compilatore rustc è stata aggiunta la possibilità di sovrascrivere varie funzionalità della piattaforma target tramite il flag «target-feature», ad esempio, «-C target-feature=+avx2,+fma». Sono stati inoltre aggiunti nuovi flag:
    «force-unwind-tables» per generare tabelle di chiamata «sviluppate» (unwind), indipendentemente dalla strategia di gestione degli errori; «embed-bitcode» per controllare l'inclusione del bitcode LLVM nelle rlibs generate. Il flag «embed-bitcode» è attivato di default in Cargo per ottimizzare i tempi di compilazione e l'uso dello spazio su disco.
  • È fornito un terzo livello di supporto per le piattaforme mipsel-sony-psp e thumbv7a-uwp-windows-msvc. Il terzo livello implica supporto di base, ma senza test automatizzati e pubblicazione di build ufficiali.

Inoltre, si può notare la storia per la creazione del più semplice applicativi in linguaggio Rust, avviato tramite un bootloader di sistema e pronto per l'avvio autonomo invece del sistema operativo.
L'articolo è il primo di una serie dedicata alla dimostrazione delle tecniche richieste nella programmazione di basso livello e nello sviluppo di sistemi operativi.

Fonte: opennet.ru

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster