Lanzamiento de Rust 1.36.0: Rasgo futuro, estabilización de asignación y QuizásUninit

Les presento una traducción de la publicación sobre la nueva versión del lenguaje de programación favorito de todos, Rust .


Introduccion


El equipo del lenguaje de programación Rust se complace en anunciar una nueva versión, 1.36.0. Rust es un lenguaje de programación que permite a todos desarrollar software confiable y rápido.


Si instaló la versión anterior de Rust usando rustup , obtener la versión actual no será difícil:


 $ rustup update stable 

Si aún no tiene rustup , puede obtenerlo en la página correspondiente de nuestro sitio web. Una revisión detallada de esta versión está disponible en GitHub.


¿Qué se incluye en la versión estable?


Este lanzamiento ha realizado muchos cambios, incluida la estabilización del tan esperado rasgo Future , la asignación, la MaybeUninit<T> , NLL Rust 2015 , una nueva implementación de HashMap<K, V> y soporte para la bandera --offline en Cargo.


Los cambios más significativos se describen a continuación, sin embargo, también puede ver una lista detallada de innovaciones para una mayor conciencia.


Estabilización futura


¡Rust 1.36.0 estabilizó el tan esperado Future !


Esperamos que esta innovación permita que las cajas populares, las bibliotecas y todo el ecosistema se preparen para la .await async / .await , que se planea estabilizar en el futuro cercano.


Estante de distribución de estabilización


Antes de la versión 1.36.0, la biblioteca estándar consistía en proc_macro std , core y proc_macro . La core tenía una funcionalidad básica (como Iterator y Copy ) y podía usarse en entornos con #![no_std] , ya que no imponía ningún requisito. Mientras tanto, la caja std proporcionaba tipos como Box<T> , así como la funcionalidad del sistema operativo (asignador global).


Comenzando con Rust 1.36.0, los componentes de la caja estándar, que dependen del asignador global, por ejemplo, Vec<T> , ahora están disponibles en la alloc asignación. La std , mientras tanto, está reexportando estos componentes.


Mientras que los programas #![no_std] usan la caja de alloc todavía requieren el canal nightly , las #![no_std] c #![no_std] pueden usar la alloc en Rust estable.


También observamos que todos los programas "regulares" (sin #![no_std] ) en sus dependencias pueden contener las bibliotecas descritas anteriormente con #![no_std] . Esperamos que esto ayude a desarrollar un ecosistema compatible con #![no_std] .


Si es desarrollador de una biblioteca que requiere primitivas de asignación para funcionar, le recomendamos que marque su biblioteca como compatible con #![no_std] utilizando la siguiente sintaxis al comienzo del archivo lib.rs :


 #![no_std] extern crate alloc; use alloc::vec::Vec; 

MaybeUninit place mem :: no inicializado


En versiones anteriores de Rust, la función mem::uninitialized le permitía cancelar las comprobaciones de inicialización porque pensaba que YA se había inicializado para escribir T sin hacer nada. Uno de los usos de esta función fue la asignación "diferida" de matrices.


Sin embargo, mem::uninitalized es una operación demasiado peligrosa que no se puede utilizar correctamente con el compilador Rust, suponiendo que todos los valores se inicialicen correctamente.


Por ejemplo, llamar a mem::uninitialized::<bool>() causará inmediatamente un comportamiento indefinido , ya que desde el punto de vista de Rust, los bits no inicializados son cero ( false ) o unit ( true ), y solo dos de los patrones anteriores son adecuados para el tipo bool .


Para resolver esta situación, el tipo MaybeUninit<T> se estabilizó en Rust 1.36.0. El compilador de Rust ya no supone que MaybeUninit<T> es un tipo inicializado de T De esta manera, puede realizar una inicialización gradual de forma más segura y finalmente usar .assume_init() cuando esté seguro de que maybe_t: MaybeUninit<T> contiene el tipo inicializado T


Dado que MaybeUninit<T> es una alternativa más segura que comienza con Rust 1.38, la función mem::uninitialized se marcará como obsoleta.


Para obtener más información sobre la memoria no inicializada, mem::uninitialized MaybeUninit<T> y MaybeUninit<T> , lea el artículo de Alexis Bessessner . La biblioteca estándar también contiene suficiente documentación sobre MaybeUninit<T> .


NLL para Rust 2015


En el anuncio de Rust 1.31.0, le contamos sobre NLL (líneas de tiempo de vida no léxicas), una innovación en el lenguaje que hace que el controlador de enlace (verificador de préstamos) sea más inteligente y amigable. Por ejemplo, ahora puedes escribir así:


 fn main() { let mut x = 5; let y = &x; let z = &mut x; //     1.31.0 } 

En 1.31.0, el NLL se estabilizó solo para Rust 2018, y se asumió que lo transferiríamos a Rust 2015 en el futuro. Esto se hizo en Rust 1.36.0, NLL estuvo disponible para Rust 2015.


Con NLL admitido en ambas versiones, nos estamos acercando a la eliminación del antiguo controlador de enlace. Sin embargo, el antiguo controlador de enlace, desafortunadamente, aceptó un código incorrecto , que NO debería haber aceptado.


Y, como resultado, NLL se encuentra ahora en la etapa de "migración", en la que emitiremos advertencias en lugar de errores si el controlador de enlace NLL no aprueba el código que aprobaría el antiguo controlador de enlace basado en AST . Le recomendamos que consulte la lista de cajas públicas afectadas .


Para obtener más información sobre NLL, MIR, cómo solucionar problemas de integridad relacionados y qué se puede hacer con las advertencias del compilador que aparecen, lea el artículo de Felix Klok .


Nueva implementación de HashMap


En Rust 1.36.0, la implementación anterior de HashMap<K, V> fue reemplazada por una hashbrown hashbrown basada en el diseño SwissTable . La interfaz sigue siendo la misma, pero la implementación actual es en promedio más rápida y consume menos memoria. Sin embargo, tenga en cuenta que la implementación estándar todavía utiliza el algoritmo SipHash 1-3 .


- Soporte fuera de línea en Cargo


Durante la mayoría de las compilaciones, Cargo no usa su red. Sin embargo, en algunos puntos, por ejemplo, cuando se agregó una nueva dependencia, Cargo aún intentará acceder a la red. Algunas veces este comportamiento es inaceptable (en un sistema aislado o en un avión).


Rust 1.36.0 ha estabilizado la nueva bandera: --offline . Este indicador anula el algoritmo de resolución de dependencias, en su lugar utiliza dependencias locales en caché.


Si las cajas solicitadas no están disponibles sin una red que se ha desconectado, Cargo saldrá con un error. Para rellenar previamente el caché local antes de abandonar la red, use el comando cargo fetch , que carga todas las dependencias necesarias para un proyecto específico.


Para obtener más información sobre --offline y cargo fetch , lea el artículo de Nick Cameron . Otros cambios a Cargo se describen en detalle aquí .


Cambios de biblioteca



Otros cambios


Las descripciones detalladas de cambios en la versión 1.36.0 están disponibles para Rust , la biblioteca estándar , Cargo y Clippy .


Miembros 1.36.0


Mucha gente se unió para crear Rust 1.36.0. No podríamos haber hecho esto sin todos ustedes, ¡ gracias !


Del traductor


Con cualquier pregunta sobre el idioma Rust, podrán ayudarlo en el chat de Telegram en ruso o en un chat similar para los recién llegados .


Source: https://habr.com/ru/post/458848/


All Articles