Se ha lanzado el lenguaje de programación de propósito general Rust 1.84, 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:
- El administrador de paquetes Cargo tiene un mecanismo de procesamiento de dependencias estabilizado que selecciona versiones de componentes dependientes teniendo en cuenta la compatibilidad con las versiones del compilador Rust declaradas como mínimamente admitidas por el proyecto (MSRV, versión mínima admitida de Rust). La nueva característica elimina la necesidad de que los mantenedores seleccionen manualmente versiones anteriores de cada dependencia en proyectos que siguen siendo compatibles con versiones anteriores del kit de herramientas Rust. El nuevo modo de resolución de dependencia se habilitará de forma predeterminada en la versión Rust 1.85, pero por ahora está disponible como una opción que se puede habilitar especificando 'incompatible-rust-versions = " en la sección "[resolver]" del archivo ". archivo cargo/config.toml". fallback"'.
- Hemos comenzado a convertir el compilador en un nuevo solucionador de tipos, diseñado para comprobar los límites de aplicabilidad de los rasgos, normalizar tipos y evaluar la compatibilidad de tipos. En la versión 1.84, se utiliza un nuevo controlador para comprobar la coherencia de las implementaciones de rasgos, es decir. evaluar la existencia de como máximo un rasgo para el tipo en cuestión, teniendo en cuenta el código de otros paquetes de cajas. Esta verificación nos permitió deshacernos de problemas en la implementación del controlador de tipos anterior que podrían generar conflictos debido a la intersección de implementaciones de diferentes tipos.
- Se ha propuesto una nueva API de "procedencia estricta", que se puede utilizar para convertir un puntero en un número entero y viceversa, teniendo en cuenta los metadatos adjuntos al puntero con información sobre su origen y área de uso (además de la dirección, el valor "procedencia" se adjunta al puntero con información sobre la conexión con otros punteros, lo que le 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 le permite realizar operaciones de puntero de bajo nivel, como almacenar información adicional en los bits de orden inferior del puntero, sin convertir el puntero en un número entero.
- 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:
- Ipv6Addr::is_unique_local
- Ipv6Addr::is_unicast_link_local
- núcleo::ptr::con_expuesta_procedencia
- core::ptr::with_exposed_provenance_mut
- ::dirección
- ::exponer_procedencia
- ::con_dirección
- ::map_addr
- ::isqrt
- ::checked_isqrt
- ::isqrt
- No cero::isqrt
- núcleo::ptr::sin_procedencia
- core::ptr::sin_provenance_mut
- núcleo::ptr::colgante
- núcleo::ptr::dangling_mut
- Pin::as_deref_mut
- El signo "const" se utiliza en funciones:
- AtomicBool::from_ptr
- AtomicPtr::from_ptr
- AtomicU8::from_ptr
- AtomicU16::from_ptr
- AtomicU32::from_ptr
- AtomicU64::from_ptr
- AtomicUsize::from_ptr
- AtómicoI8::from_ptr
- AtómicoI16::from_ptr
- AtómicoI32::from_ptr
- AtómicoI64::from_ptr
- AtomicIsize::from_ptr
- ::is_null
- ::as_ref
- ::as_mut
- Pin::nuevo
- 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 la compatibilidad con inserciones en línea de ensamblador para arquitecturas s390x y Arm64EC.
- Se ha estabilizado la compatibilidad con la funcionalidad de valores múltiples, tipos de referencia y llamadas finales para la plataforma de destino WebAssembly.
- Se ha implementado el segundo nivel de soporte para la plataforma wasm32v1-none. El segundo nivel de soporte implica una garantía de montaje.
Además, se pueden destacar varios proyectos relacionados con Rust:
- Se ha publicado el lanzamiento del sistema operativo Tock 2.2, escrito en lenguaje Rust y destinado a su uso en microcontroladores. El sistema permite la ejecución simultánea de múltiples aplicaciones que no son de confianza en dispositivos integrados con tamaño de RAM limitado, como sensores, TPM (módulo de plataforma segura), 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 el aislamiento de las capas de aplicación, kernel y controlador, así como el aislamiento de cada aplicación y controlador por separado. El aislamiento utiliza tanto las capacidades del lenguaje Rust como la separación en el nivel de protección de la memoria.
- El proyecto VEKOS (Verified Experimental Kernel OS) desarrolla un kernel de sistema operativo en lenguaje Rust, que proporciona verificación de componentes ejecutables. Para cada operación del sistema de archivos, creación de procesos y asignación de memoria, se genera una prueba criptográfica que permite verificar la operación durante la ejecución (la implementación se compara con el uso de una cadena de bloques para verificar acciones en el sistema operativo). En el sistema de archivos VKFS, para garantizar la integridad y la protección contra la distorsión retroactiva, se utiliza la estructura "Merkle Tree", en la que cada rama verifica todas las ramas y nodos subyacentes, gracias al hashing del árbol. La asignación de memoria se realiza en modo COW (copia en escritura).
- Un grupo de investigadores de Microsoft e Inria está desarrollando un subconjunto del lenguaje C, Mini-C, diseñado para traducir automáticamente programas C a una representación de Rust. A diferencia del compilador c2rust, el nuevo proyecto permite generar código Rust sin utilizar código no seguro, pero está dirigido principalmente a convertir proyectos C que tengan una prueba formal de confiabilidad. La implicación es que será más fácil convertir primero un proyecto C a una representación Mini-C que no permita la aritmética de punteros que reescribir bloques inseguros después de compilar directamente desde C a Rust.
La implementación del compilador se basa en el kit de herramientas KaRaMeL. Mini-C se desarrolló y probó como parte de un proyecto para reescribir la biblioteca criptográfica HACL* en Rust, para el cual se proporcionó una prueba formal de confiabilidad. Se utilizó una prueba similar para demostrar la capacidad de generar código Rust seguro a partir de Mini-C.
- Daniel Stenberg, el autor de la utilidad curl, anunció que el proyecto Curl ya no desarrollará ni mantendrá un backend HTTP alternativo escrito en Rust utilizando la biblioteca Hyper. El motivo aducido es la falta de interés por parte de desarrolladores y usuarios.
- Se ha anunciado la versión beta del shell de comandos Fish 4.0, reescrito en Rust. Cabe señalar que después de dos años de desarrollo, el código base de Fish se transfirió por completo de C++ a Rust. La transición a Rust nos permitió resolver problemas con subprocesos múltiples, obtener herramientas modernas que detectan errores en la etapa de compilación, mejorar la seguridad de la memoria y hacer que el proyecto sea más atractivo para los nuevos desarrolladores.
- El Proyecto Tor ha publicado el lanzamiento de Arti 1.3.2, una implementación alternativa del cliente Tor en Rust. Arti proporciona una biblioteca integrable que puede ser utilizada por varias aplicaciones. Al crear Arti, se tuvo en cuenta la experiencia pasada en el desarrollo de Tor para evitar problemas arquitectónicos conocidos y hacer que el proyecto sea más modular y eficiente. La rama 1.x está marcada como adecuada para uso de usuarios generales y proporciona el mismo nivel de privacidad, usabilidad y estabilidad que la implementación principal de C. La nueva versión continúa el desarrollo de RPC, se han hecho preparativos para implementar soporte de retransmisión y se ha agregado protección contra ataques DoS en los servicios Onion.
- Se ha publicado el lanzamiento del motor de juego Bevy 0.15, escrito en Rust. El motor utiliza un modelo basado en datos para definir la lógica del juego, construido sobre un conjunto de componentes Bevy ECS (Entity Component System) ya preparados que se pueden ejecutar en paralelo. Admite renderizado 2D y 3D, animación esquelética, definición de gráficos de renderizado, sistema de generación de escenas, marco de interfaz de usuario y realización de cambios en escenas y recursos sin necesidad de reiniciar.
- Se ha publicado el editor de texto de consola Helix 25.01, escrito en Rust y ampliando las ideas inherentes a vim y neovim. Admite integración con servidores LSP y Tree-sitter, selección simultánea de varios bloques, uso de múltiples cursores al editar, temas y protocolo de depuración DAP (Debug Adapter Protocol).
- El motor del navegador Servo, escrito en Rust, ha agregado soporte para un modo de diseño oscuro. El tamaño del navegador ServoShell se ha reducido en un 20%. La compatibilidad con las especificaciones web se ha ampliado a la capacidad de iniciar sesión y leer mensajes en Discord (aún no es posible enviar mensajes).
- Mozilla presentó el kit de herramientas Uniffi for React Native para crear módulos para React Native en el lenguaje Rust.
- Se ha probado el rendimiento de los codificadores de imágenes PNG. Los decodificadores Rust (png, zune-png, wuffs) resultaron ser más rápidos que los decodificadores C (libpng, spng, stb_image). Por ejemplo, el paquete crate png (image-rs) superó a libpng 1.8 veces en un sistema x86 y 1.5 veces en un sistema ARM. image-rs: 375.401 MP/s (promedio) 318.632 MP/s (geomedia) zune-png: 376.649 MP/s (promedio) 302.529 MP/s (geomedia) wuffs: 376.205 MP/s (promedio) 287.181 MP/s ( geomedia) libpng: 208.906 MP/s (promedio) 173.034 MP/s (geomedia) spng: 299.515 MP/s (promedio) 235.495 MP/s (geomedia) stb_image: 234.353 MP/s (promedio) 171.505 MP/s (geomedia)
Fuente: opennet.ru
