Lanzamiento del lenguaje de programación Rust 1.45

publicado versión 1.45 del lenguaje de programación del sistema Herrumbre, 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 herramientas para lograr un alto paralelismo de tareas sin utilizar un recolector de basura y tiempo de ejecución.

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. 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:

  • Eliminado desde hace mucho tiempo imperfección al realizar conversiones entre números enteros y números de coma flotante. Dado que el compilador Rust usa LLVM como backend, las operaciones de conversión de tipos se realizaron a través de instrucciones de código intermedio LLVM como fptoui, que tienen una característica importante: comportamiento indefinido si el valor resultante no se ajusta al tipo de destino. Por ejemplo, al convertir el valor flotante 300 con tipo f32 a tipo entero u8, el resultado es impredecible y puede variar en diferentes sistemas. El problema es que esta característica aparece en código que no está marcado como "inseguro".

    A partir de Rust 1.45, el comportamiento del desbordamiento del tamaño del tipo de letra está estrictamente regulado y el operador de conversión "as" verifica el desbordamiento y fuerza el valor que se convierte al valor máximo o mínimo del tipo de destino (para el ejemplo anterior, un valor de 300 se convertiría en 255). Para deshabilitar dichas comprobaciones, se proporcionan llamadas API adicionales "{f64, f32}::to_int_unchecked", que funcionan en modo no seguro.

    fn emitir(x: f32) -> u8 {
    x como u8
    }

    fn principal() {
    let too_big = 300.0;
    let too_small = -100.0;
    sea ​​nan = f32::NAN;

    sea ​​x: f32 = 1.0;
    let y: u8 = inseguro { x.to_int_unchecked() };

    println!("demasiado_grande_casted = {}", emitir(demasiado_grande)); // salida 255
    println!("demasiado_pequeño_casted = {}", cast(demasiado_pequeño)); // salida 0
    println!("not_a_number_casted = {}", cast(nan)); // salida 0
    }

  • Uso estabilizado macros procesalesexpresiones, plantillas y declaraciones similares a funciones. Anteriormente, estas macros no se podían llamar en todas partes, sino solo en ciertas partes del código (como una llamada separada, no entrelazada con otro código). Ampliar la forma en que se pueden llamar las macros, similar a las funciones, fue uno de los requisitos para que el marco web funcionara. Rocket en versiones estables de Rust. Anteriormente, lograr flexibilidad adicional en la definición de controladores en Rocket requería habilitar la función experimental "proc_macro_hygiene", que no está disponible en versiones estables de Rust. Esta funcionalidad ahora está integrada en versiones estables del idioma.
  • Se permite usar rangos con tipo “char” para iterar sobre valores de rango (ops::{Range, RangeFrom, RangeFull, RangeInclusive, RangeTo}):

    para ch en 'a'..='z' {
    imprimir!("{}", cap);
    }
    imprimir!(); // Imprimirá "abcdefghijklmnopqrstuvwxyz"

  • Una nueva porción de API se ha transferido a la categoría estable, incluida la estabilizada
    Arco::as_ptr,
    BTreeMap::remove_entry,
    Rc::as_ptr,
    rc::Débil::as_ptr,
    rc::Débil::from_raw,
    rc::Débil::into_raw,
    str::strip_prefix,
    str::strip_suffix,
    sincronización::Débil::as_ptr,
    sincronización::Débil::from_raw,
    sincronización::Débil::into_raw,
    char::UNICODE_VERSION,
    Span::resolved_at,
    Span::ubicado_en,
    Span::sitio_mixto,
    unix::proceso::CommandExt::arg0.

  • El compilador Rustc ha agregado soporte para anular varias características de la plataforma de destino usando el indicador "target-feature", por ejemplo, "-C target-feature=+avx2,+fma". También se han agregado nuevas banderas:
    "force-unwind-tables" para generar tablas de llamadas de desenrollado, independientemente de la estrategia de manejo de fallas; "embed-bitcode" para controlar si el código de bits LLVM se incluye en las rlibs generadas. El indicador "embed-bitcode" está habilitado de forma predeterminada en Cargo para optimizar el tiempo de compilación y el consumo de espacio en disco.

  • Se ha proporcionado un tercer nivel de soporte para las plataformas mipsel-sony-psp y thumbv7a-uwp-windows-msvc. El tercer nivel implica soporte básico, pero sin pruebas automatizadas ni publicación de compilaciones oficiales.

Adicionalmente, se puede señalar la historia sobre crear lo más simple приложения en el lenguaje Rust, comenzando a usar el gestor de arranque del sistema y listo para la carga autónoma en lugar del sistema operativo.
El artículo es el primero de una serie dedicada a demostrar técnicas muy demandadas en programación de bajo nivel y desarrollo de sistemas operativos.

Fuente: opennet.ru

Añadir un comentario