Lançamento da linguagem de programação Rust 1.75 e unikernel Hermit 0.6.7

Foi publicado o lançamento da linguagem de programação de uso geral Rust 1.75, 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:

  • Adicionada a capacidade de usar “async fn” e a notação “-> impl Trait” em características privadas. Por exemplo, usando “->impl Trait” você pode escrever um método trait que retorna um iterador: trait Container { fn items(&self) -> impl Iterator; } impl Contêiner para MyContainer { fn items(&self) -> impl Iterator { self.items.iter().cloned() } }

    Você também pode criar características usando "async fn": trait HttpService { async fn fetch(&self, url: Url) -> HtmlBody; // será expandido para: // fn fetch(&self, url: Url) -> impl Future; }

  • Adicionada API para calcular deslocamentos de bytes em relação a ponteiros. Ao trabalhar com ponteiros simples (“*const T” e “*mut T”), podem ser necessárias operações para adicionar um deslocamento ao ponteiro. Anteriormente, para isso era possível utilizar uma construção do tipo “::add(1)”, somando o número de bytes correspondente ao tamanho de “size_of::()”. A nova API simplifica esta operação e torna possível manipular deslocamentos de bytes sem primeiro converter os tipos para "*const u8" ou "*mut u8".
    • ponteiro::byte_add
    • ponteiro::byte_offset
    • ponteiro::byte_offset_from
    • ponteiro::byte_sub
    • ponteiro::wrapping_byte_add
    • ponteiro::wrapping_byte_offset
    • ponteiro::wrapping_byte_sub
  • Trabalho contínuo para aumentar o desempenho do compilador Rustc. Adicionado o otimizador BOLT, que é executado no estágio pós-link e usa informações de um perfil de execução pré-preparado. O uso do BOLT permite acelerar a execução do compilador em cerca de 2%, alterando o layout do código da biblioteca librustc_driver.so para um uso mais eficiente do cache do processador.

    Incluída a construção do compilador Rustc com a opção "-Ccodegen-units=1" para melhorar a qualidade da otimização no LLVM. Os testes realizados mostram um aumento de desempenho no caso da compilação “-Ccodegen-units=1” em aproximadamente 1.5%. As otimizações adicionadas são habilitadas por padrão apenas para a plataforma x86_64-unknown-linux-gnu.

    As otimizações mencionadas anteriormente foram testadas pelo Google para reduzir o tempo de construção dos componentes da plataforma Android escritos em Rust. Usar “-C codegen-units=1” ao construir o Android nos permitiu reduzir o tamanho do kit de ferramentas em 5.5% e aumentar seu desempenho em 1.8%, enquanto o tempo de construção do próprio kit de ferramentas quase dobrou.

    A ativação da coleta de lixo em tempo de link (“--gc-sections”) aumentou o ganho de desempenho em até 1.9%, permitindo otimização em tempo de link (LTO) em até 7.7% e otimizações baseadas em perfil (PGO) em até 19.8%. No final, foram aplicadas otimizações utilizando o utilitário BOLT, que permitiu aumentar a velocidade de construção para 24.7%, mas o tamanho do kit de ferramentas aumentou 10.9%.

    Lançamento da linguagem de programação Rust 1.75 e unikernel Hermit 0.6.7

  • 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:
    • Atômico*::from_ptr
    • ArquivoTimes
    • ArquivoTimesExt
    • Arquivo::set_modified
    • Arquivo::set_times
    • IpAddr::to_canonical
    • Ipv6Addr::to_canonical
    • Opção::as_slice
    • Opção::as_mut_slice
    • ponteiro::byte_add
    • ponteiro::byte_offset
    • ponteiro::byte_offset_from
    • ponteiro::byte_sub
    • ponteiro::wrapping_byte_add
    • ponteiro::wrapping_byte_offset
    • ponteiro::wrapping_byte_sub
  • O atributo "const", que determina a possibilidade de utilizá-lo em qualquer contexto ao invés de constantes, é utilizado em funções:
    • Ipv6Addr::to_ipv4_mapped
    • TalvezUninit::assume_init_read
    • MaybeUninit::zerado
    • mem::discriminante
    • mem::zerado
  • O terceiro nível de suporte foi implementado para as plataformas csky-unknown-linux-gnuabiv2hf, i586-unknown-netbsd e mipsel-unknown-netbsd. 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.

Além disso, podemos notar uma nova versão do projeto Hermit, que desenvolve um kernel especializado (unikernel), escrito na linguagem Rust, fornecendo ferramentas para a construção de aplicações independentes que podem ser executadas em cima de um hipervisor ou hardware simples, sem camadas adicionais. e sem sistema operacional. Quando construído, o aplicativo é vinculado estaticamente a uma biblioteca, que implementa de forma independente todas as funcionalidades necessárias, sem estar vinculado ao kernel do sistema operacional e às bibliotecas do sistema. O código do projeto é distribuído sob licenças Apache 2.0 e MIT. Assembly é compatível com execução autônoma de aplicativos escritos em Rust, Go, Fortran, C e C++. O projeto também está desenvolvendo seu próprio bootloader que permite iniciar o Hermit usando QEMU e KVM.

Fonte: opennet.ru

Adicionar um comentário