Rilascio del linguaggio di programmazione Rust 1.64

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

  • I requisiti per l'ambiente Linux nel compilatore, nel gestore pacchetti Cargo e nella libreria standard libstd sono stati aumentati: i requisiti minimi per Glibc sono stati aumentati dalla versione 2.11 alla 2.17, e il kernel Linux dalla versione 2.6.32 alla 3.2. Le restrizioni si applicano anche agli eseguibili delle applicazioni Rust compilate con libstd. I kit di distribuzione RHEL 7, SLES 12-SP5, Debian 8 e Ubuntu 14.04 soddisfano i nuovi requisiti. Il supporto per RHEL 6, SLES 11-SP4, Debian 7 e Ubuntu 12.04 verrà interrotto. Gli utenti che utilizzano eseguibili creati con Rust in ambienti con un kernel Linux precedente sono incoraggiati ad aggiornare i propri sistemi, a rimanere sulle versioni precedenti del compilatore o a mantenere il proprio fork libstd con livelli per mantenere la compatibilità.

    Tra i motivi per cui è stato interrotto il supporto per i sistemi Linux meno recenti vi sono le risorse limitate per continuare a mantenere la compatibilità con gli ambienti meno recenti. Il supporto per Glibc legacy richiede l'uso di strumenti legacy durante il check-in in un sistema di integrazione continua, a fronte dei crescenti requisiti di versione in LLVM e delle utilità di compilazione incrociata. L'aumento dei requisiti della versione del kernel è dovuto alla possibilità di utilizzare nuove chiamate di sistema in libstd senza la necessità di mantenere livelli per garantire la compatibilità con i kernel più vecchi.

  • È stato stabilizzato il tratto IntoFuture, che assomiglia a IntoIterator, ma differisce da quest'ultimo per l'utilizzo dei cicli “.await” invece di “for… in…”. Se combinata con IntoFuture, la parola chiave ".await" può aspettarsi non solo un tratto Future, ma anche qualsiasi altro tipo che possa essere convertito in un Future.
  • L'utilità di analisi della ruggine è inclusa nella raccolta di utilità fornita con le versioni di Rust. L'utilità è disponibile anche per l'installazione utilizzando Rustup (il componente Rustup aggiunge Rust-analyzer).
  • Il gestore pacchetti Cargo include l'ereditarietà dello spazio di lavoro per eliminare la duplicazione dei valori dei campi comuni tra i pacchetti, come le versioni Rust e gli URL dei repository. Aggiunto anche il supporto per la creazione di più piattaforme di destinazione contemporaneamente (ora puoi specificare più di un parametro nell'opzione "--target").
  • Una nuova porzione dell'API è stata spostata nella categoria stabile, inclusi i metodi e le implementazioni dei tratti sono stati stabilizzati:
    • futuro::Nelfuturo
    • num::NonZero*::checked_mul
    • num::NonZero*::checked_pow
    • num::NonZero*::saturating_mul
    • num::NonZero*::saturating_pow
    • num::NonZeroI*::ass
    • num::NonZeroI*::checked_abs
    • num::NonZeroI*::overflowing_abs
    • num::NonZeroI*::saturazione_ass
    • num::NonZeroI*::unsigned_abs
    • num::NonZeroI*::wrapping_abs
    • num::NonZeroU*::checked_add
    • num::NonZeroU*::checked_next_power_of_two
    • num::NonZeroU*::saturating_add
    • os::unix::process::CommandExt::process_group
    • os::windows::fs::FileTypeExt::is_symlink_dir
    • os::windows::fs::FileTypeExt::is_symlink_file
  • I tipi compatibili con C, precedentemente stabilizzati nel modulo std::ffi, sono stati aggiunti al core e alla libreria alloc:
    • core::ffi::CStr
    • core::ffi::FromBytesWithNulError
    • alloc::ffi::CString
    • alloc::ffi::FromVecWithNulError
    • alloc::ffi::IntoStringError
    • alloc::ffi::NulError
  • I tipi C precedentemente stabilizzati nel modulo std::os::raw sono stati aggiunti ai moduli core::ffi e std::ffi (ad esempio, i tipi c_uint e c_ulong sono stati proposti per i tipi C uint e ulong):
    • ffi::c_char
    • ffi::c_doppio
    • ffi::c_float
    • ffi::c_int
    • ffi::c_long
    • ffi::c_longlong
    • ffi::c_schar
    • ffi::c_corto
    • ffi::c_uchar
    • ffi::c_uint
    • ffi::c_ulong
    • ffi::c_ulonglong
    • ffi::c_ushort
  • Sono stati stabilizzati gli handler di basso livello per l'utilizzo con il meccanismo Poll (in futuro si prevede di fornire un'API semplificata che non richieda l'utilizzo di strutture di basso livello come Pull e Pin):

    • futuro::poll_fn
    • compito::pronto!
  • Nella funzione slice::from_raw_parts viene utilizzato l'attributo “const”, che determina la possibilità di utilizzarlo in qualsiasi contesto al posto delle costanti.
  • Per archiviare i dati in modo più compatto è stata modificata la disposizione della memoria delle strutture Ipv4Addr, Ipv6Addr, SocketAddrV4 e SocketAddrV6. Potrebbe esserci un problema di compatibilità con i pacchetti a cassa singola che utilizzano std::mem::transmute per la manipolazione di strutture di basso livello.
  • La build del compilatore ruggine per la piattaforma Windows utilizza ottimizzazioni PGO (ottimizzazione guidata dal profilo), che hanno permesso di aumentare le prestazioni di compilazione del codice del 10-20%.
  • Il compilatore ha implementato un nuovo avviso sui campi non utilizzati in alcune strutture.

Inoltre, puoi notare il rapporto sullo stato dello sviluppo di un'implementazione alternativa del compilatore del linguaggio Rust, preparato dal progetto gccrs (GCC Rust) e approvato per l'inclusione nel GCC. Dopo aver integrato il frontend, gli strumenti standard di GCC possono essere utilizzati per compilare programmi nel linguaggio Rust senza la necessità di installare il compilatore rusticc, costruito utilizzando gli sviluppi LLVM. Finché lo sviluppo sarà sulla buona strada, e salvo eventuali problemi imprevisti, il frontend di Rust sarà integrato nel rilascio di GCC 13 previsto per maggio del prossimo anno. L'implementazione GCC 13 di Rust sarà in stato beta, non ancora abilitata per impostazione predefinita.

Fonte: opennet.ru

Aggiungi un commento