Lanzamiento de Rust 1.53. Google financiará la adición de soporte para Rust en el núcleo de Linux.

Se ha publicado la versión 1.53 del lenguaje de programación de sistemas Rust, inicialmente desarrollado por Mozilla, pero actualmente mantenido por la independiente organización sin fines de lucro Rust Foundation. El lenguaje se centra en la seguridad en la gestión de memoria, garantiza la gestión automática de memoria y proporciona medios para lograr un alto paralelismo en la ejecución de tareas, todo ello sin utilizar un recolector de basura y un runtime (el runtime se limita a la inicialización básica y el mantenimiento de la biblioteca estándar).

La gestión automática de memoria en Rust elimina errores que los desarrolladores pueden cometer al manipular punteros y protege contra problemas derivados del trabajo de bajo nivel con la memoria, tales como acceso a áreas de memoria después de su liberación, desreferenciar punteros nulos, y desbordamiento de búfer, entre otros. Para la distribución de bibliotecas, la elaboración y gestión de dependencias del proyecto se está desarrollando un gestor de paquetes llamado Cargo. Para el alojamiento de bibliotecas, se mantiene un repositorio en crates.io.

Novedades principales:

  • Para los arrays se ha implementado el trait IntoIterator, que permite la iteración sobre los elementos del array por valor: for i in [1, 2, 3] { .. }

    Además, se ha introducido la posibilidad de pasar arrays a métodos que aceptan iteradores, por ejemplo: let set = BTreeSet::from_iter([1, 2, 3]); for (a, b) in some_iterator.chain([1]).zip([1, 2, 3]) { .. }

    Anteriormente, IntoIterator solo estaba implementado para referencias a arrays, es decir, para iterar por valores se requería el uso de referencias (‘&[1, 2, 3]’) o ‘[1, 2, 3].iter()’. Las implementaciones de IntoIterator para arrays encontraban problemas de compatibilidad causados por la transformación previamente añadida en el compilador de method array.into_iter() a (&array).into_iter(). Se logró resolver estos problemas mediante un enfoque indirecto: el compilador seguirá transformando array.into_iter() en (&array).into_iter(), como si no hubiera implementación del trait IntoIterator, pero solo al invocar el método utilizando la sintaxis ‘.into_iter()’ y sin tocar las invocaciones en la forma ‘in [1, 2, 3]’, ‘iter.zip([1, 2, 3])’, ‘IntoIterator::into_iter([1, 2, 3])’.

  • Se ha habilitado la posibilidad de incluir expresiones ‘|’ (operación lógica OR) en cualquier parte del patrón, por ejemplo, en lugar de ‘Some(1) | Some(2)’ ahora se puede escribir ‘Some(1 | 2)’: match result { Ok(Some(1 | 2)) => { .. } Err(MyError { kind: FileNotFound | PermissionDenied, .. }) => { .. } _ => { .. } }
  • Se permite el uso de caracteres no ASCII en los identificadores, incluidos cualquier símbolo nacional definido en la especificación Unicode UAX 31, pero excepto los emojis. Al utilizar caracteres diferentes pero similares en forma, el compilador emitirá una advertencia. const BLÅHAJ: &str = «🦈»; struct 人 { 名字: String, } let α = 1; let sos = 2; warning: identifier pair considered confusable between ‘s’ and ‘s’
  • Se ha trasladado un nuevo lote de API a la categoría estable, incluyendo los siguientes estabilizados:
    • array::from_ref
    • array::from_mut
    • AtomicBool::fetch_update
    • AtomicPtr::fetch_update
    • BTreeSet::retain
    • BTreeMap::retain
    • BufReader::seek_relative
    • cmp::min_by
    • cmp::min_by_key
    • cmp::max_by
    • cmp::max_by_key
    • DebugStruct::finish_non_exhaustive
    • Duration::ZERO
    • Duration::MAX
    • Duration::is_zero
    • Duration::saturating_add
    • Duration::saturating_sub
    • Duration::saturating_mul
    • f32::is_subnormal
    • f64::is_subnormal
    • IntoIterator para arrays
    • {integer}::BITS
    • io::Error::Unsupported
    • NonZero*::leading_zeros
    • NonZero*::trailing_zeros
    • Option::insert
    • Ordering::is_eq
    • Ordering::is_ne
    • Ordering::is_lt
    • Ordering::is_gt
    • Ordering::is_le
    • Ordering::is_ge
    • OsStr::make_ascii_lowercase
    • OsStr::make_ascii_uppercase
    • OsStr::to_ascii_lowercase
    • OsStr::to_ascii_uppercase
    • OsStr::is_ascii
    • OsStr::eq_ignore_ascii_case
    • Peekable::peek_mut
    • Rc::increment_strong_count
    • Rc::decrement_strong_count
    • slice::IterMut::as_slice
    • AsRef<[T]> para slice::IterMut
    • impl SliceIndex para (Bound<usize>, Bound<usize>)
    • Vec::extend_from_within
  • Se ha implementado el tercer nivel de soporte para la plataforma wasm64-unknown-unknown. Este nivel implica soporte básico, pero sin pruebas automatizadas, publicación de versiones oficiales y verificación de la posibilidad de compilar el código.
  • El gestor de paquetes Cargo se ha trasladado por defecto a utilizar el nombre «main» para la rama principal del repositorio Git (HEAD). Para las dependencias alojadas en repositorios que utilizan el nombre 'main' en lugar de 'master', ya no es necesario especificar en la configuración branch = 'main'.
  • En el compilador, se han elevado los requisitos para la versión mínima de LLVM a LLVM 10.

Adicionalmente, se puede señalar la provisión de financiamiento para el desarrollo de la integración en el núcleo de Linux de herramientas para el desarrollo de componentes en el lenguaje Rust. El trabajo se realizará en el marco del proyecto Prossimo, bajo los auspicios de la organización ISRG (Internet Security Research Group), que es la fundadora del proyecto Let’s Encrypt y promueve el avance de HTTPS y el desarrollo de tecnologías para aumentar la seguridad de Internet. Los fondos serán proporcionados por Google, que financiará el trabajo de Miguel Ojeda, autor del proyecto Rust-for-Linux. Anteriormente, ISRG y Google ya habían financiado la creación de un backend HTTP alternativo para la herramienta curl y el desarrollo de un nuevo módulo TLS para el servidor http de Apache.

Según datos de Microsoft y Google, alrededor del 70% de las vulnerabilidades son causadas por un manejo inseguro de la memoria. Se espera que el uso del lenguaje Rust para el desarrollo de componentes del núcleo, como los controladores de dispositivos, reduzca el riesgo de vulnerabilidades causadas por un manejo inseguro de la memoria y elimine errores como el acceso a la memoria después de su liberación y las violaciones de límites de búfer.

El manejo seguro de la memoria se garantiza en Rust durante la compilación a través de la verificación de referencias, el seguimiento de la propiedad de los objetos y la consideración del tiempo de vida de los objetos (áreas de visibilidad), así como mediante la evaluación de la corrección del acceso a la memoria durante la ejecución del código. Rust también proporciona medios para proteger contra desbordamientos enteros, requiere la inicialización obligatoria de los valores de las variables antes de su uso, maneja mejor los errores en la biblioteca estándar, aplica el concepto de inmutabilidad (immutable) de referencias y variables por defecto, y ofrece una fuerte tipificación estática para minimizar errores lógicos.

Fuente: opennet.ru

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster