Se ha publicado la versión del lenguaje de programación de propósito general Rust 1.78, desarrollado originalmente por Mozilla, pero actualmente bajo el patrocinio de la organización 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 un recolector de basura y con un runtime reducido a la inicialización básica y el 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 propuesto un nuevo espacio de nombres de atributos «#[diagnostic]», que proporciona herramientas para influir en los mensajes de error emitidos por el compilador. El primero en este nuevo espacio es el atributo «#[diagnostic::on_unimplemented]», que se puede utilizar para personalizar los mensajes de error emitidos en situaciones donde se requiere utilizar un rasgo que no está implementado para un tipo. #[diagnostic::on_unimplemented( message = «My Message for `ImportantTrait` is not implemented for `{Self}`», label = «My Label», note = «Note 1», note = «Note 2» )] trait ImportantTrait {} fn use_my_trait(_: impl ImportantTrait) {} fn main() { use_my_trait(String::new()); } error[E0277]: My Message for `ImportantTrait` is not implemented for `String` —> src/main.rs:12:18 | 12 | use_my_trait(String::new()); | ———— ^^^^^^^^^^^^^ My Label | | | required by a bound introduced by this call | = help: the trait `ImportantTrait` is not implemented for `String` = note: Note 1 = note: Note 2
- Las comprobaciones preliminares de assert, que se aplican a funciones unsafe, ahora pueden posponerse hasta la etapa de generación de código, lo que permite realizar estas verificaciones sin necesidad de compilar la biblioteca estándar en modo «#[cfg(debug_assertions)]». Ahora, para activar las verificaciones, basta con habilitar los asserts de depuración para las construcciones de prueba o depuración de su código.
- El comportamiento de las funciones en la biblioteca estándar que afectan la alineación de punteros y slices ahora es predecible en tiempo de ejecución y depende de los datos de entrada. La función pointer::align_offset, que calcula el desplazamiento para alinear un puntero, ahora devuelve usize::MAX solo cuando la operación no se puede realizar. Las funciones slice::align_to y slice::align_to_mut, que transforman slices en una representación con un slice central alineado y los slices inicial y final originales, ahora siempre devuelven la parte central más grande.
- Se han trasladado a la categoría estable:
- impl Read for &Stdin
- Se permite el uso de un tiempo de vida no estático (no 'static) para algunas implementaciones relacionadas con std::error::Error.
- En la implementación impl se permite el uso del valor ?Sized.
- impl From para io::Error
- La función Barrier::new() se ha estabilizado para su uso con el modificador «const» en cualquier contexto en lugar de constantes.
- Para las plataformas objetivo x86_64-pc-windows-msvc, i686-pc-windows-msvc, x86_64-pc-windows-gnu, i686-pc-windows-gnu, x86_64-pc-windows-gnullvm y i686-pc-windows-gnullvm ahora se requiere al menos la versión Windows 10.
- Se ha implementado un tercer nivel de soporte para las plataformas wasm32-wasip2, arm64ec-pc-windows-msvc, armv8r-none-eabihf y loongarch64-unknown-linux-musl. El tercer nivel implica soporte básico, pero sin pruebas automatizadas, publicación de versiones oficiales y verificación de la capacidad de compilación del código.
- Se ha implementado un segundo nivel de soporte para la plataforma objetivo Add wasm32-wasip1. El segundo nivel de soporte implica garantía de compilación.
- La plataforma wasm32-wasi-preview1-threads ha sido renombrada a wasm32-wasip1-threads.
- El compilador ha sido trasladado a usar LLVM 18. Al usar LLVM 18 para las arquitecturas x86-32 y x86-64, se ha modificado el ABI relacionado con los tipos u128 e i128.
- En el gestor de paquetes Cargo, se ha estabilizado la versión 4 de los archivos de bloqueo (lockfile v4).
- En Cargo se ha estabilizado una caché global con información sobre el último uso de los datos. La caché se coloca en el archivo $CARGO_HOME/.global-cache utilizando SQLite, se actualiza automáticamente y refleja los cambios más recientes relacionados con el índice, el archivo crate, el directorio de código, git clone y git checkout.
También se puede mencionar el lenguaje de programación Borgo, que intenta ser más expresivo que el lenguaje Go, pero menos complicado que el lenguaje Rust. Borgo combina las mejores características de Go y Rust, compensando las debilidades de cada uno de los lenguajes. Por ejemplo, el lenguaje Go es simple y claro, pero no proporciona herramientas avanzadas para garantizar la seguridad al trabajar con tipos. El lenguaje Rust ofrece herramientas para programación segura, pero es demasiado complejo. El proyecto es desarrollado por Marco Sampellegrini, autor del libro «The Simple Haskell Handbook» y desarrollador del sistema de integración continua Quad CI.

En Borgo se utiliza la tipificación estática, tipos similares a los del lenguaje Go y una sintaxis parecida a Rust. La inclusión de puntos y coma al final de las líneas en el código de Borgo no es obligatoria. El código en el lenguaje Borgo se compila en una representación en el lenguaje Go, que es completamente compatible con los paquetes existentes del lenguaje Go. El código del compilador está escrito en el lenguaje Rust y se distribuye bajo la licencia ISC. use fmt enum NetworkState { Loading, Failed(int), Success(T), } struct Response { title: string, duration: int, } fn main() { let res = Response { title: "Hello world", duration: 0, } let state = NetworkState.Success(res) let msg = match state { NetworkState.Loading => "still loading", NetworkState.Failed(code) => fmt.Sprintf("Got error code: %d", code), NetworkState.Success(res) => res.title, } fmt.Println(msg) }
Fuente: opennet.ru
