Rust 1.99: variádicas de C, rustdoc un 40% más rápido y el control de memoria que los veteranos pedían a gritos

noticias programacion

El equipo de Rust ha publicado la versión 1.99.0, una actualización que estabiliza las funciones variádicas de C directamente en Rust, acelera rustdoc hasta un 40% en crates reales y desbloquea un conjunto de APIs de bajo nivel para el manejo de punteros, vectores y tiempos de archivo.

En total, 506 contribuyentes han hecho posible esta entrega, la antesala de un Rust 2.0 que ya se huele en el horizonte.

Funciones variádicas de C: Rust deja de ser un ciudadano de segunda en FFI

El plato fuerte de esta versión es la estabilización de las funciones variádicas de C-ABI. Hasta ahora, Rust podía llamar a funciones como printf definidas en C, pero no podía definirlas. Con Rust 1.99.0, los desarrolladores pueden escribir funciones variádicas directamente en Rust usando las ABI "C" y "C-unwind", y la lista de argumentos variables se maneja a través de core::ffi::VaList.

El cambio tiene una implicación profunda para el ecosistema. Cualquier biblioteca Rust que necesite exponer una API compatible con C —desde enlaces para sistemas embebidos hasta wrappers de bibliotecas nativas— ya no tendrá que recurrir a trucos o a código C auxiliar.

La estabilización de #[unsafe(naked)] para funciones C-variádicas completa el círculo, permitiendo definir funciones desnudas que aceptan listas de argumentos variables, algo que antes era territorio exclusivo de C y ensamblador.

Rustdoc acelera: hasta un 40% más rápido en crates reales

La documentación de Rust siempre ha sido uno de sus pilares, pero también uno de sus puntos más lentos en proyectos grandes. Rust 1.99.0 introduce un filtrado más inteligente de las implementaciones de traits, lo que se traduce en mejoras de rendimiento del 20% de media y de hasta el 40% en algunos crates del mundo real.

El cambio es especialmente relevante para proyectos con jerarquías de traits complejas, donde rustdoc pasaba una cantidad desproporcionada de tiempo evaluando candidatos irrelevantes. Además, se añade un nuevo lint de rustdoc, unused_footnote_definition, que detecta notas al pie definidas pero nunca referenciadas en la documentación.

Nuevas APIs estabilizadas: control total sobre la memoria y el tiempo

Rust 1.99.0 estabiliza un conjunto de APIs que los desarrolladores de bajo nivel llevaban años esperando. Las más destacadas son:

  • Box::into_non_null y Box::from_non_null: permiten convertir un Box en un puntero NonNull y viceversa, evitando el uso de Box::leak cuando la memoria debe liberarse más tarde.
  • Vec::into_parts y Vec::from_parts: descomponen un Vec en sus componentes crudos (puntero, capacidad, longitud) y lo reconstruyen, abriendo la puerta a optimizaciones manuales de asignación.
  • VecDeque::retain_back: retiene elementos desde la parte trasera de la cola, complementando el retain existente que solo operaba desde el frente.
  • String::from_utf8_lossy_owned: convierte un Vec<u8> en un String sustituyendo secuencias UTF-8 inválidas, sin necesidad de una copia intermedia.
  • std::fs::set_times y set_times_nofollow: permiten modificar los timestamps de archivos y enlaces simbólicos directamente desde Rust, sin recurrir a comandos del sistema o crates de terceros.
  • Layout::for_value_raw, mem::size_of_val_raw y mem::align_of_val_raw: obtienen el tamaño y la alineación de tipos —incluidos tipos de tamaño dinámico como slices— a partir de punteros crudos, sin necesidad de crear una referencia válida.
  • IntoIterator para Box<[T; N]> y referencias a Box<[T; N]>: permite iterar sobre arrays empaquetados en Box de forma ergonómica.
  • AtomicPtr::update y AtomicPtr::try_update: ofrecen una alternativa segura y atómica a fetch_update para punteros atómicos.

Perfil debug: preparando el terreno para el futuro de Cargo

Rust 1.99.0 introduce un nuevo perfil integrado llamado debug, que actualmente no difiere del perfil dev pero que sienta las bases para una futura separación. La idea es que, en el futuro, dev deje de estar tan orientado a la depuración y ofrezca un default más sensato para iteraciones de desarrollo más rápidas.

El cambio es, por ahora, puramente preparatorio, pero marca una dirección clara: Cargo quiere que los desarrolladores tengan más control sobre la compensación entre velocidad de compilación y capacidad de depuración, sin tener que recurrir a perfiles personalizados en cada proyecto.

Otros cambios: lints, objetivos y compatibilidad

La versión incluye varios ajustes que, sin ser titulares, afectan al día a día de los desarrolladores:

  • Nuevo lint raw_borrows_via_references (allow-by-default): detecta referencias que decaen inmediatamente en préstamos crudos, un patrón que puede esconder bugs sutiles.
  • Extensión del lint unconditional_panic: ahora también detecta llamadas a funciones que entran en pánico cuando el tamaño de chunks o windows es cero.
  • -Ctarget-cpu convertido en target-modifier para AVR, AMDGCN y NVPTX: evita que crates compilados con distintos valores de CPU se enlacen de forma insegura.
  • static_position_independent_executables habilitado en todos los objetivos GNU y musl: los ejecutables estáticos ahora pueden compilarse como PIE por defecto, mejorando la seguridad.
  • Sugerencias de rustc basadas en doc alias: cuando un método no existe, el compilador prioriza coincidencias exactas de doc alias sobre búsquedas por similitud, ayudando a los nuevos usuarios a encontrar la API correcta.

Una comunidad imparable: 506 contribuyentes

Detrás de cada versión de Rust hay un ejército de voluntarios. En esta ocasión, 506 personas han contribuido a Rust 1.99.0, con nombres como Jakub Beránek (521 contribuciones), Ralf Jung (257) y Chayim Refael Friedman (198) liderando la lista. El dato no es menor: Rust sigue siendo uno de los proyectos de código abierto con mayor participación comunitaria, y esa es, quizás, su ventaja competitiva más difícil de replicar.

Vistas: 1

Descubre más desde CIBERED

Suscríbete y recibe las últimas entradas en tu correo electrónico.

Scroll al inicio