Foi publicado o lançamento da linguagem de programação do sistema Rust 1.53, 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:
- Para matrizes, foi implementada a característica IntoIterator, que permite organizar a iteração dos elementos da matriz por valores: for i in [1, 2, 3] { .. }
Também é possível passar arrays para métodos que aceitam iteradores, por exemplo: let set = BTreeSet::from_iter([1, 2, 3]); para (a, b) em some_iterator.chain([1]).zip([1, 2, 3]) { .. }
Anteriormente, o IntoIterator era implementado apenas para referências de array, ou seja, para iterar sobre valores era necessário o uso de referências (“&[1, 2, 3]”) ou “[1, 2, 3].iter()”. A implementação do IntoIterator para arrays foi prejudicada por problemas de compatibilidade causados por uma conversão anterior do compilador de array.into_iter() para (&array).into_iter(). Esses problemas foram resolvidos com uma solução alternativa - o compilador continuará a converter array.into_iter() em (&array).into_iter() como se não houvesse implementação do traço IntoIterator, mas apenas ao chamar o método usando o ".into_iter( )" e sem tocar nas chamadas no formato "in [1, 2, 3]", "iter.zip([1, 2, 3])", "IntoIterator::into_iter([1, 2, 3] )".
- É possível especificar expressões “|” (operação OR lógica) em qualquer parte do modelo, por exemplo, em vez de “Some(1) | Some(2)" agora você pode escrever "Some(1 | 2)": match result { Ok(Some(1 | 2)) => { .. } Err(MyError { kind: FileNotFound | PermissionDenied, .. }) = > { .. } _ => { .. } }
- É permitido o uso de caracteres não ASCII em identificadores, incluindo quaisquer caracteres nacionais definidos na especificação Unicode UAX 31, mas excluindo caracteres emoji. Se você usar caracteres diferentes, mas semelhantes, o compilador emitirá um aviso. const BLÅHAJ: &str = "🦈"; struct 人 { 名字: String, } deixe α = 1; letsos = 2; aviso: par de identificadores considerado confuso entre 's' e 's'
- Uma nova parcela de APIs foi transferida para a categoria estável, incluindo as seguintes estabilizadas:
- matriz::de_ref
- matriz::from_mut
- AtomicBool::fetch_update
- AtomicPtr::fetch_update
- BTreeSet::reter
- BTreeMap::reter
- BufReader::seek_relative
- cmp::min_by
- cmp::min_by_key
- cmp::max_by
- cmp::max_by_key
- DebugStruct::finish_non_exhaustive
- Duração::ZERO
- Duração::MÁX.
- Duração::é_zero
- Duração::saturating_add
- Duração::saturating_sub
- Duração::saturating_mul
- f32::é_subnormal
- f64::é_subnormal
- IntoIterator para matrizes
- {inteiro}::BITS
- io::Error::Não suportado
- Diferente de Zero*::zeros_iniciais
- Diferente de zero*::trailing_zeros
- Opção::inserir
- Pedido::is_eq
- Pedido::is_ne
- Pedido::is_lt
- Pedido::is_gt
- Pedido::is_le
- Pedido::is_ge
- OsStr::make_ascii_lowercase
- OsStr::make_ascii_uppercase
- OsStr::to_ascii_lowercase
- OsStr::to_ascii_uppercase
- OsStr::is_ascii
- OsStr::eq_ignore_ascii_case
- Espreitável::peek_mut
- Rc::increment_strong_count
- Rc::decrement_strong_count
- slice::IterMut::as_slice
- AsRef<[T]> para slice::IterMut
- impl SliceIndex para (Bound , Vinculado )
- Vec::extend_from_within
- O terceiro nível de suporte para a plataforma wasm64-unknown-unknown foi implementado. 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 gerenciador de pacotes Cargo foi movido para usar o nome "main" para o branch principal do repositório Git (HEAD) por padrão. Dependências hospedadas em repositórios que usam o nome main em vez de master não exigem mais que branch = "main" sejam configuradas.
- No compilador, os requisitos para a versão mínima do LLVM são elevados para LLVM 10.
Adicionalmente, podemos destacar a disponibilização de financiamento para o desenvolvimento de integração ao kernel Linux de ferramentas para desenvolvimento de componentes na linguagem Rust. O trabalho será realizado no âmbito do projeto Prossimo, sob os auspícios da organização ISRG (Internet Security Research Group), que é fundadora do projeto Let's Encrypt e promove o HTTPS e o desenvolvimento de tecnologias para aumentar a segurança do Internet. Os recursos serão fornecidos pelo Google, que custeará o trabalho de Miguel Ojeda, autor do projeto Rust-for-Linux. Anteriormente, o ISRG e o Google já financiaram a criação de um back-end HTTP alternativo para o utilitário curl e o desenvolvimento de um novo módulo TLS para o servidor http Apache.
Segundo a Microsoft e o Google, cerca de 70% das vulnerabilidades são causadas pelo manuseio inseguro da memória. Espera-se que o uso da linguagem Rust para desenvolver componentes do kernel, como drivers de dispositivo, reduza o risco de vulnerabilidades causadas pelo manuseio inseguro da memória e elimine erros como acessar uma região de memória após ela ter sido liberada e ultrapassar os limites do buffer.
A manipulação de memória segura é fornecida em Rust em tempo de compilação por meio de verificação de referência, acompanhando a propriedade do objeto e o tempo de vida do objeto (escopo), bem como por meio da avaliação da 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.
Fonte: opennet.ru