Linguaxe de programación Rust versión 1.38

publicado versión da linguaxe de programación do sistema Ferruxe 1.38, fundada polo proxecto Mozilla. A linguaxe céntrase na seguridade da memoria, ofrece xestión automática da memoria e proporciona un medio para lograr un alto paralelismo de tarefas sen utilizar un colector de lixo ou tempo de execución.

A xestión automática da memoria de Rust libera ao programador da manipulación do punteiro e protexe contra os problemas derivados da manipulación de memoria de baixo nivel, como accesos á memoria despois libres, desreferencias de punteiros nulos, desbordamentos do búfer e similares. Estase a desenvolver un xestor de paquetes para distribuír bibliotecas, garantir a montaxe e xestionar as dependencias do proxecto. Carga, o que lle permite obter as bibliotecas necesarias para o programa cun só clic. Admítese un repositorio para aloxar bibliotecas caixóns.io.

O principal innovacións:

  • Engadiuse un modo de compilación canalizado (pipelined), no que a compilación dun paquete de caixa dependente comeza en canto os metadatos da dependencia están dispoñibles, sen esperar a que finalice a súa compilación. Ao compilar un paquete, non precisa ter todas as dependencias reunidas, só precisa definir os metadatos, que inclúen listas de tipos, dependencias e elementos exportados. Os metadatos están dispoñibles no inicio do proceso de compilación, polo que agora os paquetes ligados poden compilarse moito antes. Ao construír paquetes únicos, o modo proposto non afecta o rendemento, pero se a compilación cobre paquetes con dependencias ramificadas, o tempo de compilación global pódese reducir nun 10-20 %;
  • Asegura a detección do uso incorrecto das funcións std::mem::non inicializado и std::mem::zeroed. Por exemplo, std::mem::uninitialized é conveniente para crear matrices rapidamente, pero engana ao compilador porque parece estar inicializado, pero en realidade o valor permanece sen inicializar. A función mem::non inicializada xa está marcada como obsoleta e recoméndase utilizar un tipo intermedio no seu lugar Quizais Unidade. En canto a mem::zeroed, esta función pode causar problemas con tipos que non poden aceptar valores cero.

    Para axudar a identificar o comportamento non definido, a nova versión engade unha comprobación de pelusa ao compilador que detecta algúns problemas con mem::non inicializado ou mem::zeroed. Por exemplo, agora aparece un erro ao tentar usar mem::non inicializado ou mem::zeroed cos tipos &T e Box‹T›, que representan obxectos punteiro que non poden aceptar valores nulos;

  • O atributo "#[obsoleto]" ampliouse para permitir que os paquetes de caixas se marquen como obsoletos e se programen para a súa eliminación futura. A partir de Rust 1.38, este atributo tamén se pode usar para macros;
  • Engadida a posibilidade de usar o atributo "#[global_allocator]" nos submódulos;
  • Función engadida std::calquera::nome_tipo, que permite coñecer o nome do tipo, que pode ser útil para fins de depuración. Por exemplo, durante a execución do programa podes saber para que tipo se chamou a función:

    fn valor_gen‹T: predeterminado>() -› T {
    println!("Inicializando unha instancia de {}", std::any::type_name::‹T›());
    Predeterminado::predeterminado()
    }

    fn main() {
    deixe _: i32 = valor_xen(); # "i32" imprimirase
    let _: String = valor_gen(); # imprimirá "alloc::string::String"
    }

  • Funcións ampliadas da biblioteca estándar:
    • slice::{concat, connect, join} agora pode tomar o valor &[T] ademais de &T;
    • "*const T" e "*mut T" agora implementan marker::Unpin;
    • "Arc‹[T]›" e "Rc‹[T]›" agora implementan FromIterator‹T›;
    • iter::{StepBy, Peekable, Take} agora implementa DoubleEndedIterator.
    • ascii::EscapeDefault implementa Clonación e visualización.
  • Unha nova parte das API foi transferida á categoría estable, incluídos os métodos que se estabilizaron
    • ‹*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},
    • operacións de división co resto
      div_euclid e rem_euclid para todas as primitivas enteiras;

  • Engadido soporte para especificar a opción "--features" varias veces para habilitar diferentes funcións no xestor de paquetes de carga;
  • O compilador proporciona un terceiro nivel soporte para plataformas de destino aarch64-uwp-windows-msvc, i686-uwp-windows-gnu, i686-uwp-windows-msvc, x86_64-uwp-windows-gnu, x86_64-uwp-windows-unknown, armsvux-unknown -gnueabi, armv7-unknown-linux-musleabi, hexagon-unknown-linux-musl e riscv7i-unknown-none-elf. O terceiro nivel implica soporte básico, pero sen probas automatizadas e publicación de compilacións oficiais.

Fonte: opennet.ru

Engadir un comentario