- Se integró una nueva implementación basada en io_uring y Grand Central Dispatch (GCD) en el módulo
std.Io.Eventedde la biblioteca estándar de Zig - Ambas implementaciones funcionan mediante cambio de pila en espacio de usuario (fibers, corrutinas con pila, green threads)
- Por ahora están en una fase experimental y todavía requieren trabajo posterior, como mejorar el manejo de errores, eliminar el registro, analizar la causa de la degradación de rendimiento y reforzar las pruebas
- En el mismo código de aplicación, es posible cambiar fácilmente entre io_uring o GCD solo reemplazando el backend de I/O
- Las dos implementaciones también funcionan en el compilador de Zig, y si se estabilizan en el futuro, podrían evolucionar como una base unificada de I/O asíncrono por plataforma
Implementación de std.Io.Evented basada en io_uring y GCD
-
Hacia el final del ciclo de lanzamiento de Zig 0.16.0,
std.Io.Eventedse actualizó para reflejar los cambios más recientes de la API- Las implementaciones agregadas recientemente son io_uring (Linux) y Grand Central Dispatch (GCD) (macOS)
- Ambas implementaciones usan la técnica de cambio de pila en espacio de usuario (fibers, corrutinas con pila, green threads)
-
Por ahora, ambas implementaciones están en estado experimental, y aún quedan varias tareas de mejora para un uso estable
- Hace falta mejorar el manejo de errores
- Hace falta eliminar el registro y diagnosticar la causa de la degradación de rendimiento (se presenta una caída de rendimiento del compilador al usar
IoMode.evented) - Existen algunas funciones aún no implementadas y es necesario ampliar la cobertura de pruebas
- Hace falta agregar una función integrada para verificar el tamaño máximo de pila por función (con el fin de asegurar utilidad práctica cuando
overcommitestá desactivado)
Ejemplo de reemplazo de implementación de I/O
-
Es posible ejecutar el mismo código de aplicación cambiando solo el backend de I/O
- En el código de ejemplo, si se usa
std.Io.Eventeden lugar destd.Io.Threaded, se ejecuta sobre io_uring - La función
appes la misma y el resultado de salida (Hello, World!) también es el mismo
- En el código de ejemplo, si se usa
-
La diferencia entre ambos modos de ejecución puede verse comparando los resultados de
stracehello_threadedusa llamadas de I/O basadas en hilos convencionaleshello_eventedusa llamadas al sistema de io_uring (io_uring_setup,io_uring_enter, etc.)
Aplicación en el compilador de Zig y estado actual
-
El propio compilador de Zig también funciona correctamente usando
std.Io.Evented- El compilador puede ejecutarse tanto con io_uring como con GCD
- Sin embargo, como todavía no se conoce la causa de la degradación de rendimiento, hace falta un análisis adicional
-
Con este cambio, Zig se acerca a una estructura en la que el código puede cambiar fácilmente la implementación de I/O
- Se sientan las bases para manejar de forma unificada los modelos de I/O asíncrono según la plataforma
Próximas tareas
- Hace falta mejorar el rendimiento y reforzar las pruebas para un uso estable
- Si se agrega una función de gestión del tamaño de pila, podría usarse de forma práctica incluso en entornos donde overcommit esté desactivado
- Una vez completado, se espera que la capa de abstracción de I/O asíncrono de Zig se fortalezca aún más
Conclusión
- Esta actualización representa un avance importante en la expansión del sistema estándar de I/O de Zig
- Al integrar io_uring y GCD, se sientan las bases para asegurar una mayor consistencia del procesamiento asíncrono entre plataformas
- Cuando se complete el trabajo de estabilización, se ampliarán las posibilidades de implementar un modelo de I/O flexible y de alto rendimiento en Zig
1 comentarios
Opiniones de Hacker News
No soy fan de Zig, pero da gusto ver cómo un equipo pequeño progresa de forma constante
Me impresiona su actitud de priorizar la experimentación y la mejora gradual por encima de “terminarlo” todo
Creo que es más importante avanzar hacia metas de largo plazo que apresurarse a sacar una versión 1.0
Para ser un proyecto tan centrado en una sola persona, es un logro sorprendente, y la gente que se esfuerza merece el reconocimiento justo
Hasta ahora ha sido la experiencia más divertida y productiva que he tenido
La simplicidad de Zig me encaja mucho mejor que la gestión estricta de memoria de Rust
La vida es corta y yo solo quiero hacer software rápido y bien organizado
En cada artículo sobre Zig hay muchas críticas, pero no entiendo por qué le dan tanta importancia
Más bien me inspira el espíritu de ingeniería de Andrew y el equipo al intentar materializar aquello en lo que creen
No hace falta preocuparse por si Zig se vuelve mainstream; si ayuda a resolver problemas, con eso basta
No hay necesidad de tratar un lenguaje como si fuera una identidad
Los lenguajes y las librerías son, al final, “habilidades vendibles”, así que la gente es consciente del valor de mercado de las herramientas que usa
Además, también es un problema que quienes toman decisiones tiendan a ver a los ingenieros como recursos reemplazables
Se han repetido con Lisp, Ruby, Rust y otros, y las peleas de identidad son un problema crónico de la industria
Hace falta gestión a largo plazo para temas de seguridad, soporte de arquitectura, etc., pero los desarrolladores suelen pasar por alto ese costo
Zig todavía no es estable, así que hay paquetes que solo compilan en versiones concretas
Me pregunto si realmente hace falta resolver con un lenguaje nuevo problemas que también podrían solucionarse mejorando otros lenguajes
Siento que no tiene mucho sentido seguirle la pista a Zig hasta que llegue a la 1.0
Es muy probable que la estructura actual se reescriba varias veces
Yo también me interesé en su momento, pero no sé si llegaré a ver la 1.0 en mi vida
Las funciones básicas como entrada/salida de archivos son casi iguales; lo que cambia sobre todo son los namespaces
Yo creo que un “lenguaje vivo” es mejor
Incluso después de la 1.x, estaría bien tener una estrategia de gestión de interfaces por versión para mantener la stdlib liviana
Como estuve construyendo mi propio framework de I/O, encontré falta de pruebas y código ensamblador incorrecto
Lo señalé varias veces, pero no se corrigió, y eso me hizo perder confianza
Sobre todo en la nube, donde optimizar el rendimiento puede reducir los costos de servidores en más de 90%
Con Python o Node hay límites claros, y al final hay que bajar a C, C++, Rust o Zig
De esos, Zig es fácil de aprender y cómodo de leer y probar
Ya es un lenguaje que se usa a nivel profesional
La mayoría de los cambios realmente se sienten como mejoras del lenguaje
Es interesante que Zig intente implementar esto antes, mientras que el soporte de io_uring en Rust todavía no está terminado
En Rust es difícil diseñar abstracciones seguras y zero-cost
Esta noticia todavía trata de una implementación incompleta
Por ejemplo, la versión con GCD no tiene networking
La interfaz sigue creciendo, así que se parece más a un snapshot actual que a algo terminado
y además enumera de forma concreta seis tareas principales que quedan por hacer
Hay un issue relacionado con la optimización de memoria en stack
Hace falta una función que permita que, aunque se use
[500]u8en bloques distintos, el stack frame ocupe solo 500 bytesEsto es especialmente importante en relación con los stacks de corrutinas de hilos verdes
Veo de forma positiva el esfuerzo continuo de mejora de Zig
Ahora mismo no hay ningún lenguaje que maneje bien io_uring
Si Zig resuelve bien esta parte, tendría una gran ventaja
Me parece más valiosa una actitud que prioriza el aprendizaje y la experimentación por encima de la estabilidad
Yo prefiero usar libxev en Zig y controlar io_uring directamente
Uno de los factores del éxito de C fue su estabilidad y una cultura de desarrollo consistente
Me gusta que Zig se tome en serio los targets freestanding
Espero que en la versión 0.16 haya más reutilización de código
Revisé el interior de macOS por primera vez en mucho tiempo, y me alegró ver que mantuvieron GCD
Me parece un enfoque equilibrado de la paralelización
Mientras otros lenguajes solo debaten, Zig prueba las cosas directamente y, si hace falta, da marcha atrás
Creo que una API validada en la práctica es el mejor diseño posible
Se pueden mantener las versiones viejas, y si te pasas a la versión más reciente obtienes herramientas más limpias y rápidas
Es complejo como C++, mientras que Zig mantiene una simplicidad a nivel de C
Carbon todavía no tiene una forma concreta
Jai lleva 11 años en beta cerrada, mientras que Zig ya se usa en varios proyectos reales
Los cambios descontrolados que vimos con Python 2→3, async en Rust, genéricos en Go o C++ más bien han sido perjudiciales