Versão da linguagem de programação Rust 1.38

publicado liberação da linguagem de programação do sistema Ferrugem 1.38, fundado pelo projeto Mozilla. A linguagem se concentra na segurança da memória, fornece gerenciamento automático de memória e fornece um meio de alcançar alto paralelismo de tarefas sem usar um coletor de lixo ou tempo de execução.

O gerenciamento automático de memória do Rust libera o desenvolvedor da manipulação de ponteiros e protege contra problemas decorrentes da manipulação de memória de baixo nível, como acessos de memória pós-liberação, desreferências de ponteiro nulo, saturação de buffer e assim por diante. Está sendo desenvolvido um gerenciador de pacotes para distribuir bibliotecas, garantir a montagem e gerenciar dependências pelo projeto. Carga, permitindo que você obtenha as bibliotecas necessárias para o programa com um clique. Um repositório é suportado para hospedar bibliotecas caixas.io.

O principal inovações:

  • Adicionado um modo de compilação em pipeline (pipelined), no qual a construção de um pacote de crate dependente começa assim que os metadados da dependência ficam disponíveis, sem esperar que sua compilação seja concluída. Ao compilar um pacote, as dependências não precisam estar totalmente montadas, apenas definindo os metadados, que incluem listas de tipos, dependências e elementos exportados. Os metadados são disponibilizados no início do processo de compilação, portanto os pacotes vinculados agora podem ser compilados muito mais cedo. Ao construir pacotes únicos, o modo proposto não afeta o desempenho, mas se a construção cobrir pacotes com dependências ramificadas, o tempo geral de construção pode ser reduzido em 10-20%;
  • Garante a detecção do uso incorreto de funções std::mem::não inicializado и std::mem::zerado. Por exemplo, std::mem::uninitialized é conveniente para criar matrizes rapidamente, mas engana o compilador porque parece ter sido inicializado, mas na realidade o valor permanece não inicializado. A função mem::uninitialized já está marcada como obsoleta e é recomendado usar um tipo intermediário TalvezUnidade. Quanto a mem::zeroed, esta função pode causar problemas com tipos que não podem aceitar valores zero.

    Para ajudar a identificar comportamento indefinido, a nova versão adiciona uma verificação de lint ao compilador que detecta alguns problemas com mem::uninitialized ou mem::zeroed. Por exemplo, agora você recebe um erro ao tentar usar mem::uninitialized ou mem::zeroed com tipos &T e Box‹T›, que representam objetos ponteiro que não podem aceitar valores nulos;

  • O atributo “#[deprecated]” foi expandido para permitir que pacotes de caixas sejam marcados como obsoletos e agendados para exclusão futura. A partir do Rust 1.38, este atributo também pode ser usado para macros;
  • Adicionada a capacidade de usar o atributo “#[global_allocator]” em submódulos;
  • Função adicionada std::any::type_name, que permite descobrir o nome do tipo, o que pode ser útil para fins de depuração. Por exemplo, durante a execução do programa você pode descobrir para que tipo a função foi chamada:

    fn gen_value‹T: Padrão>() -› T {
    println!("Inicializando uma instância de {}", std::any::type_name::‹T›());
    Padrão::padrão()
    }

    fn principal() {
    deixe _: i32 = gen_value(); # "i32" será impresso
    deixe _: String = gen_value(); # irá imprimir "alloc::string::String"
    }

  • Funções estendidas da biblioteca padrão:
    • slice::{concat, connect, join} agora pode assumir o valor &[T] além de &T;
    • "*const T" e "*mut T" agora implementam marcador::Unpin;
    • "Arc‹[T]›" e "Rc‹[T]›" agora implementam FromIterator‹T›;
    • iter::{StepBy, Peekable, Take} agora implementa DoubleEndedIterator.
    • ascii::EscapeDefault implementa Clone e Display.
  • Uma nova parcela de APIs foi transferida para a categoria estável, incluindo métodos que foram estabilizados
    • ‹*const T›::cast, ‹*mut T›::cast,
    • Duração::as_secs_f{32|64},
    • Duração::div_duration_f{32|64},
    • Duração::div_f{32|64},
    • Duração::from_secs_f{32|64},
    • Duração::mul_f{32|64},
    • operações de divisão com resto
      div_euclid e rem_euclid para todos os primitivos inteiros;

  • Adicionado suporte para especificar a opção “--features” múltiplas vezes para habilitar diferentes recursos no gerenciador de pacotes de carga;
  • O compilador fornece um terceiro nível suporte 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-msvc alvos, armv7-unknown-linux -gnueabi, armv7-unknown-linux-musleabi, hexágono-unknown-linux-musl e riscv32i-unknown-none-elf. O terceiro nível envolve suporte básico, mas sem testes automatizados e publicação de compilações oficiais.

Fonte: opennet.ru

Adicionar um comentário