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

publicado liberação da linguagem de programação do sistema Ferrugem 1.40, fundado pelo projeto Mozilla. A linguagem se concentra na segurança da memória, fornece gerenciamento automático de memória e fornece ferramentas para alcançar alto paralelismo de tarefas sem usar um coletor de lixo e 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:

  • Adicionada a capacidade de marcar estruturas (struct) e enumerações (enum com bloco Variant) usando o atributo "#[não_exaustivo]", qual permite no futuro, adicione novos campos e opções às estruturas e enumerações declaradas. Por exemplo, desenvolvedores de módulos que possuem estruturas com campos declarados publicamente podem usar "#[non_exhaustive]" para marcar estruturas que podem ter novos campos adicionados no futuro. Até agora, nesta situação, o desenvolvedor era forçado a escolher entre declarar campos de forma privada e vincular-se a uma lista imutável de campos. O novo atributo remove essa limitação e permite adicionar novos campos no futuro sem o risco de quebrar o código externo compilado anteriormente. Nos pacotes crate, ao combinar opções na seção “match”, é necessária uma definição explícita da máscara “_ => {...}”, cobrindo possíveis campos futuros, caso contrário um erro será exibido ao adicionar novos campos.
  • Adicionado por a capacidade de chamar a macro processual mac!() em um contexto de tipo. Por exemplo, agora você pode escrever “type Foo = expand_to_type!(bar);” se “expand_to_type” for uma macro processual.
  • Em blocos "extern {...}" adicionado a capacidade de usar macros procedurais e de atributos, incluindo macros “bang!()”, por exemplo:

    regras_macro! make_item { ($nome:ident) => { fn $nome(); } }

    externo {
    make_item!(alfa);
    make_item!(beta);
    }

    externo "C" {
    #[minha_identidade_macro] fn foo();
    }

  • Em macros implementado capacidade de gerar elementos “macro_rules!”. Gerando "macro_rules!" possível tanto em macros tipo função (“mac!()”) quanto em macros na forma de atributos (“#[mac]”).
  • No elemento de mapeamento $m:meta adicionado suporte para valores arbitrários de enumeração de token (“[TOKEN_STREAM]”, “{TOKEN_STREAM}” e “(TOKEN_STREAM)”), por exemplo:

    regras_macro! aceitar_meta { ($m:meta) => {} }
    aceitar_meta!( meu::caminho );
    aceitar_meta!( meu::caminho = "aceso" );
    aceitar_meta!( meu::caminho (abc));
    aceitar_meta!( meu::caminho [abc]);
    aceitar_meta!( meu::caminho { abc } );

  • No modo Rust 2015, a saída de erro é habilitada para problemas identificados ao verificar o empréstimo de variáveis ​​​​(verificador de empréstimo) usando a técnica NLL (Non-Lexical Lifetimes). Anteriormente, os avisos eram substituídos por erros durante a execução no modo Rust 2018.
    Depois que a mudança foi estendida para o modo Rust 2015, os desenvolvedores puderam finalmente livrar-se de do antigo verificador de empréstimos.

    Recorde-se que o sistema de verificação baseado num novo mecanismo de contabilização do tempo de vida das variáveis ​​emprestadas permitiu identificar alguns problemas que passaram despercebidos ao antigo código de verificação. Como a saída de erros para tais verificações poderia afetar a compatibilidade com o código em funcionamento anteriormente, avisos foram emitidos inicialmente em vez de erros.

  • O atributo “const”, que determina a possibilidade de utilizá-lo em qualquer contexto ao invés de constantes, é utilizado para a função is_power_of_two (para inteiros sem sinal).
  • Uma nova parte da API foi movida para a categoria estável, incluindo a macro todo!() e os métodos slice::repeat, mem::take, BTreeMap::get_key_value, HashMap::get_key_value, foram estabilizados.
    Opção::as_deref, Opção::as_deref_mut, Opção::flatten, UdpSocket::peer_addr, {f32,f64}::to_be_bytes, {f32,f64}::to_le_bytes,{f32,f64}::to_ne_bytes, {f32, f64}::from_be_bytes, {f32,f64}::from_le_bytes e {f32,f64}::from_ne_bytes.

  • No gerenciador de pacotes cargo
    implementado armazenando avisos do compilador em cache no disco. Adicionada a opção "metadados de carga" ao comando "metadados de carga"--filter-plataforma" para mostrar apenas pacotes vinculados à plataforma de destino especificada na coluna de resolução de dependência. Adicionada opção de configuração http.ssl-version para definir versões TLS válidas.
    Adicionada a capacidade de publicar a seção "dependências de desenvolvimento" sem especificar a chave "versão".

  • O compilador Rustc fornece suporte de terceiro nível para plataformas de destino Thumbv7neon-unknown-linux-musleabihf, aarch64-unknown-none-softfloat, mips64-unknown-linux-muslabi64 e mips64el-unknown-linux-muslabi64. 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