Uscita del linguaggio di programmazione Rust 1.64

È stato pubblicato il rilascio del linguaggio di programmazione di uso generale Rust 1.64, originariamente sviluppato da Mozilla e ora mantenuto sotto l'egida dell'organizzazione no-profit indipendente Rust Foundation. Il linguaggio è focalizzato sulla gestione sicura della memoria e offre strumenti per ottenere un elevato parallelismo nell'esecuzione delle attività, senza ricorrere a un garbage collector e a un runtime (il runtime si limita a una configurazione di base e alla manutenzione della libreria standard).

I metodi di gestione della memoria in Rust liberano gli sviluppatori dagli errori nella manipolazione dei puntatori e li proteggono da problematiche derivanti dal lavoro a basso livello con la memoria, come l'accesso a zone di memoria dopo la loro liberazione, la dereferenziazione di puntatori nulli, il superamento dei limiti del buffer, e così via. Per la distribuzione delle librerie, la gestione della compilazione e delle dipendenze, si è sviluppato un gestore di pacchetti chiamato Cargo. Le librerie sono ospitate nel repository crates.io.

La gestione sicura della memoria in Rust è garantita durante la compilazione tramite il controllo dei riferimenti, il tracciamento della proprietà degli oggetti, la gestione della durata degli oggetti (scope) e la valutazione della correttezza dell'accesso alla memoria durante l'esecuzione del codice. Rust offre anche strumenti per proteggere da overflow 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 e offre una forte tipizzazione statica per ridurre al minimo gli errori logici.

Novità principali:

  • I requisiti per l'ambiente Linux nel compilatore, nel gestore pacchetti Cargo e nella libreria standard libstd sono stati elevati: i requisiti minimi per Glibc sono passati dalla versione 2.11 alla 2.17 e i kernel Linux sono stati aggiornati dalla versione 2.6.32 alla 3.2. Queste limitazioni si applicano anche ai file eseguibili delle applicazioni Rust compilate con libstd. I seguenti sistemi operativi soddisfano i nuovi requisiti: RHEL 7, SLES 12-SP5, Debian 8 e Ubuntu 14.04. La supporto per RHEL 6, SLES 11-SP4, Debian 7 e Ubuntu 12.04 sarà interrotto. Gli utenti che utilizzano file eseguibili compilati con gli strumenti Rust in ambienti con kernel Linux obsoleti sono invitati ad aggiornare i propri sistemi, a rimanere sulle versioni più vecchie del compilatore o a mantenere autonomamente il proprio fork di libstd con strati per garantire la compatibilità.

    Tra le ragioni per cui non si supportano più le vecchie versioni di Linux ci sono le risorse limitate per mantenere la compatibilità con i vecchi ambienti. Il supporto per le versioni obsolete di Glibc richiede l'uso di strumenti obsoleti durante i test nel sistema di integrazione continua, in un contesto di crescenti requisiti di versione in LLVM e negli strumenti di cross-compilazione. L'aumento dei requisiti per la versione del kernel è legato alla possibilità di utilizzare in libstd nuove chiamate di sistema senza dover mantenere strati per garantire la compatibilità con i vecchi kernel.

  • È stato stabilizzato il tratto IntoFuture, che assomiglia a IntoIterator, ma si differenzia da quest'ultimo per l'uso di «.await» invece dei cicli «for … in …». In combinazione con IntoFuture, la parola chiave «.await» può aspettare non solo il tratto Future, ma anche qualsiasi altro tipo che possa essere convertito in Future.
  • Lo strumento rust-analyzer è incluso nella collezione di strumenti fornita nelle release di Rust. Lo strumento è anche disponibile per l'installazione tramite rustup (rustup component add rust-analyzer).
  • Nel gestore di pacchetti Cargo è stata implementata la possibilità di ereditare l'area di lavoro per evitare la duplicazione tra i pacchetti di valori tipici dei campi, come versioni Rust e URL dei repository. È stata inoltre aggiunta la supporto per la compilazione simultanea su più piattaforme target (ora nell'opzione "--target" è possibile specificare più di un parametro).
  • Una nuova serie di API è stata traslata nella categoria stabile, stabilizzando i metodi e le implementazioni dei tipi:
    • future::IntoFuture
    • num::NonZero*::checked_mul
    • num::NonZero*::checked_pow
    • num::NonZero*::saturating_mul
    • num::NonZero*::saturating_pow
    • num::NonZeroI*::abs
    • num::NonZeroI*::checked_abs
    • num::NonZeroI*::overflowing_abs
    • num::NonZeroI*::saturating_abs
    • 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
  • Nella composizione principale (core) e nella libreria alloc sono stati aggiunti tipi compatibili con C, precedentemente stabilizzati nel modulo std::ffi:
    • core::ffi::CStr
    • core::ffi::FromBytesWithNulError
    • alloc::ffi::CString
    • alloc::ffi::FromVecWithNulError
    • alloc::ffi::IntoStringError
    • alloc::ffi::NulError
  • Nei moduli core::ffi e std::ffi sono stati aggiunti tipi C, precedentemente stabilizzati nel modulo std::os::raw (ad esempio, per i tipi C uint e ulong sono stati proposti i tipi c_uint e c_ulong):
    • ffi::c_char
    • ffi::c_double
    • ffi::c_float
    • ffi::c_int
    • ffi::c_long
    • ffi::c_longlong
    • ffi::c_schar
    • ffi::c_short
    • ffi::c_uchar
    • ffi::c_uint
    • ffi::c_ulong
    • ffi::c_ulonglong
    • ffi::c_ushort
  • I gestori di basso livello sono stati stabilizzati per l'uso con il meccanismo Poll (in futuro è previsto di fornire un'API semplificata che non richiede l'uso di strutture di basso livello come Pull e Pin):
    • future::poll_fn
    • task::ready!
  • L'attributo «const», che determina la possibilità di utilizzo in qualsiasi contesto anziché le costanti, è stato applicato nella funzione slice::from_raw_parts.
  • Per un'archiviazione dei dati più compatta, è stata modificata la disposizione in memoria delle strutture Ipv4Addr, Ipv6Addr, SocketAddrV4 e SocketAddrV6. Potrebbero verificarsi problemi di compatibilità con pacchetti crate singoli che utilizzano std::mem::transmute per manipolazioni a basso livello delle strutture.
  • Nella build del compilatore Rust per la piattaforma Windows sono state utilizzate ottimizzazioni PGO (profile-guided optimization), che hanno permesso di aumentare le prestazioni di compilazione del codice dal 10 al 20%.
  • Nel compilatore è stata implementata una nuova avvertenza sui campi non utilizzati in determinate strutture.

È opportuno notare il rapporto sullo stato di sviluppo di un'implementazione alternativa del compilatore del linguaggio Rust, realizzato dal progetto gccrs (GCC Rust) e approvato per l'inclusione nel GCC. Dopo l'integrazione del frontend, gli strumenti standard del GCC potranno essere utilizzati per compilare programmi in linguaggio Rust senza necessità di installare il compilatore rustc, sviluppato con tecnologie LLVM. Attualmente lo sviluppo procede secondo i piani e, in assenza di problemi imprevisti, il frontend per il linguaggio Rust sarà integrato nella prossima versione del GCC 13, prevista per maggio dell'anno prossimo. L'implementazione di Rust in GCC 13 avrà uno stato beta, non attivato per impostazione predefinita.

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