Versió del llenguatge de programació Rust 1.34

S'ha llançat el llenguatge de programació del sistema Rust 1.34, desenvolupat pel projecte Mozilla. El llenguatge se centra en la seguretat de la memòria, proporciona una gestió automàtica de la memòria i proporciona un mitjà per aconseguir un paral·lelisme de tasques elevat sense utilitzar un col·lector d'escombraries o temps d'execució.

La gestió automàtica de la memòria de Rust allibera el desenvolupador de la manipulació del punter i el protegeix dels problemes derivats de la manipulació de la memòria de baix nivell, com ara els accessos a la memòria després de lliures, les referències de punter nul·les, l'excés de memòria intermèdia i similars. Per distribuir biblioteques, assegurar el muntatge i gestionar dependències, el projecte està desenvolupant el gestor de paquets Cargo, que permet obtenir les biblioteques necessàries per al programa amb un sol clic. El repositori crates.io és compatible per allotjar biblioteques.

Principals innovacions:

  • S'han afegit eines al gestor de paquets Cargo per treballar amb registres de paquets alternatius que poden coexistir amb el registre públic crates.io. Per exemple, els desenvolupadors d'aplicacions privades ara poden utilitzar el seu propi registre privat que es pot utilitzar quan enumeren dependències a Cargo.toml i utilitzar un model de versions semblant a crates.io per als seus productes, a més de fer referència tant a crates.io com a crates.io. en dependències al vostre propi registre.

    Per afegir un registre extern a ~/.cargo/config
    s'ofereix una nova opció "el meu registre" a la secció "[registres]" i s'ha afegit una opció "una altra caixa" per esmentar el registre extern a les dependències de Cargo.toml a la secció "[dependències]". Per connectar-vos a un registre addicional, simplement col·loqueu el testimoni d'autenticació al fitxer ~/.cargo/credentials i executeu l'ordre
    "inici de sessió de càrrega --registry=my-registry" i per publicar el paquet -
    "publicació de càrrega --registry=el meu-registre";

  • S'ha afegit suport complet per utilitzar l'operador “?”. en doctests, que us permeten utilitzar codi d'exemple de la documentació com a proves. Anteriorment operador
    "?" es podria utilitzar per gestionar errors durant l'execució de la prova només si hi havia una funció "fn main()" o a les funcions "#[test]";

  • En els atributs personalitzats definits mitjançant macros procedimentals, és possible utilitzar conjunts arbitraris de fitxes (“#[attr($tokens)]”, “#[attr[$tokens]] i #[attr{$tokens}]”). Anteriorment, els elements només es podien especificar en una forma arbre/recursiva utilitzant literals de cadena, per exemple “#[foo(bar, baz(quux, foo = “bar”)]”, però ara és possible utilitzar enumeracions (' #[rang(0. .10)]') i construccions com “#[bound(T: MyTrait)]”;
  • Els trets TryFrom i TryInto s'han estabilitzat, permetent conversions de tipus amb gestió d'errors. Per exemple, mètodes com from_be_bytes amb tipus enters utilitzen matrius com a entrada, però les dades sovint vénen en un tipus Slice i la conversió entre matrius i llesques és problemàtica de fer manualment. Amb l'ajuda de nous trets, l'operació especificada es pot realitzar sobre la marxa mitjançant una crida a .try_into(), per exemple, "let num = u32::from_be_bytes(slice.try_into()?)". Per a les conversions que sempre tenen èxit (per exemple, del tipus u8 a u32), s'ha afegit un tipus d'error infal·lible per permetre l'ús transparent de
    TryFrom per a totes les implementacions "De" existents;

  • S'ha obsolet la funció CommandExt::before_exec, que permetia l'execució d'un controlador abans de l'execució que es va executar en el context d'un procés fill bifurcat després de la trucada fork(). En aquestes condicions, alguns recursos del procés pare, com ara descriptors de fitxers i àrees de memòria mapejades, es podrien duplicar, cosa que podria provocar un comportament indefinit i un funcionament incorrecte de les biblioteques.
    En lloc de before_exec, es recomana utilitzar la funció no segura CommandExt::pre_exec.

  • Tipus d'enters atòmics estabilitzats amb signe i sense signe que van de 8 a 64 bits (per exemple, AtomicU8), així com tipus amb signe NonZeroI[8|16|32|54|128].
  • S'ha mogut una nova part de l'API a la categoria d'estable, inclosos els mètodes Any::type_id, Error::type_id, slice::sort_by_cached_key, str::escape_*, str::split_ascii_whitespace, Instant::checked_[add |sub] i SystemTime estan estabilitzats ::checked_[add|sub]. S'han estabilitzat les funcions iter::from_fn i iter::successors;
  • Per a tots els tipus d'enters, s'implementen els mètodes checked_pow, saturating_pow, wrapping_pow i overflowing_pow;
  • S'ha afegit la possibilitat d'habilitar optimitzacions en l'etapa d'enllaç especificant l'opció de creació "-C linker-plugin-lto" (rustc compila el codi Rust al codi de bits LLVM, que permet aplicar optimitzacions LTO).

Font: opennet.ru

Afegeix comentari