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

Foi publicado o lançamento da linguagem de programação de uso geral Rust 1.73, fundada pelo projeto Mozilla, mas agora desenvolvida sob os auspícios da organização independente sem fins lucrativos Rust Foundation. A linguagem se concentra na segurança da memória e fornece os meios para obter alto paralelismo de trabalho, evitando o uso de um coletor de lixo e tempo de execução (o tempo de execução é reduzido à inicialização básica e manutenção da biblioteca padrão).

Os métodos de manipulação de memória do Rust salvam o desenvolvedor de erros ao manipular ponteiros e protegem contra problemas que surgem devido ao manuseio de memória de baixo nível, como acessar uma área de memória após ter sido liberada, desreferenciar ponteiros nulos, saturação de buffer, etc. Para distribuir bibliotecas, prover builds e gerenciar dependências, o projeto desenvolve o gerenciador de pacotes Cargo. O repositório crates.io é compatível com hospedagem de bibliotecas.

A segurança da memória é fornecida no Rust em tempo de compilação por meio de verificação de referência, acompanhando a propriedade do objeto, acompanhando o tempo de vida do objeto (escopos) e avaliando a exatidão do acesso à memória durante a execução do código. Rust também fornece proteção contra estouros de número inteiro, requer inicialização obrigatória de valores de variáveis ​​antes do uso, lida melhor com erros na biblioteca padrão, aplica o conceito de referências e variáveis ​​imutáveis ​​por padrão, oferece tipagem estática forte para minimizar erros lógicos.

Principais inovações:

  • O formato das mensagens emitidas pelo manipulador de falhas do programa padrão (pânico) foi redesenhado. O texto especificado na macro "pânico!" agora é mostrado em uma linha separada sem aspas, facilitando a leitura da mensagem e eliminando confusão quando aspas aninhadas estão presentes ou divididas em várias linhas. fn main() { deixe arquivo = "ferris.txt"; pânico!("ah, não! {arquivo:?} não encontrado!"); } Houve um tópico 'main' em pânico com 'oh não! "ferris.txt" não encontrado!', src/main.rs:3:5 Tópico 'main' entrou em pânico em src/main.rs:3:5: ah, não! "ferris.txt" não encontrado!

    A saída das mensagens mostradas quando as macros “assert_eq” e “assert_ne” são acionadas também foi reformulada. fn main() { assert_eq!("🦀", "🐟", "ferris não é um peixe"); } O thread 'main' entrou em pânico com 'asserção falhou: `(esquerda == direita)` esquerda: `"🦀"`, direita: `"🐟"`: ferris não é um peixe', src/main.rs: 2:5 O tópico 'main' entrou em pânico em src/main.rs:2:5: a afirmação `left == right` falhou: ferris não é um peixe left: “🦀” right: “🐟”

  • De acordo com RFC 3184, foi adicionada a capacidade de manipular diretamente chaves de armazenamento LocalKey de thread local (thread_local). > e LocalKey > através do uso dos métodos get(), set(), take() e replace(), em vez de usar um fechamento "with(|inner| ...)", o que elimina a necessidade de executar código de inicialização adicional para o valores padrão especificados para novos threads ao usar a macro “thread_local!” thread_local! { COISAS estáticas: célula > = Célula::new(Vec::new()); } fn f() { // era THINGS.with(|i| i.set(vec![32, 1, 2])); // tornou-se THINGS.set(vec![3, 1, 2]); // ... // foi deixado v = THINGS.with(|i| i.take()); // tornou-se let v: Vec = COISAS.take(); }
  • Uma nova parte da API foi movida para a categoria de estável, incluindo os métodos e implementações de características que foram estabilizadas:
    • Não assinado {inteiro}::div_ceil
    • {inteiro} não assinado::next_multiple_of
    • {inteiro} não assinado::checked_next_multiple_of
    • std::ffi::FromBytesUntilNulError
    • std::os::unix::fs::chown
    • std::os::unix::fs::fchown
    • std::os::unix::fs::lfchown
    • Chave Local:: >::obter
    • Chave Local:: >::definir
    • Chave Local:: >::pegar
    • Chave Local:: >::substituir
    • Chave Local:: >::com_emprestado
    • Chave Local:: >::with_borrow_mut
    • Chave Local:: >::definir
    • Chave Local:: >::pegar
    • Chave Local:: >::substituir
  • O atributo "const", que determina a possibilidade de utilizá-lo em qualquer contexto ao invés de constantes, é utilizado em funções:
    • rc::Fraco::novo
    • sincronização::Fraco::novo
    • NãoNulo::as_ref
  • O compilador fornece gravação de informações de versão na seção “.comment”, semelhante ao GCC e Clang.
  • O terceiro nível de suporte foi implementado para as plataformas aarch64-unknown-teeos, csky-unknown-linux-gnuabiv2, riscv64-linux-android, riscv64gc-unknown-hermit, x86_64-unikraft-linux-musl e x86_64-unknown-linux -ohos. O terceiro nível envolve suporte básico, mas sem testes automatizados, publicação de compilações oficiais ou verificação se o código pode ser compilado.
  • O segundo nível de suporte para a plataforma de destino wasm32-wasi-preview1-threads foi implementado. O segundo nível de apoio envolve uma garantia de montagem.

Fonte: opennet.ru

Adicionar um comentário