Ferrugem 1.53 lançada. O Google financiará a adição de suporte Rust ao kernel Linux

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

Adicionar um comentário