Foi publicado o lançamento da linguagem de programação do sistema Rust 1.57, 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, fornece gerenciamento automático de memória e fornece meios para alcançar alto paralelismo de tarefas sem usar um coletor de lixo ou tempo de execução (o tempo de execução é reduzido à inicialização básica e manutenção da biblioteca padrão).
O gerenciamento automático de memória do Rust elimina erros ao manipular ponteiros e protege contra problemas decorrentes da manipulação de memória de baixo nível, como acesso a uma região de memória após ela ter sido liberada, desreferências de ponteiro nulo, saturação de buffer, etc. Para distribuir bibliotecas, garantir a montagem e gerenciar dependências, o projeto está desenvolvendo o gerenciador de pacotes Cargo. O repositório crates.io é compatível com hospedagem de bibliotecas.
Principais inovações:
- O uso da macro “pânico!” foi estabilizado. em contextos criados durante a compilação, como declarações "const fn". Além disso, além de usar “pânico!” As declarações const permitem o uso da macro “assert!”. e algumas outras APIs de biblioteca padrão. A estabilização ainda não cobre toda a infra-estrutura de formatação, por isso, na sua forma actual, a macro “pânico!” só pode ser usado com strings estáticas (panic!(“...")) ou com um único valor interpolado "&str" ao substituir (panic!("{}", a)), que deve ser limitado à substituição de "{ }" sem especificadores de formatação e outros tipos. No futuro, a aplicabilidade de macros em contextos constantes será ampliada, mas os recursos estabilizados já são suficientes para realizar verificações de assert na fase de compilação: const _: () = assert!(std::mem::size_of:: () == 64); const _: () = afirmar!(std::mem::size_of:: () == 8);
- O gerenciador de pacotes Cargo permite a utilização de perfis com nomes arbitrários, não se limitando a “dev”, “release”, “test” e “bench”. Por exemplo, para permitir a otimização no estágio de vinculação (LTO) somente quando as montagens do produto final forem geradas, você pode criar um perfil de “produção” em Cargo.toml e adicionar o sinalizador “lto = true” a ele. Entretanto, ao definir seus próprios perfis, você deve especificar um perfil existente para herdar dele as configurações padrão. O exemplo abaixo cria um perfil de “produção” que complementa o perfil de “lançamento” incluindo o sinalizador “lto = true”. O perfil em si é ativado chamando cargo com a opção “--profile production”, e os artefatos de montagem serão colocados no diretório “target/production”. [perfil.produção] herda = "release" lto = true
- Foi estabilizado o uso de try_reserve para os tipos Vec, String, HashMap, HashSet e VecDeque, o que permite reservar espaço antecipadamente para um determinado número de elementos de um determinado tipo, a fim de reduzir a frequência das operações de alocação de memória e evitar trava durante a operação devido à falta de memória.
- É permitido especificar macros com chaves em expressões como "m!{ .. }.method()" e "m!{ .. }?".
- A execução das funções File::read_to_end e read_to_string foi otimizada.
- O suporte para a especificação Unicode foi atualizado para a versão 14.0.
- Expandido o número de funções marcadas como "#[must_use]" para emitir um aviso se o valor de retorno for ignorado, o que ajuda a identificar erros causados pela suposição de que uma função alterará os valores em vez de retornar um novo valor.
- Adicionado back-end experimental para geração de código usando libgccjit.
- 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:
- [T; N]::as_mut_slice
- [T; N]::as_slice
- coleções::TryReserveError
- HashMap::try_reserve
- HashSet::try_reserve
- String::try_reserva
- String::try_reserve_exact
- Vec::try_reserve
- Vec::try_reserve_exact
- VecDeque::try_reserve
- VecDeque::try_reserve_exact
- Iterador::map_while
- iter::MapWhile
- proc_macro::is_available
- Comando::get_program
- Comando::get_args
- Comando::get_envs
- Comando::get_current_dir
- ComandoArgs
- ComandoEnvs
- O atributo “const”, que determina se pode ser usado em qualquer contexto em vez de constantes, é usado na função hint::unreachable_unchecked.
- O terceiro nível de suporte foi implementado para armv6k-nintendo-3ds, armv7-unknown-linux-uclibceabihf, m68k-unknown-linux-gnu, aarch64-kmc-solid_asp3, armv7a-kmc-solid_asp3-eabi e armv7a-kmc- plataformas solid_asp3-eabihf. 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.
Fonte: opennet.ru