Foi lançado o Rust 1.79, uma linguagem de programação de propósito geral, originada do projeto Mozilla, mas agora desenvolvida sob a tutela da organização independente sem fins lucrativos Rust Foundation. A linguagem foca na segurança da memória e fornece recursos para alcançar alto paralelismo na execução de tarefas, eliminando a necessidade de um coletor de lixo e de um tempo de execução (runtime), que se limita à inicialização básica e ao suporte da biblioteca padrão.
Os métodos de manipulação de memória em Rust protegem o desenvolvedor de erros ao trabalhar com ponteiros e evitam problemas decorrentes de manipulação de memória de baixo nível, como acesso a áreas de memória após sua liberação, desreferenciação de ponteiros nulos, e estouro de buffer, entre outros. Para distribuição de bibliotecas, construção e gerenciamento de dependências, o projeto conta com o gerenciador de pacotes Cargo. O repositório crates.io é suportado para hospedagem de bibliotecas.
A manipulação segura da memória em Rust é garantida em tempo de compilação através da verificação de referências, rastreamento de propriedade de objetos, controle do tempo de vida dos objetos (escopos) e avaliação da correção do acesso à memória durante a execução do código. Rust também oferece mecanismos para proteção contra estouros inteiros, exige a inicialização obrigatória de valores de variáveis antes do uso, trata erros de forma superior na biblioteca padrão, aplica o conceito de referências e variáveis imutáveis (immutable) por padrão e oferece uma forte tipagem estática para minimizar erros lógicos.
Principais novidades:
- Foi adicionada a suporte a constantes inline, que podem ser especificadas diretamente no código usando blocos «const { … }», processados no contexto de constantes e permitindo evitar a definição separada de constantes. O código dentro do bloco «const { … }» é calculado durante a compilação e usado como uma constante, sem execução durante a execução do programa. Ao contrário da definição de constantes através da expressão «const ITEM: … = …», em blocos «const { … }», o tipo não precisa ser especificado, pois há suporte para a dedução automática do tipo. Por exemplo, o código com uma definição separada de constante
const EMPTY: Option<Vec> = None;
let foo = [EMPTY; 100];pode ser substituído pelo uso in-situ:
let foo = [const { None }; 100];
- Foi estabilizada a sintaxe «T: Trait» para definir restrições em posições de tipo associado, permitindo encurtar a definição de expressões com restrições aninhadas que antes requeriam a especificação de uma implementação aninhada de Trait ou várias cláusulas «where».
- Foi garantido o prolongamento automático do tempo de vida de valores temporários que são usados em construções «match» e «if».
let a = if true {
..;
&temp() // o tempo de vida será prolongado
} else {
..;
&temp() // o tempo de vida será prolongado
}; - Foi estabilizada a capacidade de importar a função main de outros módulos e pacotes crate.
- Durante a construção da biblioteca padrão no compilador, foi utilizado o sinalizador «-Cforce-frame-pointers=yes», que adiciona dados para a reconstrução da pilha durante a profilação de programas.
- Uma nova leva de APIs foi traduzida para a categoria estável, incluindo estabilizações de métodos e implementações de traits:
- {integer}::unchecked_add
- {integer}::unchecked_mul
- {integer}::unchecked_sub
- ::split_at_unchecked
- ::split_at_mut_unchecked
- ::utf8_chunks
- str::Utf8Chunks
- str::Utf8Chunk
- ::is_aligned
- ::is_aligned
- NonNull::is_aligned
- ::len
- ::len
- ::is_empty
- ::is_empty
- NonNull::::is_empty
- CStr::count_bytes
- io::Error::downcast
- num::NonZero
- path::absolute
- proc_macro::Literal::byte_character
- proc_macro::Literal::c_string
- O sinal "const", que determina a possibilidade de uso em qualquer contexto em vez de constantes, é aplicado em funções:
- Atomic*::into_inner
- io::Cursor::new
- io::Cursor::get_ref
- io::Cursor::position
- io::empty
- io::repeat
- io::sink
- panic::Location::caller
- panic::Location::file
- panic::Location::line
- panic::Location::column
- Estabilizado
parte das funcionalidades que podem ser utilizadas ao compilar para a representação intermediária Webassembly (WASM). - Implementado o terceiro nível de suporte para as plataformas aarch64-apple-visionos, aarch64-apple-visionos-sim e riscv32ima-unknown-none-elf. O terceiro nível implica suporte básico, mas sem testes automatizados, publicação de builds oficiais e verificação da possibilidade de compilação de código.
- Implementado o segundo nível de suporte para as plataformas alvo aarch64-pc-windows-gnullvm, i686-pc-windows-gnullvm e x86_64-pc-windows-gnullvm. O segundo nível de suporte implica a garantia de compilação.
Além disso, a organização Rust Foundation, que supervisiona o ecossistema relacionado à linguagem Rust, anunciou a criação do consórcio "Safety-Critical Rust Consortium", voltado para o uso da linguagem Rust em soluções que exigem alta confiabilidade (Software Crítico para a Segurança), cuja falha pode ameaçar vidas, causar danos ao meio ambiente ou resultar em sérios danos a equipamentos. O consórcio conta com a participação das empresas ARM, AdaCore, Ferrous Systems, OxidOS, Synopsys, HighTec EDV-Systeme GmbH, TrustInSoft, Veecle e Woven by Toyota. As tarefas a serem realizadas pelo consórcio incluem a redação de diretrizes e o desenvolvimento de bibliotecas, linters e analisadores estáticos, bem como a aplicação de métodos de verificação formal de confiabilidade e o desenvolvimento de subconjuntos da linguagem para sistemas de alta confiabilidade.
Dos projetos relacionados a sistemas de alta confiabilidade, destaca-se o Verus — uma ferramenta para verificar a correção de código escrito em Rust. A verificação é realizada por meio da definição de uma especificação que descreve o comportamento aceitável do código. Durante a execução do código, o Verus verifica a conformidade com a especificação para confirmar a correção do funcionamento.
Fonte: opennet.ru
