Lanzamiento del lenguaje de programación Rust 1.58

Se ha publicado el lanzamiento del lenguaje de programación de propósito general Rust 1.58, 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 centra en la seguridad de la memoria, proporciona administración automática de la memoria y proporciona los medios para lograr un alto paralelismo de tareas sin utilizar un recolector de basura o tiempo de ejecución (el tiempo de ejecución se reduce a la inicialización y el mantenimiento básicos de la biblioteca estándar).

La gestión automática de la memoria de Rust elimina errores al manipular punteros y protege contra problemas derivados de la manipulación de la memoria de bajo nivel, como el acceso a una región de memoria después de haber sido liberada, desreferencias de punteros nulos, desbordamientos de búfer, etc. Para distribuir bibliotecas, garantizar el ensamblaje y gestionar dependencias, el proyecto está desarrollando el administrador de paquetes Cargo. El repositorio crates.io es compatible con bibliotecas de alojamiento.

Principales novedades:

  • En los bloques de formato de línea, además de la capacidad previamente disponible de sustituir variables enumeradas explícitamente después de una línea por número y nombre, se implementa la capacidad de sustituir identificadores arbitrarios agregando la expresión "{identificador}" a la línea. Por ejemplo: // Construcciones admitidas anteriormente: println!("¡Hola, {}!", get_person()); println!("¡Hola, {0}!", get_person()); println!("¡Hola, {persona}!", persona = get_persona()); // ahora puedes especificar let person = get_person(); println!("¡Hola, {persona}!");

    Los identificadores también se pueden especificar directamente en las opciones de formato. let (ancho, precisión) = get_format(); for (nombre, puntuación) in get_scores() { println!("{nombre}: {puntuación:ancho$.precision$}"); }

    La nueva sustitución funciona en todas las macros que admiten la definición de formato de cadena, con la excepción de la macro "panic!". en las versiones 2015 y 2018 del lenguaje Rust, en las que pánico!("{ident}") se trata como una cadena normal (en Rust 2021 la sustitución funciona).

  • Se ha cambiado el comportamiento de la estructura std::process::Command en la plataforma Windows para que al ejecutar comandos, por razones de seguridad, ya no busque archivos ejecutables en el directorio actual. El directorio actual está excluido porque podría usarse para ejecutar código malicioso si los programas se ejecutan en directorios que no son de confianza (CVE-2021-3013). La nueva lógica de detección de ejecutables implica buscar en los directorios de Rust, el directorio de la aplicación, el directorio del sistema de Windows y los directorios especificados en la variable de entorno PATH.
  • La biblioteca estándar ha ampliado la cantidad de funciones marcadas "#[must_use]" para emitir una advertencia si se ignora el valor de retorno, lo que ayuda a identificar errores causados ​​al suponer que una función cambiará los valores en lugar de devolver un nuevo valor.
  • 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:
    • Metadatos::is_symlink
    • Ruta::is_symlink
    • {entero}::saturando_div
    • Opción::unwrap_unchecked
    • Resultado::unwrap_unchecked
    • Resultado::unwrap_err_unchecked
  • El atributo “const”, que determina la posibilidad de utilizarlo en cualquier contexto en lugar de constantes, se utiliza en las funciones:
    • Duración::nueva
    • Duración::checked_add
    • Duración::saturando_add
    • Duración::checked_sub
    • Duración::saturando_sub
    • Duración::checked_mul
    • Duración::saturando_mul
    • Duración::checked_div
  • Se permitió la desreferenciación de punteros "*const T" en contextos "const".
  • En el administrador de paquetes Cargo, el campo Rust_version se agregó a los metadatos del paquete y la opción “--message-format” se agregó al comando “cargo install”.
  • El compilador implementa soporte para el mecanismo de protección CFI (Integridad del flujo de control), que agrega comprobaciones antes de cada llamada indirecta para detectar algunas formas de comportamiento indefinido que podrían conducir potencialmente a una violación del orden de ejecución normal (flujo de control) como resultado de la uso de exploits que cambian punteros almacenados en la memoria en funciones.
  • El compilador ha agregado soporte para las versiones 5 y 6 del formato de comparación de cobertura LLVM, utilizado para evaluar la cobertura del código durante las pruebas.
  • En el compilador, los requisitos para la versión mínima de LLVM aumentan a LLVM 12.
  • Se ha implementado el tercer nivel de soporte para la plataforma x86_64-unknown-none. 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.

Además, podemos destacar la publicación por parte de Microsoft del lanzamiento de las bibliotecas Rust para Windows 0.30, que permiten utilizar el lenguaje Rust para desarrollar aplicaciones para el sistema operativo Windows. El conjunto incluye dos paquetes crate (windows y windows-sys), a través de los cuales puede acceder a la API Win en los programas Rust. El código para la compatibilidad con API se genera dinámicamente a partir de metadatos que describen la API, lo que le permite implementar compatibilidad no solo para las llamadas API de Win existentes, sino también para las llamadas que aparecerán en el futuro. La nueva versión agrega soporte para la plataforma de destino UWP (Plataforma universal de Windows) e implementa los tipos Handle y Debug.

Fuente: opennet.ru

Añadir un comentario