Linguaxe de programación Rust versión 1.34

Lanzouse a linguaxe de programación do sistema Rust 1.34, desenvolvida polo proxecto Mozilla. A linguaxe céntrase na seguridade da memoria, ofrece xestión automática da memoria e proporciona un medio para lograr un alto paralelismo de tarefas sen utilizar un colector de lixo ou tempo de execución.

A xestión automática da memoria de Rust libera ao programador da manipulación do punteiro e protexe contra os problemas derivados da manipulación de memoria de baixo nivel, como accesos á memoria despois libres, desreferencias de punteiros nulos, desbordamentos do búfer e similares. Para distribuír bibliotecas, garantir a montaxe e xestionar dependencias, o proxecto está a desenvolver o xestor de paquetes Cargo, que permite obter as bibliotecas necesarias para o programa cun só clic. O repositorio crates.io é compatible para hospedar bibliotecas.

Principais novidades:

  • O xestor de paquetes Cargo engadiu ferramentas para traballar con rexistros de paquetes alternativos que poden coexistir co rexistro público crates.io. Por exemplo, os desenvolvedores de aplicacións privativas agora poden usar o seu propio rexistro privado, que se pode usar ao enumerar dependencias en Cargo.toml, e aplicar un modelo de versións semellante ao crates.io para os seus produtos, así como referir dependencias a ambos os caixóns. io e ao teu propio rexistro.

    Para engadir un rexistro externo a ~/.cargo/config
    ofrécese unha nova opción "o meu rexistro" na sección "[rexistros]" e engadiuse unha opción "outra caixa" para mencionar o rexistro externo nas dependencias de Cargo.toml na sección "[dependencias]". Para conectarse a un rexistro adicional, simplemente coloque o token de autenticación no ficheiro ~/.cargo/credentials e execute o comando
    "cargo login --registry=my-registry" e para publicar un paquete -
    "cargo publish -registry=meu-rexistro";

  • Engadiuse compatibilidade total para usar o operador “?”. en doctests, que permiten utilizar código de exemplo da documentación como probas. Operador anteriormente
    "?" podería usarse para xestionar erros durante a execución da proba só na presenza da función "fn main()" ou nas funcións "#[test]";

  • Nos atributos personalizados definidos mediante macros de procedemento, é posible utilizar conxuntos arbitrarios de fichas (“#[attr($tokens)]”, “#[attr[$tokens]] e #[attr{$tokens}]”). Anteriormente, os elementos só se podían especificar nunha árbore/forma recursiva usando literais de cadea, por exemplo “#[foo(bar, baz(quux, foo = “bar”)]”, pero agora é posible usar enumeracións (' #[rango(0. .10)]') e construcións como “#[bound(T: MyTrait)]”;
  • Os trazos TryFrom e TryInto estabilizáronse, permitindo conversións de tipos con tratamento de erros. Por exemplo, métodos como from_be_bytes con tipos enteiros usan matrices como entrada, pero os datos adoitan presentarse nun tipo Slice, e a conversión entre matrices e sectores é problemático de facer manualmente. Coa axuda de novos trazos, a operación especificada pódese realizar sobre a marcha mediante unha chamada a .try_into(), por exemplo, "let num = u32::from_be_bytes(slice.try_into()?)". Para as conversións que sempre teñen éxito (por exemplo, do tipo u8 ao u32), engadiuse un tipo de erro infalible para permitir o uso transparente de
    TryFrom para todas as implementacións existentes de "From";

  • Obsoleta a función CommandExt::before_exec, que permitía a execución dun controlador antes de exec que se executou no contexto dun proceso fillo bifurcado despois da chamada fork(). En tales condicións, algúns recursos do proceso principal, como os descritores de ficheiros e as áreas de memoria mapeadas, poderían duplicarse, o que podería provocar un comportamento indefinido e un funcionamento incorrecto das bibliotecas.
    En lugar de before_exec, recoméndase usar a función non segura CommandExt::pre_exec.

  • Tipos de enteiros atómicos estabilizados con signo e sen signo de tamaños comprendidos entre 8 e 64 bits (por exemplo, AtomicU8), así como os tipos con signo NonZeroI[8|16|32|54|128].
  • Moveuse unha nova parte da API á categoría estable, incluíndo Any::type_id, Error::type_id, slice::sort_by_cached_key, str::escape_*, str::split_ascii_whitespace, Instant::checked_[add|sub ] e os métodos SystemTime estabilizáronse ::checked_[add|sub]. Estabilizáronse as funcións iter::from_fn e iter::successors;
  • Para todos os tipos de enteiros, implícanse os métodos checked_pow, saturating_pow, wrapping_pow e overflowing_pow;
  • Engadiuse a posibilidade de habilitar optimizacións na fase de ligazón especificando a opción de compilación "-C linker-plugin-lto" (rustc compila o código Rust en código de bits LLVM, o que permite aplicar optimizacións LTO).

Fonte: opennet.ru

Engadir un comentario