Lanzamiento del lenguaje de programación Rust 1.38

publicado lanzamiento del lenguaje de programación del sistema Moho 1.38, fundado 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 gestión automática de la 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. Se está desarrollando un administrador de paquetes para distribuir bibliotecas, garantizar el ensamblaje y gestionar las dependencias del proyecto. , permitiéndole obtener las bibliotecas necesarias para el programa con un solo clic. Se admite un repositorio para alojar bibliotecas. cajas.io.

El principal innovaciones:

  • Se agregó un modo de compilación canalizada (canalización), en el que la compilación de un paquete de caja dependiente comienza tan pronto como los metadatos de dependencia estén disponibles, sin esperar a que se complete su compilación. Al compilar un paquete, no es necesario ensamblar completamente las dependencias, solo definir los metadatos, que incluyen listas de tipos, dependencias y elementos exportados. Los metadatos están disponibles en las primeras etapas del proceso de compilación, por lo que los paquetes vinculados ahora se pueden compilar mucho antes. Al compilar paquetes individuales, el modo propuesto no afecta el rendimiento, pero si la compilación cubre paquetes con dependencias ramificadas, el tiempo total de compilación se puede reducir entre un 10% y un 20%;
  • Garantiza la detección del uso incorrecto de funciones. std::mem::no inicializado и std::mem::puesto a cero. Por ejemplo, std::mem::uninitialized es conveniente para crear matrices rápidamente, pero confunde al compilador porque parece estar inicializado, pero en realidad el valor permanece sin inicializar. La función mem::uninitialized ya está marcada como obsoleta y se recomienda utilizar un tipo intermedio en su lugar QuizásUnidad. En cuanto a mem::zeroed, esta función puede causar problemas con tipos que no pueden aceptar valores cero.

    Para ayudar a identificar el comportamiento indefinido, la nueva versión agrega una verificación de pelusa al compilador que detecta algunos problemas con mem::uninitialized o mem::zeroed. Por ejemplo, ahora aparece un error al intentar utilizar mem::uninitialized o mem::zeroed con los tipos &T y Box`T`, que representan objetos puntero que no pueden aceptar valores nulos;

  • El atributo "#[obsoleto]" se ha ampliado para permitir que los paquetes de cajas se marquen como obsoletos y se programen para su eliminación futura. A partir de Rust 1.38, este atributo también se puede utilizar para macros;
  • Se agregó la capacidad de usar el atributo "#[global_allocator]" en los submódulos;
  • Característica añadida std::cualquiera::tipo_nombre, que le permite averiguar el nombre del tipo, lo que puede resultar útil para fines de depuración. Por ejemplo, durante la ejecución del programa puede averiguar para qué tipo se llamó la función:

    fn gen_value ‹T: Predeterminado>() -› T {
    println!("Iniciando una instancia de {}", std::any::type_name::<T›());
    Predeterminado::predeterminado()
    }

    fn principal() {
    let _: i32 = gen_value(); # "i32" se imprimirá
    let _: Cadena = gen_value(); # imprimirá "alloc::string::String"
    }

  • Funciones ampliadas de la biblioteca estándar:
    • slice::{concat, connect, join} ahora puede tomar el valor &[T] además de &T;
    • "*const T" y "*mut T" ahora implementan marcador::Despin;
    • "Arc`[T]›" y "Rc`[T]›" ahora implementan FromIterator`T`;
    • iter::{StepBy, Peekable, Take} ahora implementa DoubleEndedIterator.
    • ascii::EscapeDefault implementa Clonar y Mostrar.
  • Una nueva parte de las API se ha transferido a la categoría estable, incluidos los métodos que se han estabilizado.
    • ‹*const T›::cast, ‹*mut T›::cast,
    • Duración::as_secs_f{32|64},
    • Duración::div_duration_f{32|64},
    • Duración::div_f{32|64},
    • Duración::from_secs_f{32|64},
    • Duración::mul_f{32|64},
    • operaciones de división con resto
      div_euclid y rem_euclid para todas las primitivas enteras;

  • Se agregó soporte para especificar la opción “--features” varias veces para habilitar diferentes funciones en el administrador de paquetes de carga;
  • El compilador proporciona un tercer nivel soporte para plataformas de destino aarch64-uwp-windows-msvc, i686-uwp-windows-gnu, i686-uwp-windows-msvc, objetivos x86_64-uwp-windows-gnu, x86_64-uwp-windows-msvc, armv7-unknown-linux -gnueabi, armv7-unknown-linux-musleabi, hexagon-unknown-linux-musl y riscv32i-unknown-none-elf. El tercer nivel implica soporte básico, pero sin pruebas automatizadas ni publicación de compilaciones oficiales.

Fuente: opennet.ru

Añadir un comentario