Versió del llenguatge de programació Rust 1.38

publicat llançament del llenguatge de programació del sistema Rovell 1.38, fundada 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 estalvia al desenvolupador de manipular punters i protegeix dels problemes derivats de la manipulació de la memòria de baix nivell, com ara accedir a una àrea de memòria després d'haver-se alliberat, desreferenciar punters nuls, desbordaments de memòria intermèdia, etc. Per distribuir biblioteques, assegurar el muntatge i gestionar les dependències, el projecte desenvolupa un gestor de paquets Càrrega, que us permet obtenir les biblioteques que necessiteu per al programa amb un sol clic. S'admet un dipòsit per allotjar biblioteques caixes.io.

El principal innovacions:

  • S'ha afegit un mode de compilació canalitzat (pipelined), en què la creació d'un paquet de caixa dependent comença tan bon punt les metadades de dependència estan disponibles, sense esperar que finalitzi la seva compilació. Quan es compila un paquet, no cal que les dependències estiguin completament reunides, només cal definir les metadades, que inclouen llistes de tipus, dependències i elements exportats. Les metadades estan disponibles al principi del procés de compilació, de manera que ara els paquets enllaçats es poden compilar molt abans. Quan es construeixen paquets únics, el mode proposat no afecta el rendiment, però si la compilació cobreix paquets amb dependències ramificades, el temps de construcció global es pot reduir en un 10-20%;
  • Assegura la detecció de l'ús incorrecte de les funcions std::mem::no inicialitzat и std::mem::zeroed. Per exemple, std::mem::uninitialized és convenient per crear matrius ràpidament, però enganya el compilador perquè sembla que està inicialitzat, però en realitat el valor continua sense inicialitzar. La funció mem::uninitialized ja està marcada com a obsoleta i es recomana utilitzar un tipus intermedi. Potser Unitat. Pel que fa a mem::zeroed, aquesta funció pot causar problemes amb els tipus que no poden acceptar valors zero.

    Per ajudar a identificar el comportament no definit, la nova versió afegeix una comprovació de pelusa al compilador que detecta alguns problemes amb mem::uninitialized o mem::zeroed. Per exemple, ara obteniu un error quan intenteu utilitzar mem::uninitialized o mem::zeroed amb els tipus &T i Box‹T›, que representen objectes punter que no poden acceptar valors nuls;

  • L'atribut "#[obsolet]" s'ha ampliat per permetre que els paquets de caixes es marquin com a obsolets i es programin per a supressió futura. A partir de Rust 1.38, aquest atribut també es pot utilitzar per a macros;
  • S'ha afegit la possibilitat d'utilitzar l'atribut "#[global_allocator]" als submòduls;
  • Característica afegida std::qualsevol::nom_tipus, que permet esbrinar el nom del tipus, que pot ser útil per a la depuració. Per exemple, durant l'execució del programa podeu esbrinar per quin tipus es va anomenar la funció:

    fn valor_gen‹T: Per defecte>() -› T {
    println!("Inicialitzant una instància de {}", std::any::type_name::‹T›());
    Per defecte::predeterminat()
    }

    fn principal() {
    deixa _: i32 = valor_gen(); S'imprimirà # "i32".
    let _: String = gen_value(); # imprimirà "alloc::string::String"
    }

  • Funcions ampliades de la biblioteca estàndard:
    • slice::{concat, connect, join} ara pot prendre el valor &[T] a més de &T;
    • "*const T" i "*mut T" ara implementen marker::Unpin;
    • "Arc‹[T]›" i "Rc‹[T]›" ara implementen FromIterator‹T›;
    • iter::{StepBy, Peekable, Take} ara implementeu DoubleEndedIterator.
    • ascii::EscapeDefault implementa Clone i Display.
  • S'ha transferit una nova part de les API a la categoria estable, inclosos els mètodes que s'han estabilitzat
    • ‹*const T›::cast, ‹*mut T›::cast,
    • Durada::as_secs_f{32|64},
    • Durada::div_duration_f{32|64},
    • Durada::div_f{32|64},
    • Durada::from_secs_f{32|64},
    • Durada::mul_f{32|64},
    • operacions de divisió amb la resta
      div_euclid i rem_euclid per a totes les primitives enteres;

  • S'ha afegit suport per especificar l'opció "--features" diverses vegades per habilitar diferents funcions al gestor de paquets de càrrega;
  • El compilador en proporciona un tercer nivell suport per a plataformes de destinació aarch64-uwp-windows-msvc, i686-uwp-windows-gnu, i686-uwp-windows-msvc, x86_64-uwp-windows-gnu, x86_64-uwp-windows-unknown, armsvux-unknown -gnueabi, armv7-unknown-linux-musleabi, hexagon-unknown-linux-musl i riscv7i-unknown-none-elf. El tercer nivell implica suport bàsic, però sense proves automatitzades i publicació de compilacions oficials.

Font: opennet.ru

Afegeix comentari