BookinglyTech News
Software

Swift 6.4 estabiliza Subprocess 1.0 y acelera hasta 40 veces el código Wasm

La nueva versión del lenguaje añade tipos no copiables para recortar reservas de memoria, mejora la interoperabilidad con C++20 y Java y unifica la cadena de compilación bajo Swift Build.

2 min de lecturaInfoQ0 vistas

Swift 6.4 ya está disponible. La entrega estabiliza Subprocess, la librería que lanza y controla procesos externos con una API común a todas las plataformas, acelera hasta 40 veces el código compilado a WebAssembly y suma un puñado de tipos pensados para reducir copias y reservas de memoria. También amplía la interoperabilidad con C++20 y Java, y adopta Swift Build como cadena de compilación por defecto en todos los sistemas soportados.

En sintaxis hay varios atajos nuevos. El compilador acepta escribir AType? en lugar de (some AType)? o (any AType)?, incorpora el atributo @diagnose para controlar avisos y diagnósticos, y permite desambiguar símbolos con el mismo nombre importados de módulos distintos usando AModuleName::.

Para quien esté metiendo su base de código en la concurrencia estricta de Swift 6, hay dos cambios que quitan rozamiento. El bloque defer admite await directamente, así que ya no hay que envolver la llamada asíncrona en un Task aparte. Y withTaskCancellationShield protege temporalmente una tarea de la cancelación para que el código de limpieza crítico llegue a ejecutarse. Antoine van der Lee, autor de uno de los blogs de referencia sobre el tema, señala que son mejoras prácticas más que un cambio de día a día, pero que conviene conocerlas durante una migración.

Menos copias en los arrays

La versión estrena UniqueArray, UniqueBox, Ref y MutableRef, además del protocolo Iterable. UniqueBox es un puntero inteligente sin conteo de referencias que posee en exclusiva un valor reservado en el heap y obliga a cumplir semántica de no copiable. UniqueArray esquiva las reservas por copia al escribir que arrastra un Array normal y ofrece un buffer dinámico que crece de forma eficiente, mientras que Iterable permite recorrer elementos con semántica de borrowing. Los accesores borrow y mutate dejan leer o modificar un Span o un InlineArray a través de una propiedad, y los tipos no copiables ya pueden conformar Equatable, Comparable y Hashable.

Subprocess 1.0 y el resto

Subprocess sale de la fase experimental y ofrece una API estable para lanzar procesos y capturar su salida, con una llamada así de directa:

let result = try await Subprocess.run(
    .name("ls"),
    arguments: ["-la"],
    output: .string(limit: 4096)
)
print(result.standardOutput)

En interoperabilidad, los atributos @c e @implementation permiten dar la implementación de una cabecera C directamente en Swift, sin una declaración C aparte. C++20 puentea su std::span con el Span de Swift de forma transparente y la conexión con Java se amplía en varios frentes. El puente a Wasm a través de JavaScriptKit es hasta 40 veces más rápido que el enlace dinámico, según el equipo del lenguaje.

A eso se suma una depuración más sólida cuando hay módulos de por medio, un punto que los desarrolladores llevan tiempo pidiendo. La cifra de 40 veces y el resto de mejoras de rendimiento son del anuncio oficial, no de una medición independiente, así que queda por ver cómo se traducen en proyectos reales con cargas de trabajo menos favorables.