Lanzamiento del lenguaje de programación Rust 1.73

Se ha lanzado el lenguaje de programación de propósito general Rust 1.73, 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 rediseñado el formato de los mensajes emitidos por el controlador de fallos predeterminado del programa (pánico). El texto especificado en la macro "¡pánico!" ahora se muestra en una línea separada sin comillas, lo que hace que el mensaje sea más fácil de leer y elimina la confusión cuando hay comillas anidadas o divididas en varias líneas. fn main() { let archivo = "ferris.txt"; ¡pánico!("¡oh no! {archivo:?} ¡no encontrado!"); } Había un hilo 'principal' que entró en pánico ante '¡oh no! ¡"ferris.txt" no encontrado!', src/main.rs:3:5 El hilo 'main' entró en pánico en src/main.rs:3:5: ¡oh no! "ferris.txt" no encontrado!

    También se ha modificado la salida de mensajes que se muestran cuando se activan las macros “assert_eq” y “assert_ne”. fn main() { afirmar_eq!("🦀", "🐟", "ferris no es un pez"); } Hubo un hilo 'principal' que entró en pánico por 'aserción fallida: `(izquierda == derecha)` izquierda: `"🦀"`, derecha: `"🐟"`: ferris no es un pez', src/main.rs: 2:5 El hilo 'principal' entró en pánico en src/main.rs:2:5: la afirmación `izquierda == derecha` falló: ferris no es un pez izquierda: “🦀” derecha: “🐟”

  • De acuerdo con RFC 3184, se ha agregado la capacidad de manipular directamente claves de almacenamiento LocalKey locales de subproceso (thread_local). > y clave local > mediante el uso de los métodos get(), set(), take() y replace(), en lugar de utilizar un cierre "with(|inner| ...)", lo que elimina la necesidad de realizar código de inicialización adicional para el valores predeterminados especificados para subprocesos nuevos cuando se utiliza la macro "thread_local!" hilo_local! { COSAS estáticas: celular > = Celda::nuevo(Vec::nuevo()); } fn f() { // era COSAS.with(|i| i.set(vec![32, 1, 2])); // se convirtió en COSAS.set(vec![3, 1, 2]); // ... // se dejó v = THINGS.with(|i| i.take()); // se convirtió en let v: Vec = COSAS.tomar(); }
  • 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:
    • {entero} sin signo::div_ceil
    • {entero} sin signo::next_multiple_of
    • {entero} sin firmar::checked_next_multiple_of
    • std::ffi::FromBytesUntilNulError
    • std::os::unix::fs::chown
    • std::os::unix::fs::fchown
    • std::os::unix::fs::lfchown
    • Clave local:: >::obtener
    • Clave local:: >::conjunto
    • Clave local:: >::tomar
    • Clave local:: >::reemplazar
    • Clave local:: >::con_borrar
    • Clave local:: >::con_borrow_mut
    • Clave local:: >::conjunto
    • Clave local:: >::tomar
    • Clave local:: >::reemplazar
  • El atributo “const”, que determina la posibilidad de utilizarlo en cualquier contexto en lugar de constantes, se utiliza en las funciones:
    • rc::Débil::nuevo
    • sincronización::Débil::nuevo
    • No nulo::as_ref
  • El compilador proporciona registro de información de la versión en la sección ".comment", similar a GCC y Clang.
  • Se ha implementado el tercer nivel de soporte para las plataformas aarch64-unknown-teeos, csky-unknown-linux-gnuabiv2, riscv64-linux-android, riscv64gc-unknown-hermit, x86_64-unikraft-linux-musl y x86_64-unknown-linux -ooh. El tercer nivel implica soporte básico, pero sin pruebas automatizadas, publicación de compilaciones oficiales ni verificación de si el código se puede compilar.
  • Se ha implementado el segundo nivel de soporte para la plataforma de destino wasm32-wasi-preview1-threads. El segundo nivel de soporte implica una garantía de montaje.

Fuente: opennet.ru

Añadir un comentario