Lanzamiento del lenguaje de programación Rust 1.64

Se ha lanzado el lenguaje de programación de propósito general Rust 1.64, fundado por el proyecto Mozilla pero ahora desarrollado bajo los auspicios de la organización independiente sin fines de lucro Rust Foundation. El lenguaje se enfoca en la seguridad de la memoria y proporciona los medios para lograr un alto paralelismo de trabajos mientras evita el uso de un recolector de basura y tiempo de ejecución (el tiempo de ejecución se reduce a la inicialización básica y el mantenimiento de la biblioteca estándar).

Los métodos de manejo de memoria de Rust salvan al desarrollador de errores al manipular punteros y protegen contra los problemas que surgen debido al manejo de memoria de bajo nivel, como acceder a un área de memoria después de haberla liberado, desreferenciar punteros nulos, desbordamientos de búfer, etc. Para distribuir bibliotecas, proporcionar compilaciones y administrar dependencias, el proyecto desarrolla el administrador de paquetes Cargo. El repositorio crates.io es compatible con el alojamiento de bibliotecas.

La seguridad de la memoria se proporciona en Rust en tiempo de compilación a través de la verificación de referencias, el seguimiento de la propiedad de los objetos, el seguimiento de la vida útil de los objetos (alcances) y la evaluación de la corrección del acceso a la memoria durante la ejecución del código. Rust también brinda protección contra desbordamientos de 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 referencias y variables inmutables de forma predeterminada, ofrece tipado estático fuerte para minimizar los errores lógicos.

Principales novedades:

  • Se han aumentado los requisitos para el entorno Linux en el compilador, el administrador de paquetes Cargo y la biblioteca estándar libstd: los requisitos mínimos para Glibc se han elevado de la versión 2.11 a la 2.17 y el kernel de Linux de la versión 2.6.32 a la 3.2. Las restricciones también se aplican a los ejecutables de aplicaciones Rust creados con libstd. Los kits de distribución RHEL 7, SLES 12-SP5, Debian 8 y Ubuntu 14.04 cumplen con los nuevos requisitos. Se suspenderá la compatibilidad con RHEL 6, SLES 11-SP4, Debian 7 y Ubuntu 12.04. Se anima a los usuarios que utilizan ejecutables creados por Rust en entornos con un kernel de Linux más antiguo a actualizar sus sistemas, permanecer en versiones anteriores del compilador o mantener su propia bifurcación libstd con capas para mantener la compatibilidad.

    Entre las razones para finalizar el soporte para sistemas Linux más antiguos se encuentran los recursos limitados para continuar manteniendo la compatibilidad con entornos más antiguos. El soporte para Glibc heredado requiere el uso de herramientas heredadas al registrar un sistema de integración continua, ante los crecientes requisitos de versión en LLVM y utilidades de compilación cruzada. El aumento en los requisitos de la versión del kernel se debe a la capacidad de utilizar nuevas llamadas al sistema en libstd sin la necesidad de mantener capas para garantizar la compatibilidad con kernels más antiguos.

  • Se ha estabilizado el rasgo IntoFuture, que se parece a IntoIterator, pero se diferencia de este último por el uso de bucles “.await” en lugar de “for... in...”. Cuando se combina con IntoFuture, la palabra clave ".await" puede esperar no solo un rasgo de Futuro, sino también cualquier otro tipo que pueda convertirse en un Futuro.
  • La utilidad Rust-analyzer está incluida en la colección de utilidades proporcionadas con las versiones de Rust. La utilidad también está disponible para su instalación usando Rustup (el componente Rustup agrega un analizador de óxido).
  • El administrador de paquetes Cargo incluye herencia del espacio de trabajo para eliminar la duplicación de valores de campos comunes entre paquetes, como las versiones de Rust y las URL del repositorio. También se agregó soporte para crear varias plataformas de destino a la vez (ahora puede especificar más de un parámetro en la opción “--target”).
  • Una nueva parte de la API se ha movido a la categoría de estable, incluidos los métodos y las implementaciones de rasgos que se han estabilizado:
    • futuro::Hacia el futuro
    • número::NonZero*::checked_mul
    • número::NonZero*::checked_pow
    • num::NonZero*::saturando_mul
    • num::NonZero*::saturating_pow
    • núm::NonZeroI*::abs
    • núm::NonZeroI*::checked_abs
    • num::NonZeroI*::overflowing_abs
    • num::NonZeroI*::saturating_abs
    • num::NonZeroI*::unsigned_abs
    • num::NonZeroI*::wrapping_abs
    • núm::NonZeroU*::checked_add
    • num::NonZeroU*::checked_next_power_of_two
    • num::NonZeroU*::saturating_add
    • os::unix::proceso::CommandExt::proceso_grupo
    • os::windows::fs::FileTypeExt::is_symlink_dir
    • os::windows::fs::FileTypeExt::is_symlink_file
  • Los tipos compatibles con C, previamente estabilizados en el módulo std::ffi, se han agregado al núcleo y a la biblioteca alloc:
    • núcleo::ffi::CStr
    • núcleo::ffi::FromBytesWithNulError
    • alloc::ffi::CString
    • alloc::ffi::FromVecWithNulError
    • alloc::ffi::IntoStringError
    • alloc::ffi::NulError
  • Los tipos C previamente estabilizados en el módulo std::os::raw se han agregado a los módulos core::ffi y std::ffi (por ejemplo, se han propuesto los tipos c_uint y c_ulong para los tipos C uint y ulong):
    • ffi::c_char
    • ffi::c_doble
    • ffi::c_float
    • ffi::c_int
    • ffi::c_long
    • ffi::c_longlong
    • ffi::c_schar
    • ffi::c_short
    • ffi::c_uchar
    • ffi::c_uint
    • ffi::c_ulong
    • ffi::c_ulonglong
    • ffi::c_ushort
  • Los controladores de bajo nivel se han estabilizado para su uso con el mecanismo Poll (en el futuro está previsto proporcionar una API simplificada que no requiera el uso de estructuras de bajo nivel como Pull and Pin):

    • futuro::poll_fn
    • tarea::¡listo!
  • El atributo "const", que determina la posibilidad de usarlo en cualquier contexto en lugar de constantes, se utiliza en la función slice::from_raw_parts.
  • Para almacenar datos de forma más compacta, se ha cambiado el diseño de la memoria de las estructuras Ipv4Addr, Ipv6Addr, SocketAddrV4 y SocketAddrV6. Puede haber un problema de compatibilidad con paquetes de caja única que usan std::mem::transmute para la manipulación de estructuras de bajo nivel.
  • La compilación del compilador Rust para la plataforma Windows utiliza optimizaciones PGO (optimización guiada por perfiles), lo que hizo posible aumentar el rendimiento de la compilación del código en un 10-20%.
  • El compilador ha implementado una nueva advertencia sobre campos no utilizados en determinadas estructuras.

Además, puede consultar el informe de estado sobre el desarrollo de una implementación alternativa del compilador del lenguaje Rust, elaborado por el proyecto gccrs (GCC Rust) y aprobado para su inclusión en el GCC. Después de integrar el frontend, las herramientas estándar de GCC se pueden utilizar para compilar programas en el lenguaje Rust sin la necesidad de instalar el compilador Rustc, creado con desarrollos LLVM. Mientras el desarrollo vaya por buen camino, y salvo problemas imprevistos, la interfaz de Rust se integrará en el lanzamiento de GCC 13 previsto para mayo del próximo año. La implementación GCC 13 de Rust estará en estado beta y aún no estará habilitada de forma predeterminada.

Fuente: opennet.ru

Añadir un comentario