Se ha lanzado el lenguaje de programación de propósito general Rust 1.77, fundado por el proyecto Mozilla pero ahora desarrollado bajo los auspicios de la organización independiente sin fines de lucro Rust Foundation. El lenguaje se enfoca en la seguridad de la memoria y proporciona los medios para lograr un alto paralelismo de trabajos mientras evita el uso de un recolector de basura y tiempo de ejecución (el tiempo de ejecución se reduce a la inicialización básica y el mantenimiento de la biblioteca estándar).
Los métodos de manejo de memoria de Rust salvan al desarrollador de errores al manipular punteros y protegen contra los problemas que surgen debido al manejo de memoria de bajo nivel, como acceder a un área de memoria después de haberla liberado, desreferenciar punteros nulos, desbordamientos de búfer, etc. Para distribuir bibliotecas, proporcionar compilaciones y administrar dependencias, el proyecto desarrolla el administrador de paquetes Cargo. El repositorio crates.io es compatible con el alojamiento de bibliotecas.
La seguridad de la memoria se proporciona en Rust en tiempo de compilación a través de la verificación de referencias, el seguimiento de la propiedad de los objetos, el seguimiento de la vida útil de los objetos (alcances) y la evaluación de la corrección del acceso a la memoria durante la ejecución del código. Rust también brinda protección contra desbordamientos de enteros, requiere la inicialización obligatoria de los valores de las variables antes de su uso, maneja mejor los errores en la biblioteca estándar, aplica el concepto de referencias y variables inmutables de forma predeterminada, ofrece tipado estático fuerte para minimizar los errores lógicos.
Principales novedades:
- Se ha añadido compatibilidad con literales para cadenas de caracteres de C (c"text"), que se almacenan en memoria con un carácter nulo terminado y se asocian al tipo "CStr". Se espera que la compatibilidad con cadenas de caracteres de C simplifique la escritura de código que interactúa con capas en lenguajes de programación que utilizan cadenas terminadas en nulo y permitirá realizar las comprobaciones necesarias en tiempo de compilación. const HELLO: &core::ffi::CStr = c"¡Hola, mundo!";
- Las funciones de ejecución asíncrona declaradas con la expresión "async fn" ahora permiten la recursión, lo que significa que dichas funciones pueden llamarse a sí mismas. async fn fib(n: u32) -> u32 { match n { 0 | 1 => 1, _ => Box::pin(fib(n-1)).await + Box::pin(fib(n-2)).await } }
- La macro `offset_of!` se ha estabilizado. Permite determinar el desplazamiento en bytes de los campos de estructuras, enumeraciones, uniones y tuplas con respecto al inicio del tipo. En la práctica, la macro puede ser útil cuando se necesita trabajar a nivel de desplazamiento de campo sin una instancia de tipo. En particular, la funcionalidad `offset_of` es necesaria al desarrollar componentes de bajo nivel, como controladores. `use std::mem; #[repr(C)] struct FieldStruct { first: u8, second: u16, third: u8 } assert_eq!(mem::offset_of!(FieldStruct, first), 0); assert_eq!(mem::offset_of!(FieldStruct, second), 2); assert_eq!(mem::offset_of!(FieldStruct, third), 4);`
- En el administrador de paquetes Cargo, la eliminación de archivos de los datos de depuración (strip = "debuginfo") está habilitada de forma predeterminada en los perfiles de lanzamiento a menos que el modo de depuración esté habilitado explícitamente en el perfil de Cargo, es decir, si el parámetro debug = 0.
- La opción "-Zthir-unsafeck=on" está habilitada de forma predeterminada, lo que habilita la comprobación de seguridad para la representación intermedia THIR (Representación Intermedia de Alto Nivel Tipada).
- Se agregó la comprobación de lint static_mut_refs para generar una advertencia al usar referencias a valores estáticos mutables.
- Se implementó la capacidad de aplicar el trait "From<&[T; N]>" al tipo "Cow<[T]>". fn foo(data: impl Into >) { /* … */ } fn main() { foo(&[“hola”, “mundo”]); }
- El compilador proporciona alineación para los tipos i128 y u128 de 16 bytes para sistemas x86.
- Una nueva parte de la API se ha movido a la categoría de estable, incluidos los métodos y las implementaciones de rasgos que se han estabilizado:
- array::each_ref
- array::each_mut
- núcleo::net
- f32::lazos_redondos_parejos
- f64::lazos_redondos_parejos
- mem::offset_of!
- rebanada::primer_fragmento
- slice::first_chunk_mut
- rebanada::dividir_primer_fragmento
- slice::split_first_chunk_mut
- rebanada::último_fragmento
- slice::last_chunk_mut
- slice::split_last_chunk
- slice::split_last_chunk_mut
- rebanada::fragmento_por
- slice::chunk_by_mut
- Bound::map
- Archivo::crear_nuevo
- Mutex::clear_poison
- RwLock::clear_poison
- Se ha implementado el soporte de nivel 3 para las plataformas aarch64-unknown-illumos, hexagon-unknown-none-elf, riscv32imafc-esp-espidf y riscv32im-risc0-zkvm-elf. El nivel 3 proporciona soporte básico, pero sin pruebas automatizadas, compilaciones oficiales ni verificación de compilación.
Fuente: opennet.ru
