Se ha publicado la versión 1.89 del lenguaje de programación Rust, que fue desarrollado originalmente por Mozilla y ahora es mantenido por la organización sin fines de lucro Rust Foundation. El lenguaje se centra en la gestión segura de la memoria y ofrece herramientas para lograr un alto paralelismo en la ejecución de tareas, todo ello sin necesidad de un recolector de basura ni un runtime (el runtime se limita a la inicialización básica y al soporte 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 la posibilidad de utilizar el carácter «_» como argumento de parámetros genéricos con la marca «const» para inferir los valores de esos parámetros en función del contexto circundante. pub fn all_false<const LEN: usize>() -> [bool; LEN] { [false; _] }
- Se ha añadido un nuevo aviso lint «mismatched_lifetime_syntaxes» para abordar el problema de la ambigüedad en la definición de la duración de vida en las firmas de funciones al utilizar el mecanismo de «lifetime elision» (que determina automáticamente la duración de vida de las referencias, permitiendo eludir la especificación manual). Este aviso verifica que los parámetros de entrada y salida de la función pertenezcan al mismo grupo de tipos. Los grupos se forman en base al soporte de la especificación explícita de la duración de vida y la posibilidad de inferencia automática de la duración de vida por parte del compilador (por ejemplo, en los tipos «&’a T» y «ContainsLifetime<‘a>» puede haber una duración de vida explícita, pero el compilador no puede determinarla automáticamente, mientras que en los tipos «&T», «&’_ T» y «ContainsLifetime<‘_>» se admite tanto la especificación explícita como la inferencia automática).
- En el atributo «target_feature» para sistemas x86 se ha implementado un mecanismo para verificar el soporte de conjuntos de instrucciones ampliadas sha512, sm3, sm4, kl y widekl, así como funciones individuales avx512. #[target_feature(enable = «avx512bw»)] pub fn cool_simd_code( .. *) -> … * { … * }
- Se ha facilitado la ejecución de doctest (pruebas integradas en la documentación) no sólo para la plataforma de destino actual, sino también para otras plataformas especificadas al iniciar el gestor de paquetes «cargo» («cargo test —doc —target other_target»).
- Para las funciones ‘extern «C»‘ al compilar para la plataforma de destino «wasm32-unknown-unknown» se ha implementado el estándar C ABI para WebAssembly.
- Con algunas salvedades en relación con la compatibilidad de tipos, se permite el uso de los tipos i128 y u128 en funciones externas de C (extern "C"), para las cuales anteriormente se mostró una advertencia de lint "improper_ctypes_definitions".
- Se ha trasladado un nuevo lote de API a la categoría estable, incluyendo la estabilización de métodos e implementaciones de traits:
- Muchas funciones intrínsecas integradas en el compilador para procesadores x86, incluyendo funciones para AVX512, SHA512, SM3 y SM4.
- NonZero
- File::lock
- File::lock_shared
- File::try_lock
- File::try_lock_shared
- File::unlock
- NonNull::from_ref
- NonNull::from_mut
- NonNull::without_provenance
- NonNull::with_exposed_provenance
- NonNull::expose_provenance
- OsString::leak
- PathBuf::leak
- Result::flatten
- std::os::linux::net::TcpStreamExt::quickack
- std::os::linux::net::TcpStreamExt::set_quickack
El atributo «const» se aplica en las funciones:
- ::as_mut_slice
- ::eq_ignore_ascii_case
- str::eq_ignore_ascii_case
- Se inició el proceso de transición de la plataforma objetivo "x86_64-apple-darwin" del primer nivel de soporte al segundo (Apple planea eliminar el soporte para la arquitectura x86_64). El primer nivel de soporte implica la creación de compilaciones binarias, la realización de pruebas exhaustivas y proporcionar la mayor garantía de soporte de la plataforma: cada cambio en el compilador se verifica ejecutando un conjunto completo de pruebas. El segundo nivel de soporte implica la garantía de compilación, pero sin garantías en el paso del conjunto de pruebas.
- Se ha implementado un tercer nivel de soporte para las plataformas "loongarch32-unknown-none" y "loongarch32-unknown-none-softfloat". El tercer nivel implica soporte básico, pero sin pruebas automatizadas, publicación de compilaciones oficiales y verificación de la capacidad de compilación de código.
Además, se pueden notar eventos y proyectos relacionados con Rust:
- Se publicó un informe sobre el estado de los paquetes en Rust en Debian. Se observa que en la rama Debian Unstable (Sid) aproximadamente el 8% de los paquetes src en el repositorio principal están relacionados con dependencias de compilación de al menos un paquete "librust-*". En Debian 12, tales paquetes eran del 4.5%. También se observó que más de 3 mil paquetes incluyen código en Rust, que se ha trasladado a paquetes librust-..-dev, y 150 paquetes src proporcionan ejecutables o bibliotecas Rust compiladas.
Entre los paquetes de interés para Debian se mencionan sudo-rs, ntpd-rs, uutils, Sequoia, rpgp, hickory (DNS), Rustls, rav1d y fish. El soporte opcional para Rust se ha implementado en APT, QEMU (virtiofsd), el núcleo de Linux y Mesa, y se espera en LibreOffice. Se ha desarrollado una herramienta debcargo para convertir paquetes crate en paquetes src de Debian.
- Se presenta el proyecto tmux-rs, un clon del multiplexor de terminal tmux (gerente de ventanas de consola), reescrito de C a Rust.
- El desarrollador del controlador Tyr de Collabora publicó un artículo sobre la arquitectura de controladores que operan a nivel núcleo para GPU y los principios de desarrollo de tales controladores en el lenguaje Rust.
- Se demostró una aplicación universal en el lenguaje Rust, capaz de ejecutarse tanto en CPU como en diversas plataformas GPU: CUDA para NVIDIA, SPIR-V para GPUs compatibles con Vulkan, Metal para Apple, DirectX 12 para Windows y WebGPU para navegadores.
Fuente: opennet.ru
