Lanzamiento de Rust 1.87

Para celebrar el décimo aniversario del lenguaje de programación Rust 1.0 (el proyecto Rust se fundó en 2006, la versión 0.1 se formó en 2012 y la primera versión estable se propuso en 2015), se lanzó Rust 1.87. El lenguaje se centra en la seguridad de la memoria y proporciona medios para lograr un alto paralelismo en la ejecución de tareas, sin necesidad de utilizar un recolector de basura ni un tiempo de ejecución (el tiempo de ejecución se reduce a la inicialización básica y al 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 ha añadido soporte para tuberías anónimas a la biblioteca estándar. El método std::io::pipe() se proporciona para crear tuberías sin nombre, que pueden usarse en combinación con std::process::Command para procesar flujos de entrada y salida estándar y para combinar flujos stdout y stderr. utilizar std::process::Command; utilizar std::io::Read; dejar (mut recibir, enviar) = std::io::pipe()?; let mut command = Command::new("path/to/bin") // combinando stdout y stderr en un canal .stdout(send.try_clone()?) .stderr(send) .spawn()?; deje que mut salida = Vec::new(); recv.read_to_end(&mut salida)?; ¡afirmar!(comando.esperar()?.éxito());
  • Se permite llamar a la mayoría de las funciones integradas del compilador (intrínsecas) de std::arch desde código seguro. El cambio se aplica a las funciones std::arch integradas que están marcadas como inseguras solo porque están vinculadas a una funcionalidad particular, si esa funcionalidad está habilitada. Por ejemplo, se puede llamar a _mm256_add_epi32 desde el código seguro si la aplicación usa '#[target_feature(enable = "avx2")]'.
  • Desde los bloques "asm!" Se permite que el código de ensamblaje se ramifique en bloques de código Rust, lo que simplifica el desarrollo de código de bajo nivel, como la implementación de optimizaciones en el kernel o la organización de la interacción con el hardware. El punto de salto para el comando ensamblador "jmp" se especifica en la macro "asm!" utilizando un nuevo operando "etiqueta" que contiene una expresión de bloque con código Rust. inseguro { asm!( "jmp {}", etiqueta { println!("¡Saltó desde asm!"); } ); }
  • Se permite especificar tipos genéricos capturados y duraciones de vida explícitamente en definiciones de rasgos usando tipos de retorno de rasgos impl. rasgo Foo { fn método<'a>(&'a self) -> impl Sized; tipo Implicit1<'a>: Tamaño; fn método_desugared<'a>(&'a self) -> Self::Implicit1<'a>; fn precise<'a>(&'a self) -> impl Sized + uso ; tipo Implicit2: Dimensionado; fn precise_desugared<'a>(&'a self) -> Self::Implicit2; }
  • 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:
    • Vec::extraer_si
    • vec::ExtraerSi
    • ListaEnlazada::extraer_si
    • lista_enlazada::ExtraerSi
    • <[T]>::split_off
    • <[T]>::mutación dividida
    • <[T]>::separar_primero
    • <[T]>::división_de_primera_mutación
    • <[T]>::split_off_last
    • <[T]>::dividir_desactivar_última_mutación
    • Cadena::extender_desde_dentro
    • os_str::Mostrar
    • Cadena de código abierto::mostrar
    • OsStr::mostrar
    • io::tubería
    • io::PipeReader
    • io::Escritor de tuberías
    • impl Desde para OwnedHandle
    • impl Desde para OwnedHandle
    • impl Desde para Stdio
    • impl Desde para Stdio
    • impl Desde para OwnedFd
    • impl Desde para OwnedFd
    • Caja >::escribir
    • impl TryFrom > para cadena
    • <*const T>::desplazamiento_desde_sin_signed
    • <*const T>::desplazamiento_de_byte_desde_sin_signed
    • <*mut T>::desplazamiento_desde_sin_signed
    • <*mut T>::desplazamiento_de_byte_desde_sin_signed
    • No nulo::desplazamiento desde sin signo
    • No nulo::desplazamiento de byte desde sin signo
    • ::cast_signed
    • No cero:: ::cast_signed.
    • ::cast_unsigned.
    • No cero:: ::cast_unsigned.
    • ::es_múltiplo_de
    • ::shl_sin límites
    • ::shr_sin límites
    • ::shl_sin límites
    • ::shr_sin límites
    • ::punto medio
    • ::de_utf8
    • ::de_mutación_utf8
    • ::de_utf8_sin marcar
    • ::de_mutación_utf8_sin_marcar
  • El signo "const" se utiliza en funciones:
    • núcleo::cadena::de_mutación_utf8
    • <[T]>::copiar_de_la_rebanada
    • Dirección de socket::establecer_ip
    • SocketAddr::establecer_puerto,
    • SocketAddrV4::establecer_ip
    • SocketAddrV4::establecer_puerto,
    • SocketAddrV6::establecer_ip
    • SocketAddrV6::establecer_puerto
    • SocketAddrV6::establecer_información_de_flujo
    • SocketAddrV6::establecer_id_de_alcance
    • char::es_dígito
    • char::is_whitespace
    • <N::as_flattened
    • <N::as_flattened_mut
    • Cadena::en_bytes
    • Cadena::as_str
    • Cadena::capacidad
    • Cadena::como_bytes
    • Cadena::len
    • Cadena::está_vacía
    • Cadena::as_mut_str
    • Cadena::as_mut_vec
    • Vec::as_ptr
    • Vec::as_slice
    • Vec::capacidad
    • Vec::len
    • Vec::está_vacío
    • Vec::as_mut_slice
    • Vec::as_mut_ptr
  • Se eliminó el segundo nivel de soporte para la plataforma de destino i586-pc-windows-msvc. Se recomienda utilizar la plataforma i686-pc-windows-msvc, que cuenta con soporte para instrucciones SSE2. La plataforma i586-pc-windows-msvc ya no es útil porque Windows 10 requiere compatibilidad con SSE2 y las versiones anteriores de Windows no son compatibles con Rust.

Fuente: opennet.ru

Añadir un comentario