Uscita del linguaggio di programmazione Rust 1.39

Pubblicato rilascio del linguaggio di programmazione di sistema Rust 1.39, sviluppato dal progetto Mozilla. Il linguaggio è focalizzato su un uso sicuro della memoria, fornisce gestione automatica della memoria e offre strumenti per raggiungere un elevato parallelismo nell'esecuzione delle attività, evitando l'uso di garbage collector e runtime.

La gestione automatica della memoria in Rust libera gli sviluppatori dalla manipolazione dei puntatori e protegge da problemi derivanti da operazioni a basso livello con la memoria, come l'accesso a memoria già liberata, dereferenziazione di puntatori nulli, overflow del buffer e simili. Per la distribuzione delle librerie, la gestione della compilazione e 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à:

  • Stabilizzato nuova sintassi di programmazione asincrona, basata sulla funzione «async», sul blocco async move { … } e sull'operatore «.await», che semplificano la scrittura di gestori non bloccanti per il thread principale. Rispetto all'API precedentemente proposta per l'input/output asincrono, le strutture async/.await sono facili da percepire, ben leggibili e consentono di implementare interazioni asincrone complesse utilizzando le consuete tecniche di controllo del flusso di esecuzione basate su cicli, operatori condizionali ed eccezioni.

    La sintassi Async-await consente di creare funzioni che possono sospendere la loro esecuzione, restituire il controllo al thread principale e poi riprendere l'esecuzione dal punto in cui erano state interrotte. Ad esempio, tale sospensione è necessaria durante l'elaborazione dell'input/output, dove durante l'attesa di un nuovo lotto di dati si può svolgere altro lavoro. Le funzioni e i blocchi definiti tramite «async fn» e «async move» restituiscono un trait Future, che definisce la rappresentazione di un calcolo asincrono ritardato nel futuro. È possibile avviare direttamente il calcolo ritardato e ottenere il risultato utilizzando l'operatore «.await». Fino alla chiamata di «.await», non vengono eseguite né programmate azioni, il che consente di creare strutture complesse senza costi aggiuntivi.

    async fn first_function() -> u32 { .. }

    let future = first_function();

    let result: u32 = future.await;

  • Stabilizzato «#![feature(bind_by_move_pattern_guards)]», che consente di usare variabili di tipo bind «by-move» nei pattern e di utilizzare riferimenti a queste variabili nella sezione «if» dell'espressione «corrispondenza«. Ad esempio, ora sono consentite le seguenti strutture:

    fn main() {
    let array: Box<[u8; 4]> = Box::new([1, 2, 3, 4]);

    match array {
    nums
    if nums.iter().sum::() == 10

    => {
    drop(nums);
    }
    _ => unreachable!(),
    }
    }

  • È consentita la specificazione attributi nella definizione dei parametri delle funzioni, delle chiusure e dei puntatori alle funzioni. Sono supportati gli attributi di compilazione condizionale (cfg, cfg_attr), che gestiscono i diagnostici tramite lint (allow, warn, deny e forbid), e gli attributi ausiliari per la chiamata di macro.

    fn len(
    #[cfg(windows)] slice: &[u16], // использовать параметр в Windows
    #[cfg(not(windows))] slice: &[u8], // использовать в остальных ОС
    ) -> usize {
    slice.len()
    }

  • Avvisi sui problemi rilevati durante il controllo del prestito delle variabili (borrow checker) utilizzando la tecnica NLL (Non-Lexical Lifetimes), tradotti ora classificati come errori fatali. Ricordiamo che il sistema di verifica basato sul nuovo meccanismo di gestione della vita delle variabili in prestito ha permesso di identificare alcuni problemi che restavano inosservati dal vecchio codice di verifica. Poiché il messaggio di errore per tali controlli poteva influire sulla compatibilità con il codice preesistente, inizialmente venivano emessi avvisi invece di errori. Ora, lavorando in modalità Rust 2018, gli avvisi sono stati sostituiti da errori. Nella prossima versione, la segnalazione di errori sarà implementata anche in modalità Rust 2015, permettendo di eliminare definitivamente il vecchio borrow checker;
  • Il segno 'const', che determina la possibilità di utilizzo in qualsiasi contesto al posto di costanti, è stato applicato a funzioni come Vec::new, String::new, LinkedList::new, str::len, [T]::len, str::as_bytes,
    abs, wrapping_abs e overflowing_abs;
  • È stata tradotta una nuova serie di API in categoria stabile, compresi i metodi stabilizzati
    Pin::into_inner, Instant::checked_duration_since e Instant::saturating_duration_since;
  • Il gestore di pacchetti cargo ha aggiunto la possibilità di utilizzare file di configurazione con estensione «.toml». È stata introdotta la supporto preliminare per la costruzione della libreria standard direttamente da Cargo. È stato aggiunto il flag «—workspace», che sostituisce il flag «—all» che era ambiguo. È stato aggiunto un nuovo campo ai metadati «publish», che consente di pubblicare dipendenze specificando un tag in git e un numero di versione. È stata aggiunta un'opzione di test «-Ztimings» per generare un rapporto HTML sui tempi di esecuzione delle diverse fasi di compilazione.publish«
  • Nel compilatore rustc, nei messaggi diagnostici è stata inclusa la troncatura dei codici che non si adattano al terminale. È stato garantito il terzo livello di supporto per le piattaforme target i686-unknown-uefi e sparc64-unknown-openbsd. Il terzo livello implica supporto di base, ma senza test automatizzati e pubblicazione di build ufficiali.
    i686-unknown-uefi e sparc64-unknown-openbsd. Il terzo livello prevede supporto di base, ma senza test automatizzati e pubblicazione di build ufficiali.

Fonte: opennet.ru

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