publicado versão 1.45 da linguagem de programação do sistema Ferrugem, fundado pelo projeto Mozilla. A linguagem se concentra na segurança da memória, fornece gerenciamento automático de memória e fornece ferramentas para alcançar alto paralelismo de tarefas sem usar um coletor de lixo e tempo de execuçã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. Está sendo desenvolvido um gerenciador de pacotes para distribuir bibliotecas, garantir a montagem e gerenciar dependências pelo projeto. Carga, permitindo que você obtenha as bibliotecas necessárias para o programa com um clique. Um repositório é suportado para hospedar bibliotecas caixas.io.
Eliminado de longa data falha ao realizar conversões entre inteiros e números de ponto flutuante. Como o compilador Rust usa LLVM como back-end, as operações de conversão de tipo foram realizadas por meio de instruções de código intermediário LLVM, como fptoui, que possuem um recurso significativo - comportamento indefinido se o valor resultante não couber no tipo de destino. Por exemplo, ao converter o valor flutuante 300 com o tipo f32 para o tipo inteiro u8, o resultado é imprevisível e pode variar em diferentes sistemas. O problema é que esse recurso aparece em códigos que não estão marcados como “inseguros”.
A partir do Rust 1.45, o comportamento do overflow do tamanho do tipo é estritamente regulado, e a operação de conversão "as" verifica se há overflow e força o valor a ser convertido para o valor máximo ou mínimo do tipo de destino (para o exemplo acima, um valor de 300 seriam convertidos em 255). Para desabilitar tais verificações, são fornecidas chamadas de API adicionais “{f64, f32}::to_int_unchecked”, operando em modo inseguro.
fncast (x: f32) -> u8 {
x como u8
}
fn principal() {
deixe too_big = 300.0;
deixe too_small = -100.0;
seja nan = f32::NAN;
Usar estabilizado macros processuaisexpressões, modelos e instruções semelhantes a funções. Anteriormente, essas macros não podiam ser chamadas em todos os lugares, mas apenas em certas partes do código (como uma chamada separada, não entrelaçada com outro código). Expandir a forma como as macros podem ser chamadas, semelhante às funções, foi um dos requisitos para fazer o framework web funcionar Foguete em versões estáveis do Rust. Anteriormente, para obter flexibilidade adicional na definição de manipuladores no Rocket, era necessário habilitar um recurso experimental chamado “proc_macro_hygiene”, que não está disponível em versões estáveis do Rust. Esta funcionalidade agora está incorporada em versões estáveis da linguagem.
Permitido usar intervalos com tipo “char” para iterar sobre valores de intervalo (ops::{Range, RangeFrom, RangeFull, RangeInclusive, RangeTo}):
para ch em 'a'..='z' {
imprimir!("{}",ch);
}
imprimir!(); // Irá imprimir "abcdefghijklmnopqrstuvwxyz"
Uma nova parcela de APIs foi transferida para a categoria estável, incluindo estabilizadas
Arco::as_ptr,
BTreeMap::remove_entry,
Rc::as_ptr,
rc::Fraco::as_ptr,
rc::Fraco::from_raw,
rc::Fraco::into_raw,
str::strip_prefix,
str::strip_suffix,
sincronização::Fraco::as_ptr,
sincronizar::Fraco::from_raw,
sincronizar::Fraco::into_raw,
char::UNICODE_VERSION,
Span::resolvido_at,
Span::localizado_em,
Span::site_misto,
unix::process::CommandExt::arg0.
O compilador Rustc adicionou suporte para substituir vários recursos da plataforma de destino usando o sinalizador "target-feature", por exemplo, "-C target-feature=+avx2,+fma". Novas bandeiras também foram adicionadas:
"force-unwind-tables" para gerar tabelas de chamadas de desenrolamento, independentemente da estratégia de tratamento de falhas; "embed-bitcode" para controlar se o bitcode LLVM está incluído nas rlibs geradas. O sinalizador "embed-bitcode" é habilitado por padrão no Cargo para otimizar o tempo de construção e o consumo de espaço em disco.
Um terceiro nível de suporte foi fornecido para as plataformas mipsel-sony-psp e thumbv7a-uwp-windows-msvc. O terceiro nível envolve suporte básico, mas sem testes automatizados e publicação de compilações oficiais.
Além disso, pode-se notar a história sobre como criar o mais simples Aplicativos na linguagem Rust, começando a usar o bootloader do sistema e pronto para carregamento independente em vez do sistema operacional.
O artigo é o primeiro de uma série dedicada a demonstrar técnicas exigidas na programação de baixo nível e no desenvolvimento de sistemas operacionais.