Llançament del llenguatge de programació Rust 1.59 amb suport per a insercions de muntatge

S'ha publicat el llançament del llenguatge de programació de propòsit general Rust 1.59, fundat pel projecte Mozilla, però ara desenvolupat sota els auspicis de l'organització independent sense ànim de lucre Rust Foundation. El llenguatge se centra en la seguretat de la memòria i proporciona els mitjans per aconseguir un alt paral·lelisme de treballs evitant l'ús d'un col·lector d'escombraries i el temps d'execució (el temps d'execució es redueix a la inicialització bàsica i al manteniment de la biblioteca estàndard).

Els mètodes de gestió de memòria de Rust estalvien al desenvolupador d'errors en manipular els punters i protegeixen dels problemes que sorgeixen a causa del maneig de la memòria de baix nivell, com ara accedir a una àrea de memòria després d'haver-se alliberat, desreferenciar punters nuls, desbordaments de memòria intermèdia, etc. Per distribuir biblioteques, proporcionar compilacions i gestionar dependències, el projecte desenvolupa el gestor de paquets Cargo. El repositori crates.io és compatible per allotjar biblioteques.

La seguretat de la memòria es proporciona a Rust en temps de compilació mitjançant la comprovació de referències, el seguiment de la propietat de l'objecte, el seguiment de la vida útil dels objectes (àmbits) i l'avaluació de la correcció de l'accés a la memòria durant l'execució del codi. Rust també proporciona protecció contra desbordaments d'enters, requereix la inicialització obligatòria dels valors de les variables abans de l'ús, gestiona millor els errors a la biblioteca estàndard, aplica el concepte de referències i variables immutables per defecte, ofereix una escriptura estàtica forta per minimitzar els errors lògics.

Principals innovacions:

  • És possible utilitzar insercions en llenguatge assemblador, que són demanades en aplicacions que necessiten controlar l'execució a un nivell baix o poder utilitzar instruccions de màquina especialitzades. Les insercions de muntatge s'afegeixen mitjançant macros "asm!" i "global_asm!" utilitzant la sintaxi de format de cadenes per nomenar registres similar a la que s'utilitza per a substitucions de cadenes a Rust. El compilador admet instruccions de muntatge per a arquitectures x86, x86-64, ARM, AArch64 i RISC-V. Exemple d'inserció: utilitzeu std::arch::asm; // Multiplica x per 6 utilitzant desplaçaments i suma let mut x: u64 = 4; insegur { asm!( "mov {tmp}, {x}", "shl {tmp}, 1", "shl {x}, 2", "afegiu {x}, {tmp}", x = inout(reg ) x, tmp = out(reg) _, ); } assert_eq!(x, 4 * 6);
  • S'ha afegit suport per a tasques desestructurades (paral·leles), en què s'especifiquen diversos trets, seccions o estructures al costat esquerre de l'expressió. Per exemple: sigui (a, b, c, d, e); (a, b) = (1, 2); [c, .., d, _] = [1, 2, 3, 4, 5]; Estructura { e, .. } = Estructura { e: 5, f: 3 }; assert_eq!([1, 2, 1, 4, 5], [a, b, c, d, e]);
  • S'ha proporcionat la possibilitat d'especificar valors predeterminats per als genèrics const: struct ArrayStorage { arr: [T; N], } impl ArrayStorage { fn new(a: T, b: T) -> ArrayStorage { ArrayStorage { arr: [a, b], } } }
  • El gestor de paquets Cargo proporciona advertències sobre l'ús d'estructures no vàlides a les dependències que es processen a causa d'errors al compilador (per exemple, a causa d'un error, es va permetre agafar en préstec camps d'estructures empaquetades en blocs segurs). Aquestes construccions ja no seran compatibles amb una versió futura de Rust.
  • Cargo i rustc tenen una capacitat integrada per generar fitxers executables sense dades de depuració (strip = "debuginfo") i símbols (strip = "símbols"), sense necessitat de trucar a una utilitat independent. La configuració de neteja s'implementa mitjançant el paràmetre "strip" a Cargo.toml: [profile.release] strip = "debuginfo", "symbols"
  • La compilació incremental està desactivada per defecte. Es diu que el motiu és una solució temporal per a un error al compilador que provoca errors de deserialització i bloquejos. Ja s'ha preparat una correcció d'errors i s'inclourà a la propera versió. Per tornar la compilació incremental, podeu utilitzar la variable d'entorn RUSTC_FORCE_INCREMENTAL=1.
  • Una nova part de l'API s'ha mogut a la categoria d'estable, inclosos els mètodes i les implementacions de trets s'han estabilitzat:
    • std::thread::available_parallelism
    • Resultat::copiat
    • Resultat::clonat
    • arc::asm!
    • arch::global_asm!
    • ops::ControlFlow::is_break
    • ops::ControlFlow::is_continue
    • TryFrom per a u8
    • char::TryFromCharError (Clonar, Depurar, Visualitzar, PartialEq, Copia, Eq, Error)
    • iter::zip
    • NonZeroU8::és_poder_de_dos
    • NonZeroU16::és_poder_de_dos
    • NonZeroU32::és_poder_de_dos
    • NonZeroU64::és_poder_de_dos
    • NonZeroU128::és_poder_de_dos
    • DoubleEndedIterator per a l'estructura ToLowercase
    • DoubleEndedIterator per a l'estructura ToUppercase
    • TryFrom<&mut [T]> per a [T; N]
    • UnwindSafe per a l'estructura Once
    • RefUnwindSafe per una vegada
    • Funcions de suport armv8 neon integrades al compilador per a aarch64
  • L'atribut "const", que determina la possibilitat d'utilitzar-lo en qualsevol context en lloc de constants, s'utilitza a les funcions:
    • mem::MaybeUninit::as_ptr
    • mem::MaybeUninit::assume_init
    • mem::MaybeUninit::assume_init_ref
    • ffi::CStr::from_bytes_with_nul_unchecked

Font: opennet.ru

Afegeix comentari