Versão Rust 1.38.0: compilação em pipeline, # [descontinuado] para macros e std :: any :: type_name

A equipe de desenvolvimento do Rust tem o prazer de anunciar o lançamento de uma nova versão, 1.38.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.38.0, basta executar o seguinte comando:


rustup update stable 

Se você ainda não instalou o rustup, poderá instalá-lo na página correspondente do nosso site.


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


O destaque desta versão é a compilação em pipeline.


Compilação de Pipeline


O compilador precisa de dependências montadas de maneira incompleta para compilar o pacote, mas apenas seus "metadados" (lista de tipos, dependências, exportações, etc.) gerados em um estágio inicial de compilação. A partir do Rust 1.38.0, o Cargo começará imediatamente a criar pacotes dependentes assim que seus metadados estiverem disponíveis.


O tempo de compilação de um pacote não diminuiu, mas nossos testes mostraram que a velocidade de compilação aumenta de 10% a 20% no caso de compilações otimizadas (onde algumas dependências já foram compiladas). Para outros pacotes, um forte aumento na velocidade de compilação não ocorreu. O tempo necessário para compilar o pacote depende do computador, portanto, o desempenho pode variar. A compilação de pipeline é ativada automaticamente a partir da versão 1.38.0.


Verificando se há algum uso indevido de mem::{uninitialized, zeroed}


Conforme anunciado anteriormente , std::mem::uninitialized não std::mem::uninitialized recomendado. Em vez disso, MaybeUninit<T> deve ser usado.


A função mem::uninitialized ainda não foi preterida, mas isso será feito em versões futuras. Mas, apesar disso, a partir de 1.38.0, o rustc verifica uma classe restrita de inicializações incorretas usando mem::uninitialized ou mem::zeroed .


Para alguns tipos, como &T e Box<T> , um valor nulo é considerado comportamento indefinido, pois são objetos semelhantes a ponteiros que não devem ser null . Será um erro usar mem::uninitialized ou mem::zeroed para inicializar esses tipos; portanto, o compilador tentará avisá-lo se alguma dessas funções for usada para inicializar os objetos acima, e não importa se eles foram inicializados diretamente ou como campos de grande estrutura. Esta verificação é recursiva, portanto, o código a seguir gera um aviso:


 struct Wrap<T>(T); struct Outer(Wrap<Wrap<Wrap<Box<i32>>>>); struct CannotBeZero { outer: Outer, foo: i32, bar: f32 } ... let bad_value: CannotBeZero = unsafe { std::mem::uninitialized() }; 

Leitores atentos podem perceber que a biblioteca padrão contém mais tipos que não devem ser preenchidos com zeros, especialmente NonNull<T> e NonZero<T> . Até o momento, a inicialização dessas estruturas com mem::uninitialized ou mem::zeroed não foi verificada.


Essas verificações não cobrem todos os casos de uso indevido de mem::uninitialized ou mem::zeroed , mas permitem detectar um código incorreto garantido que deve ser MaybeUninit para MaybeUninit .


#[deprecated] para macros


O atributo #[deprecated] , introduzido pela primeira vez no Rust 1.9.0, permite que os autores do pacote notifiquem os usuários sobre funcionalidades desatualizadas que planejam remover em versões futuras. O Rust 1.38.0 permite aplicar esse atributo às macros.


std::any::type_name


Uma representação de string do tipo usado pode ser necessária ao depurar o código. Por exemplo, no corpo de uma função genérica, convém imprimir o tipo do argumento passado. Agora isso é std::any::type_name com std::any::type_name :


 fn gen_value<T: Default>() -> T { println!("Initializing an instance of {}", std::any::type_name::<T>()); Default::default() } fn main() { let _: i32 = gen_value(); let _: String = gen_value(); } 

Resultado:


 Initializing an instance of i32 Initializing an instance of alloc::string::String 

Como todas as funções da biblioteca padrão, destinadas apenas à depuração, essa função não garante o conteúdo e o formato exatos da string. O valor de retorno é a melhor descrição do tipo; vários tipos podem ser representados pelo mesmo type_name , mas podem ser alterados em versões futuras do compilador.


Alterações na biblioteca padrão



Além disso, algumas funções foram estabilizadas:



Outras mudanças


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


Membros 1.38.0


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


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 , nlinker , funkill e Gymmasssorla .

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


All Articles