Lanzamiento del lenguaje de programación Rust 1.34

Se ha lanzado el lenguaje de programación del sistema Rust 1.34, desarrollado por el proyecto Mozilla. El lenguaje se centra en la seguridad de la memoria, proporciona administración automática de la memoria y proporciona un medio para lograr un alto paralelismo de tareas sin utilizar un recolector de basura o tiempo de ejecución.

La administración automática de memoria de Rust libera al desarrollador de la manipulación del puntero y protege contra problemas que surgen de la manipulación de la memoria de bajo nivel, como accesos posteriores a la memoria, desreferencias de punteros nulos, desbordamientos del búfer y similares. Para distribuir bibliotecas, garantizar el montaje y gestionar dependencias, el proyecto está desarrollando el administrador de paquetes Cargo, que permite obtener las bibliotecas necesarias para el programa con un solo clic. El repositorio crates.io es compatible con bibliotecas de alojamiento.

Principales novedades:

  • El administrador de paquetes Cargo ha agregado herramientas para trabajar con registros de paquetes alternativos que pueden coexistir con el registro público crates.io. Por ejemplo, los desarrolladores de aplicaciones propietarias ahora pueden usar su propio registro privado, que se puede usar al enumerar dependencias en Cargo.toml, y aplicar un modelo de control de versiones similar a crates.io para sus productos, así como referir dependencias a ambas cajas. io y a su propio registro.

    Para agregar un registro externo a ~/.cargo/config
    Se proporciona una nueva opción "mi-registro" en la sección "[registros]", y se ha agregado una opción "otra caja" para mencionar el registro externo en dependencias en Cargo.toml en la sección "[dependencias]". Para conectarse a un registro adicional, simplemente coloque el token de autenticación en el archivo ~/.cargo/credentials y ejecute el comando
    "cargo login --registry=my-registry" y publicar un paquete -
    "publicación de carga -registro=mi-registro";

  • Se agregó soporte completo para usar el operador "?". en doctests, que le permiten utilizar código de ejemplo de la documentación como pruebas. Anteriormente operador
    "?" podría usarse para manejar errores durante la ejecución de la prueba solo en presencia de la función “fn main()” o en las funciones “#[test]”;

  • En los atributos personalizados definidos mediante macros de procedimientos, es posible utilizar conjuntos arbitrarios de tokens (“#[attr($tokens)]”, “#[attr[$tokens]] y #[attr{$tokens}]”). Anteriormente, los elementos solo podían especificarse en forma de árbol/recursiva usando cadenas literales, por ejemplo “#[foo(bar, baz(quux, foo = “bar”))]”, pero ahora es posible usar enumeraciones (' #[range(0. .10)]') y construcciones como “#[bound(T: MyTrait)]”;
  • Las características TryFrom y TryInto se han estabilizado, lo que permite conversiones de tipos con manejo de errores. Por ejemplo, métodos como from_be_bytes con tipos enteros usan matrices como entrada, pero los datos a menudo vienen en un tipo Slice, y la conversión entre matrices y divisiones es problemática si se realiza manualmente. Con la ayuda de nuevos rasgos, la operación especificada se puede realizar sobre la marcha mediante una llamada a .try_into(), por ejemplo, “let num = u32::from_be_bytes(slice.try_into()?)”. Para las conversiones que siempre tienen éxito (por ejemplo, del tipo u8 a u32), se ha agregado un tipo de error infalible para permitir el uso transparente de
    TryFrom para todas las implementaciones existentes de "From";

  • Se desaprobó la función CommandExt::before_exec, que permitía la ejecución de un controlador antes de exec que se ejecutaba en el contexto de un proceso hijo bifurcado después de la llamada fork(). En tales condiciones, algunos recursos del proceso principal, como descriptores de archivos y áreas de memoria asignadas, podrían duplicarse, lo que podría provocar un comportamiento indefinido y un funcionamiento incorrecto de las bibliotecas.
    En lugar de before_exec, se recomienda utilizar la función insegura CommandExt::pre_exec.

  • Tipos de enteros atómicos estabilizados con y sin signo que varían en tamaño de 8 a 64 bits (por ejemplo, AtomicU8), así como tipos con signo NonZeroI[8|16|32|54|128].
  • Una nueva parte de la API se ha movido a la categoría estable, incluido Any::type_id, Error::type_id, slice::sort_by_cached_key, str::escape_*, str::split_ascii_whitespace, Instant::checked_[add|sub ] y los métodos SystemTime se han estabilizado ::checked_[add|sub]. Las funciones iter::from_fn e iter::successors se han estabilizado;
  • Para todos los tipos de enteros, se implementan los métodos check_pow, saturating_pow, wraping_pow y overflowing_pow;
  • Se agregó la capacidad de habilitar optimizaciones en la etapa de vinculación especificando la opción de compilación “-C linker-plugin-lto” (rustc compila el código Rust en código de bits LLVM, lo que permite aplicar optimizaciones LTO).

Fuente: opennet.ru

Añadir un comentario