Se ha publicado la versión 1.84 del lenguaje de programación de propósito general Rust, inicialmente desarrollado por Mozilla, pero ahora bajo el cuidado de la organización independiente sin fines de lucro Rust Foundation. El lenguaje se centra en el manejo seguro de la memoria y proporciona herramientas para lograr un alto paralelismo en la ejecución de tareas, sin necesidad de utilizar un recolector de basura y su tiempo de ejecución (el tiempo de ejecución se limita a la inicialización básica y al 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:
- En el gestor de paquetes Cargo se ha estabilizado el mecanismo de manejo de dependencias, que selecciona versiones de componentes dependientes considerando la compatibilidad con las versiones del compilador Rust, declaradas como mínimamente soportadas por el proyecto (MSRV, Minimum Supported Rust Version). Esta nueva característica permite a los mantenedores evitar la selección manual de versiones antiguas de cada dependencia en proyectos que mantienen compatibilidad con versiones anteriores de las herramientas de Rust. El nuevo modo de determinación de dependencias se activará por defecto en la versión 1.85 de Rust, y por ahora está disponible como una opción, cuya inclusión en la sección '[resolver]' del archivo '.cargo/config.toml' debe indicarse como 'incompatible-rust-versions = "fallback"'.
- Se ha iniciado la traducción del compilador a un nuevo manejador de tipos (trait solver), diseñado para verificar los límites de aplicabilidad de los traits, normalización de tipos y evaluación de compatibilidad de tipos. En la versión 1.84, el nuevo manejador se ha utilizado para verificar la consistencia de las implementaciones de traits, es decir, evaluar la existencia de no más de un trait para el tipo considerado, teniendo en cuenta el código de otros paquetes crate. Esta verificación ha permitido eliminar problemas en la antigua implementación del manejador de tipos, que podrían haber llevado a la aparición de conflictos debido a la intersección de diferentes implementaciones de traits.
- Se ha propuesto una nueva API 'Strict Provenance', que puede utilizarse para convertir un puntero a un número entero y viceversa, teniendo en cuenta los metadatos adjuntos al puntero con información sobre su origen y ámbito de uso (además de la dirección, al puntero se le adjunta un valor 'provenance' con información sobre la relación con otros punteros, que permite determinar dónde y cuándo el puntero puede acceder a la memoria). Al convertir un puntero a un número entero y viceversa, se produce un comportamiento indefinido debido a la dificultad de rastrear el origen del puntero resultante. La nueva API permite realizar operaciones de bajo nivel con punteros, tales como almacenar información adicional en los bits menos significativos del puntero, sin convertir el puntero a un número entero.
- Se ha trasladado un nuevo lote de API a la categoría estable, incluyendo la estabilización de métodos e implementaciones de traits:
- Ipv6Addr::is_unique_local
- Ipv6Addr::is_unicast_link_local
- core::ptr::with_exposed_provenance
- core::ptr::with_exposed_provenance_mut
- ::addr
- ::expose_provenance
- ::with_addr
- ::map_addr
- ::isqrt
- ::checked_isqrt
- ::isqrt
- NonZero::isqrt
- core::ptr::without_provenance
- core::ptr::without_provenance_mut
- core::ptr::dangling
- core::ptr::dangling_mut
- Pin::as_deref_mut
- El atributo «const» se aplica en las funciones:
- AtomicBool::from_ptr
- AtomicPtr::from_ptr
- AtomicU8::from_ptr
- AtomicU16::from_ptr
- AtomicU32::from_ptr
- AtomicU64::from_ptr
- AtomicUsize::from_ptr
- AtomicI8::from_ptr
- AtomicI16::from_ptr
- AtomicI32::from_ptr
- AtomicI64::from_ptr
- AtomicIsize::from_ptr
- ::is_null
- ::as_ref
- ::as_mut
- Pin::new
- Pin::new_unchecked
- Pin::get_ref
- Pin::into_ref
- Pin::get_mut
- Pin::get_unchecked_mut
- Pin::static_ref
- Pin::static_mut
- Se ha estabilizado el soporte para inserciones en línea de ensambladores para las arquitecturas s390x y Arm64EC.
- Se ha estabilizado el soporte para la funcionalidad multivalue, tipos de referencia y llamadas de cola para la plataforma objetivo WebAssembly.
- Se ha implementado un segundo nivel de soporte para la plataforma wasm32v1-none. El segundo nivel de soporte implica una garantía de compilación.
Además, se pueden mencionar varios proyectos relacionados con Rust:
- Se ha publicado el lanzamiento del sistema operativo Tock 2.2, escrito en Rust y orientado a su uso en microcontroladores. El sistema permite organizar la ejecución concurrente de varias aplicaciones no confiables en dispositivos embebidos con tamaño de RAM limitado, como sensores, TPM (Trusted Platform Module), llaveros de autenticación y dispositivos portátiles. Se admiten plataformas con microcontroladores basados en arquitecturas ARM Cortex-M y RISC-V. Una característica clave de Tock es la separación de los niveles de aplicaciones, núcleo y capa de controladores, así como la aislamiento de cada aplicación y controlador por separado. Para el aislamiento, se utilizan tanto las capacidades del lenguaje Rust como la división a nivel de protección de memoria.
- El proyecto VEKOS (Verified Experimental Kernel OS) está desarrollando un núcleo del sistema operativo en Rust, que proporciona la verificación de los componentes ejecutables. Con cada operación en el sistema de archivos, la creación de procesos y la asignación de memoria, se genera una confirmación criptográfica que permite verificar la operación en tiempo de ejecución (la implementación se compara con el uso de blockchain para la verificación de acciones en el sistema operativo). En el sistema de archivos VKFS, se utiliza una estructura de «árbol de Merkle» para garantizar la integridad y protección contra distorsiones retroactivas, donde cada rama verifica todas las ramas y nodos subordinados gracias al hash estructurado en forma de árbol. La asignación de memoria se realiza en modo COW (Copy-On-Write).
- Un grupo de investigadores de Microsoft e Inria está desarrollando un subconjunto del lenguaje C — Mini-C, diseñado para la traducción automática de programas en C a una representación en Rust. A diferencia del compilador c2rust, el nuevo proyecto permite generar código Rust sin utilizar unsafe, pero se centra principalmente en la conversión de proyectos en C que tienen una prueba formal de fiabilidad. Se asume que será más fácil convertir un proyecto en C a una representación en Mini-C, en la que no se permiten operaciones aritméticas con punteros, que reescribir bloques unsafe después de una compilación directa de C a Rust.
La implementación del compilador se basa en la herramienta KaRaMeL. Mini-C fue desarrollado y probado en el marco de un proyecto de reescritura en Rust de la biblioteca criptográfica HACL*, para la cual se proporciona una prueba formal de fiabilidad. Se utilizó una prueba similar para demostrar la posibilidad de generar código seguro en Rust a partir de Mini-C.
- Daniel Stenberg, el autor de la utilidad curl, ha anunciado el cese del desarrollo y soporte del proyecto Curl, que es un backend HTTP alternativo escrito en Rust utilizando la biblioteca Hyper. La razón dada es la falta de interés por parte de desarrolladores y usuarios.
- Se ha anunciado la versión beta de la shell Fish 4.0, reescrita en Rust. Se informa que, después de dos años de desarrollo, la base de código de Fish ha sido completamente trasladada de C++ a Rust. La transición a Rust ha permitido resolver problemas de multithreading, obtener un conjunto de herramientas moderno que detecta errores en tiempo de compilación, aumentar la seguridad en el manejo de memoria y hacer el proyecto más atractivo para nuevos desarrolladores.
- El proyecto Tor ha publicado la versión Arti 1.3.2, una implementación alternativa del cliente Tor en Rust. Arti proporciona una biblioteca embebida que diversas aplicaciones pueden utilizar. Al crear Arti, se tuvo en cuenta la experiencia pasada en el desarrollo de Tor para evitar problemas arquitectónicos conocidos y hacer el proyecto más modular y eficiente. La rama 1.x se considera adecuada para el uso de usuarios comunes y garantiza el mismo nivel de privacidad, usabilidad y estabilidad que la implementación principal en C. En esta nueva versión se ha continuado el desarrollo de RPC, se ha trabajado en la implementación de soporte para relés y se ha añadido protección contra ataques DoS a los servicios Onion.
- Se ha publicado la versión 0.15 del motor de juego Bevy, escrito en Rust. El motor utiliza un modelo centrado en datos (Data Driven) para definir la lógica del juego, construido sobre un conjunto de componentes listos para usar de Bevy ECS (Sistema de Componente de Entidad), que pueden ejecutarse en paralelo. Se soporta renderizado 2D y 3D, animación esquelética, definición de gráficos de renderizado, sistema de formación de escenas, marco para construir interfaces de usuario, y modificación de escenas y recursos sin necesidad de reiniciar.
- Se ha publicado el editor de texto de consola Helix 25.01, escrito en Rust y que extiende las ideas establecidas en vim y neovim. Se soporta la integración con servidores LSP y Tree-sitter, selección simultánea de múltiples bloques, uso de múltiples cursores durante la edición, temas de diseño, y el protocolo de depuración DAP (Protocolo de Adaptador de Depuración).
- El motor de navegador Servo, escrito en Rust, ha añadido soporte para un modo oscuro. El tamaño del navegador ServoShell se ha reducido en un 20%. El soporte para especificaciones web ha alcanzado la capacidad de iniciar sesión y leer mensajes en Discord (el envío de mensajes aún no es posible).
- La empresa Mozilla ha presentado la herramienta Uniffi for React Native para crear módulos de React Native en Rust.
- Se ha realizado una prueba de rendimiento de codificadores de imágenes en formato PNG. Los decodificadores en Rust (png, zune-png, wuffs) resultaron ser más rápidos que los decodificadores en C (libpng, spng, stb_image). Por ejemplo, el paquete crate png (image-rs) superó a libpng en 1.8 veces en un sistema x86 y en 1.5 veces en un sistema ARM. image-rs: 375.401 MP/s (promedio) 318.632 MP/s (media geométrica) zune-png: 376.649 MP/s (promedio) 302.529 MP/s (media geométrica) wuffs: 376.205 MP/s (promedio) 287.181 MP/s (media geométrica) libpng: 208.906 MP/s (promedio) 173.034 MP/s (media geométrica) spng: 299.515 MP/s (promedio) 235.495 MP/s (media geométrica) stb_image: 234.353 MP/s (promedio) 171.505 MP/s (media geométrica)
Fuente: opennet.ru
