Lanzamiento de Rust 1.82. Nuevo navegador en Rust. Uso de Rust en Volvo

Se ha publicado la versión 1.82 del lenguaje de programación de propósito general Rust, desarrollado originalmente por Mozilla y actualmente gestionado por la organización no lucrativa Rust Foundation. El lenguaje está enfocado en el manejo seguro de la memoria y proporciona herramientas para lograr un alto paralelismo en la ejecución de tareas, sin necesidad de un recolector de basura y con un runtime limitado a la inicialización básica y el mantenimiento de la biblioteca estándar.

Los métodos de manejo de memoria en Rust eliminan los errores del desarrollador al manipular punteros y protegen contra problemas que surgen del trabajo de bajo nivel con la memoria, como el acceso a áreas de memoria después de su liberación, desreferenciación de punteros nulos, desbordamientos de búfer, etc. Para la distribución de bibliotecas, la gestión de dependencias y la construcción de proyectos, se está desarrollando el administrador de paquetes Cargo. Para alojar bibliotecas, se soporta el repositorio crates.io.

La seguridad en el manejo de la memoria se garantiza en Rust en tiempo de compilación a través de la verificación de referencias, el seguimiento de la propiedad de los objetos, la gestión de tiempos de vida de objetos (ámbitos) y la evaluación de la corrección del acceso a la memoria durante la ejecución del código. Rust también ofrece herramientas para protegerse contra desbordamientos 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 inmutabilidad de referencias y variables por defecto, y ofrece una fuerte tipificación estática para minimizar errores lógicos.

Novedades principales:

  • Se ha añadido el comando «info» al gestor de paquetes cargo para mostrar información sobre el paquete en el repositorio.
  • Se ha agregado soporte para la sintaxis «use<..>» en «impl Trait», que define información sobre tipos ocultos. Por ejemplo, «impl Trait + use<‘x, T>» indica que en el tipo oculto solo se permiten los parámetros «x» y «T».
  • Se ha propuesto una sintaxis separada para crear punteros crudos, que sustituye a los macros usados anteriormente: el macro «addr_of!(expr)» ha sido reemplazado por el operador «&raw const expr», y el macro «addr_of_mut!(expr)» ha sido reemplazado por el operador «&raw mut expr». struct Packed { not_aligned_field: i32, } fn main() { let p = Packed { not_aligned_field: 1_82 }; // Forma antigua de crear un puntero crudo let ptr = std::ptr::addr_of!(p.not_aligned_field); // Nueva forma de crear un puntero crudo let ptr = &raw const p.not_aligned_field; let val = unsafe { ptr.read_unaligned() }; }
  • Se ha habilitado la definición de funciones y constantes seguras (safe) con vida útil ‘static’ dentro de bloques extern marcados como «unsafe» (anteriormente todos los elementos en «unsafe extern» solo podían tener la etiqueta «unsafe»): unsafe extern { pub safe static TAU: f64; pub safe fn sqrt(x: f64) -> f64; pub unsafe fn strlen(p: *const u8) -> usize; }
  • Los atributos no_mangle, link_section y export_name, que pueden llevar a comportamientos indefinidos, ahora se consideran inseguros y requieren una etiqueta explícita de «unsafe», por ejemplo: #[unsafe(no_mangle)] pub fn my_global_function() { }
  • En las coincidencias de patrones, se permite omitir tipos vacíos, como «enum Void {}» o estructuras con un campo visible vacío. use std::convert::Infallible; pub fn unwrap_without_panic<T>(x: Result<T, Infallible>) -> T { let Ok(x) = x; // «Err» se puede omitir x }
  • En los tipos para números de punto flotante (f32 y f64), se ha estandarizado el comportamiento al manejar valores no numéricos NaN (0.0/0.0), y se ha permitido el uso de operaciones con punto flotante en const fn.
  • En las inserciones de ensamblador se ofrece la posibilidad de utilizar operandos con la etiqueta «const» para usar directamente valores numéricos enteros sin necesidad de almacenarlos previamente en un registro. const MSG: &str = «Hello, world!\n»; unsafe { core::arch::asm!( «mov rdx, {LEN} \/\/ se formará la instrucción ‘mov rdx, 14′», LEN = const MSG.len(), … ); }
  • Se permite la dirección de expresiones con la etiqueta «static» en un contexto seguro sin necesidad de definir un bloque unsafe (los operadores «&raw mut» y «&raw const» no afectan el valor del operando y solo crean un puntero a él): static mut STATIC_MUT: Type = Type::new(); extern «C» { static EXTERN_STATIC: Type; } fn main() { let static_mut_ptr = &raw mut STATIC_MUT; let extern_static_ptr = &raw const EXTERN_STATIC; }
  • Se ha trasladado un nuevo lote de API a la categoría estable, incluyendo la estabilización de métodos e implementaciones de traits:
    • std::thread::Builder::spawn_unchecked
    • std::str::CharIndices::offset
    • std::option::Option::is_none_or
    • [T]::is_sorted
    • [T]::is_sorted_by
    • [T]::is_sorted_by_key
    • Iterator::is_sorted
    • Iterator::is_sorted_by
    • Iterator::is_sorted_by_key
    • std::future::Ready::into_inner
    • std::iter::repeat_n
    • impl DoubleEndedIterator for Take

      Fuente: opennet.ru
Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster