Versão da linguagem de programação Rust 1.45

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.

O principal inovações:

  • 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;

    seja x: f32 = 1.0;
    deixe y: u8 = inseguro { x.to_int_unchecked() };

    println!("too_big_casted = {}", cast(too_big)); // saída 255
    println!("too_small_casted = {}", cast(too_small)); // saída 0
    println!("not_a_number_casted = {}", cast(nan)); // saída 0
    }

  • 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.

Fonte: opennet.ru

Adicionar um comentário