Se lanzó Rust 1.78. Lenguaje Borgo que combina las fortalezas de Go y Rust

Se ha lanzado el lenguaje de programación de propósito general Rust 1.78, 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:

  • Se ha propuesto un nuevo espacio de nombres de atributo "#[diagnostic]", que proporciona un medio para influir en los mensajes de error producidos por el compilador. El primero en el nuevo espacio es el atributo "#[diagnostic::on_unimplemented]", que se puede usar para personalizar los mensajes de error generados en una situación en la que se necesita usar un rasgo que no está implementado para el tipo. #[diagnostic::on_unimplemented( message = "Mi mensaje para `ImportantTrait<{A}>` no está implementado para `{Self}`", etiqueta = "Mi etiqueta", nota = "Nota 1", nota = "Nota 2" )] rasgo ImportanteTrait {} fn use_my_trait(_: impl ImportanteTrait ) {} fn main() { use_my_trait(String::new()); } error[E32]: Mi mensaje para `ImportantTrait ` no está implementado para `Cadena` —> src/main.rs:0277:32 | 12 | use_my_trait(String::new()); | ———— ^^^^^^^^^^^^^ Mi etiqueta | | | requerido por un límite introducido por esta convocatoria | = ayuda: el rasgo `ImportantTrait ` no está implementado para `String` = nota: Nota 18 = nota: Nota 12
  • Las comprobaciones previas a las afirmaciones aplicadas a funciones inseguras ahora se pueden aplazar hasta la generación del código, lo que permite realizar estas comprobaciones sin la necesidad de crear la biblioteca estándar en el modo "#[cfg(debug_assertions)]". Para activar comprobaciones, ahora es suficiente habilitar las afirmaciones de depuración para las compilaciones de prueba o depuración de su código.
  • El comportamiento de las funciones de la biblioteca estándar que afectan la alineación de punteros y sectores 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 el puntero, ahora devuelve usize::MAX solo si la operación falla. Las funciones slice::align_to y slice::align_to_mut, que transforman los cortes en una representación con un corte medio alineado y los cortes iniciales y finales originales, ahora siempre devuelven la parte media más grande.
  • Fueron transferidos a la categoría estable:
    • lectura impl para &Stdin
    • Permitir el uso de una vida útil no estática (no estática) para algunas implementaciones relacionadas con std::error::Error.
    • Implementación implementada ?Se permite el valor de tamaño.
    • implícito De para io::Error
  • La función Barrier::new() se ha estabilizado para usarse con el atributo "const" en cualquier contexto en lugar de constantes.
  • Para plataformas de destino 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 requiere al menos la versión de Windows 10.
  • Se ha implementado el 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 compilaciones oficiales y verificación de la capacidad de compilación del código.
  • Se ha implementado el segundo nivel de soporte para la plataforma de destino Add wasm32-wasip1. El segundo nivel de soporte implica una garantía de montaje.
  • La plataforma wasm32-wasi-preview1-threads ha cambiado de nombre a wasm32-wasip1-threads.
  • El compilador se cambió para usar LLVM 18. Cuando se usa LLVM 18 para arquitecturas x86-32 y x86-64, se cambió la ABI asociada con los tipos u128 e i128.
  • En el administrador de pactos de carga, se ha estabilizado la versión 4 de los archivos de bloqueo (lockfile v4).
  • Cargo tiene un caché global estabilizado con información sobre el uso de datos más reciente. El caché está alojado en $CARGO_HOME/.global-cache usando SQLite y se actualiza automáticamente para reflejar los últimos cambios en el índice, el archivo crate, el directorio de códigos, git clone y git checkout.

Además, el lenguaje de programación Borgo intenta ser más expresivo que el lenguaje Go, pero menos complejo que el lenguaje Rust. Borgo combina las mejores características de Go y Rust, compensando las deficiencias de cada idioma. Por ejemplo, Go es simple y directo, pero no proporciona funciones de seguridad avanzadas. El lenguaje Rust proporciona herramientas para una programación segura, pero es demasiado complicado. El proyecto está siendo desarrollado por Marco Sampellegrini, autor de The Simple Haskell Handbook y desarrollador del sistema de integración continua Quad CI.

Se lanzó Rust 1.78. Lenguaje Borgo que combina las fortalezas de Go y Rust

Borgo utiliza escritura estática, tipos similares a Go y sintaxis similar a Rust. Los puntos y coma son opcionales al final de las líneas en el código Borgo. El código Borgo se compila en una representación de Go que es totalmente compatible con los paquetes de Go existentes. El código del compilador está escrito en Rust y se distribuye bajo la licencia ISC. utilizar la enumeración fmt NetworkState { Cargando, Fallido(int), Éxito(T), } struct Respuesta { título: cadena, duración: int, } fn main() { let res = Respuesta { título: “Hola mundo”, duración: 0, } let state = NetworkState.Success(res) let msg = coincidir con el estado { NetworkState.Loading => “aún cargando”, NetworkState.Failed(código) => fmt.Sprintf(“Obtuve el código de error: %d”, código), NetworkState.Success (res) => res.título, } fmt.Println(msg) }

Fuente: opennet.ru

Añadir un comentario