Lanzamiento del lenguaje de programación Rust 1.75 y unikernel Hermit 0.6.7

Se ha lanzado el lenguaje de programación de propósito general Rust 1.75, 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 agregó la capacidad de usar “async fn” y la notación “->impl Trait” en rasgos privados. Por ejemplo, usando “->impl Trait” puedes escribir un método de rasgo que devuelva un iterador: rasgo Contenedor { fn items(&self) -> impl Iterador; } contenedor impl para MyContainer { fn items(&self) -> iterador impl { self.items.iter().cloned() } }

    También puede crear rasgos usando "async fn": trace HttpService { async fn fetch(&self, url: Url) -> HtmlBody; // se expandirá a: // fn fetch(&self, url: Url) -> impl Future; }

  • Se agregó API para calcular compensaciones de bytes en relación con los punteros. Cuando se trabaja con punteros simples (“*const T” y “*mut T”), es posible que se requieran operaciones para agregar un desplazamiento al puntero. Anteriormente, para esto era posible utilizar una construcción como “::add(1)”, sumando el número de bytes correspondiente al tamaño de “size_of::()”. La nueva API simplifica esta operación y permite manipular compensaciones de bytes sin convertir primero los tipos a "*const u8" o "*mut u8".
    • puntero::byte_add
    • puntero::byte_offset
    • puntero::byte_offset_from
    • puntero::byte_sub
    • puntero::wrapping_byte_add
    • puntero::wrapping_byte_offset
    • puntero::wrapping_byte_sub
  • Trabajo continuo para aumentar el rendimiento del compilador Rustc. Se agregó el optimizador BOLT, que se ejecuta en la etapa posterior al enlace y utiliza información de un perfil de ejecución preparado previamente. El uso de BOLT le permite acelerar la ejecución del compilador en aproximadamente un 2% cambiando el diseño del código de la biblioteca librustc_driver.so para un uso más eficiente de la memoria caché del procesador.

    Incluyó la construcción del compilador Rustc con la opción "-Ccodegen-units=1" para mejorar la calidad de la optimización en LLVM. Las pruebas realizadas muestran un aumento en el rendimiento en el caso de la compilación “-Ccodegen-units=1” de aproximadamente un 1.5%. Las optimizaciones agregadas están habilitadas de forma predeterminada solo para la plataforma x86_64-unknown-linux-gnu.

    Google probó las optimizaciones mencionadas anteriormente para reducir el tiempo de compilación de los componentes de la plataforma Android escritos en Rust. El uso de "-C codegen-units=1" al compilar Android nos permitió reducir el tamaño del kit de herramientas en un 5.5 % y aumentar su rendimiento en un 1.8 %, mientras que el tiempo de compilación del kit de herramientas en sí casi se duplicó.

    Habilitar la recolección de basura en tiempo de enlace (“--gc-sections”) aumentó la ganancia de rendimiento hasta un 1.9 %, lo que permitió la optimización del tiempo de enlace (LTO) hasta un 7.7 % y optimizaciones basadas en perfiles (PGO) hasta un 19.8 %. En la final, se aplicaron optimizaciones utilizando la utilidad BOLT, lo que permitió aumentar la velocidad de construcción al 24.7%, pero el tamaño del conjunto de herramientas aumentó en un 10.9%.

    Lanzamiento del lenguaje de programación Rust 1.75 y unikernel Hermit 0.6.7

  • 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:
    • Atómico*::from_ptr
    • tiempos de archivo
    • ArchivoHorasExt
    • Archivo::set_modificado
    • Archivo::set_times
    • Direcciónip::to_canonical
    • Dirección IPv6::to_canonical
    • Opción::as_slice
    • Opción::as_mut_slice
    • puntero::byte_add
    • puntero::byte_offset
    • puntero::byte_offset_from
    • puntero::byte_sub
    • puntero::wrapping_byte_add
    • puntero::wrapping_byte_offset
    • puntero::wrapping_byte_sub
  • El atributo “const”, que determina la posibilidad de utilizarlo en cualquier contexto en lugar de constantes, se utiliza en las funciones:
    • Ipv6Addr::to_ipv4_mapped
    • QuizásUninit::assume_init_read
    • QuizásUninit::puesto a cero
    • mem::discriminante
    • mem::puesto a cero
  • Se ha implementado el tercer nivel de soporte para las plataformas csky-unknown-linux-gnuabiv2hf, i586-unknown-netbsd y mipsel-unknown-netbsd. 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 una nueva versión del proyecto Hermit, que desarrolla un kernel especializado (unikernel), escrito en lenguaje Rust, que proporciona herramientas para crear aplicaciones autónomas que pueden ejecutarse sobre un hipervisor o hardware básico sin capas adicionales. y sin sistema operativo. Cuando se construye, la aplicación está vinculada estáticamente a una biblioteca, que implementa de forma independiente todas las funciones necesarias, sin estar vinculada al kernel del sistema operativo ni a las bibliotecas del sistema. El código del proyecto se distribuye bajo licencias Apache 2.0 y MIT. El ensamblaje es compatible con la ejecución independiente de aplicaciones escritas en Rust, Go, Fortran, C y C++. El proyecto también está desarrollando su propio gestor de arranque que le permite iniciar Hermit usando QEMU y KVM.

Fuente: opennet.ru

Añadir un comentario