Versão Rust 1.37.0: Otimização guiada por perfil, constantes sem nome e fornecedor de carga

Apresentamos a você uma tradução da publicação sobre a nova versão da amada linguagem de programação Rust .


1. Introdução


A equipe de desenvolvimento do Rust tem o prazer de anunciar o lançamento de uma nova versão, 1.37.0. Rust é uma linguagem de programação que permite a todos criar software confiável e eficiente.


Se você instalou a versão anterior do Rust usando rustup, para atualizar para a versão 1.37.0, basta executar o seguinte comando:


$ rustup update stable 

Se você ainda não instalou o rustup , pode instalá-lo na página correspondente do nosso site, bem como ver notas de versão detalhadas no GitHub.


O que está incluído na versão estável?


As principais inovações do Rust 1.37.0 incluem links para opções de enum através de aliases de tipo, um cargo vendor , constantes sem nome, constantes de otimização guiada por perfil, a chave de default-run para projetos de carga e #[repr(align(N))] para enumerações. Veja as notas de versão detalhadas para mais informações.


Links para opções de enum por meio de aliases de tipo


A partir do Rust 1.37.0, as opções de enum referências são possíveis por meio de aliases de tipo:


 type ByteOption = Option<u8>; fn increment_or_zero(x: ByteOption) -> u8 { match x { ByteOption::Some(y) => y + 1, ByteOption::None => 0, } } 

Nos blocos impl , Self atua como um alias do tipo, portanto, no Rust 1.37.0, tornou-se possível consultar as opções de enumeração usando a sintaxe Self::Variant :


 impl Coin { fn value_in_cents(&self) -> u8 { match self { Self::Penny => 1, Self::Nickel => 5, Self::Dime => 10, Self::Quarter => 25, } } } 

Mais especificamente, agora o Rust permite que você consulte as opções de enumeração via "resolução relativa ao tipo" , <MyType<..>>::Variant . Uma descrição mais detalhada está disponível no relatório de estabilização .


Suporte de carga nativa para dependências do fornecedor


Após vários anos de existência como um pacote separado , a equipe de cargo vendor agora está integrada ao Cargo. Este comando extrai todas as dependências do seu projeto no diretório vendor/ e mostra o fragmento de configuração necessário para usar o código do fornecedor durante a montagem.


cargo vendorcargo vendor usado em projetos reais: o compilador rustc usa para enviar todas as suas dependências para liberar tarballs, e projetos com repositórios mono usam-no para corrigir o código de dependência no controle de versão.


Usando constantes sem nome em macros


Agora você pode criar uma (unnamed) (const ) substituindo seu identificador por sublinhado ( _ ). Por exemplo, no compilador rustc encontramos este código:


 ///   ,    ///  ,   -  . #[macro_export] macro_rules! static_assert_size { ($ty:ty, $size:expr) => { const _: [(); $size] = [(); ::std::mem::size_of::<$ty>()]; // ^    . } } static_assert_size!(Option<Box<String>>, 8); // 1. static_assert_size!(usize, 8); // 2. 

Preste atenção ao segundo static_assert_size!(..) : graças ao uso de constantes sem nome, foi possível evitar conflitos de nome ao declarar novos elementos. Antes, você precisaria escrever static_assert_size!(MY_DUMMY_IDENTIFIER, usize, 8); . Com a introdução de constantes sem nome, torna-se mais fácil criar macros declarativas e processuais ergonômicas e reutilizáveis ​​para fins de análise estática.


Otimização guiada por perfil


A otimização guiada por perfil (PGO) agora está disponível no compilador rustc , que pode ser ativado por meio dos sinalizadores -C profile-generate e -C profile-use compilador.


A Otimização Guiada por Perfil é uma técnica de otimização de software de compilador que analisa as execuções de teste em vez do código fonte. Ele funciona compilando um programa para otimização em dois estágios:


  1. Primeiro, o programa é criado usando as ferramentas incorporadas no compilador. Isso é feito passando o sinalizador rustc -C profile-generate . Em seguida, o programa da ferramenta deve ser executado nas amostras de dados e, posteriormente, gravará os dados de criação de perfil no arquivo.
  2. O programa é rustc novamente , desta vez passando os dados de criação de perfil coletados de volta para rustc usando o sinalizador -C profile-use . Este assembly usará os dados coletados para permitir que o compilador tome melhores decisões sobre posicionamento, incorporação de código e outras otimizações.

Para obter mais informações sobre otimização guiada por perfil, consulte o capítulo correspondente no livro do compilador rustc .


Selecionando um arquivo executável em projetos Cargo


cargo run é uma ferramenta muito conveniente para testar rapidamente aplicativos de console. Quando vários arquivos executáveis ​​estão presentes em um pacote, você deve declarar explicitamente o nome do arquivo executável que deseja executar usando o sinalizador --bin . Isso faz com que a cargo run não seja tão ergonômica quanto gostaríamos, especialmente quando um executável específico é chamado com mais frequência do que outros.


O Rust 1.37.0 resolve esse problema adicionando uma nova chave de default-run ao Cargo.toml (seção [package] ). Portanto, se o sinalizador --bin não for --bin , o Cargo iniciará o arquivo binário declarado na configuração.


#[repr(align(N))] para enumerações


A partir do Rust 1.37.0, o atributo #[repr(align(N))] pode ser usado para determinar o alinhamento de enumerações na memória (anteriormente esse atributo era permitido apenas para estruturas ( struct ) e uniões ( union )). Por exemplo, uma enumeração Align16 terá, como esperado, um alinhamento de 16 bytes, enquanto o alinhamento natural sem #[repr(align(16))] será 4 :


 #[repr(align(16))] enum Align16 { Foo { foo: u32 }, Bar { bar: u32 }, } 

A semântica de usar #[repr(align(N)) para enumerações é a mesma que definir um wrapper para uma estrutura AlignN<T> com esse alinhamento e, em seguida, usar AlignN<MyEnum> :


 #[repr(align(N))] struct AlignN<T>(T); 

Alterações na biblioteca padrão


O Rust 1.37.0 estabilizou os seguintes componentes da biblioteca padrão:



Outras mudanças


A sintaxe , o gerenciador de pacotes de carga e o analisador Clippy também sofreram algumas alterações.


Membros 1.37.0


Muitas pessoas se uniram para criar o Rust 1.37.0. Não poderíamos ter feito isso sem todos vocês, obrigado!


Novos patrocinadores de infraestrutura de ferrugem


Gostaríamos de agradecer aos dois novos patrocinadores da infraestrutura Rust que forneceram os recursos necessários para criar o Rust 1.37.0: Amazon Web Services (AWS) e Microsoft Azure:


  • A AWS forneceu hospedagem para artefatos de liberação (compiladores, bibliotecas, ferramentas e código fonte), concedeu acesso a esses artefatos aos usuários por meio do CloudFront, impediu regressões EC2 da Crater e gerenciou outra infraestrutura relacionada à Rust hospedada na AWS.
  • Para testes extremamente exigentes do repositório rust-lang / rust, o Microsoft Azure forneceu construtores.

De tradutores


Em caso de dúvidas sobre o idioma Rust, eles poderão ajudá-lo no bate-papo do telegrama no idioma russo ou em um bate-papo semelhante para os recém-chegados .


Este artigo foi traduzido em conjunto por andreevlex , ozkriff , funkill e Gymmasssorla .

Source: https://habr.com/ru/post/pt463823/


All Articles