Lanzamiento del lenguaje de programación Rust 1.61

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

  • Es posible definir sus propios códigos de retorno desde la función principal. Originalmente, la función principal de Rust solo podía devolver el tipo "()" (unidad), que siempre indicaba un estado de salida exitoso a menos que el desarrollador llamara explícitamente a la función "proceso::salida(código)". En Rust 1.26, utilizando el rasgo Terminación inestable en la función principal, era posible devolver los valores “Ok” y “Err”, correspondientes a los códigos EXIT_SUCCESS y EXIT_FAILURE en programas C. En Rust 1.61, el rasgo Termination se ha estabilizado y se ha propuesto un tipo ExitCode separado para representar un código de retorno específico, que abstrae los tipos de retorno específicos de la plataforma al proporcionar constantes predefinidas ÉXITO y FALLO, y el método From. para devolver un código de retorno personalizado. utilizar std::proceso::Código de salida; fn main() -> Código de salida { if !check_foo() { return Código de salida::from(8); } Código de salida::ÉXITO }
  • Se han estabilizado capacidades adicionales de funciones definidas usando la expresión "const fn", que pueden llamarse no solo como funciones regulares, sino también usarse en cualquier contexto en lugar de constantes. Estas funciones se calculan en tiempo de compilación, no en tiempo de ejecución, por lo que están sujetas a ciertas restricciones, como la capacidad de leer solo desde constantes. En la nueva versión, se permiten operaciones básicas con punteros de función dentro de funciones constantes (se permite crear, pasar y convertir punteros, pero no llamar a una función mediante puntero); límites de rasgos para parámetros genéricos de funciones constantes como T: Copiar; rasgos distribuibles dinámicamente (dyn Trait); impl Tipos de rasgos para argumentos de funciones y valores de retorno.
  • La secuencia maneja Stdin, Stdout y Stderr en std::io ahora tiene una vida útil estática ("'static") cuando está bloqueada, lo que permite construcciones como "let out = std::io::stdout().lock();" con conseguir una manija y establecer un candado en una sola expresión.
  • 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:
    • Pin::static_mut
    • Pin::static_ref
    • Vec::retain_mut
    • VecDeque::retain_mut
    • Escribir para cursor<[u8; N]>
    • std::os::unix::net::SocketAddr::from_pathname
    • std::proceso::Código de salida
    • std::proceso::Terminación
    • std::thread::JoinHandle::is_finished
  • El atributo “const”, que determina la posibilidad de utilizarlo en cualquier contexto en lugar de constantes, se utiliza en las funciones:
    • <*const T>::desplazamiento y <*mut T>::desplazamiento
    • <*const T>::wrapping_offset y <*mut T>::wrapping_offset
    • <*const T>::añadir y <*mut T>::añadir
    • <*const T>::sub y <*mut T>::sub
    • <*const T>::wrapping_add y <*mut T>::wrapping_add
    • <*const T>::wrapping_sub y <*mut T>::wrapping_sub
    • <[T]>::as_mut_ptr
    • <[T]>::as_ptr_range
    • <[T]>::as_mut_ptr_range

Además, puede consultar el artículo "Rust: una retrospectiva crítica" con un resumen de las impresiones del lenguaje Rust después de escribir 100 mil líneas de código durante el desarrollo del sistema operativo microkernel Xous utilizado en el firmware. Las desventajas incluyen una sintaxis difícil de entender, un lenguaje incompleto y continuo, falta de compilaciones repetibles, problemas típicos con la confianza de dependencia en Crates.io y la necesidad de mantener cierta disciplina para escribir código seguro. Las características que superaron las expectativas incluyen herramientas para refactorizar código y reelaborar "trucos" agregados durante la creación rápida de prototipos.

Fuente: opennet.ru

Añadir un comentario