- Empresa (no revelada) que ofrece servicios a cientos de millones de usuarios y usa C y C++ en sistemas centrales
- Durante todo 2023 se discutió cuál lenguaje adoptar entre Rust y Zig
- Consideraciones principales:
- Interoperabilidad con C
- Escalabilidad de ingeniería (contratación, mantenimiento, etc.)
- Elección final: Zig
- Comparten este proceso de decisión porque creen que muestra bien los factores que una empresa grande considera cuando "el código se ejecuta en distintos entornos y afecta a cientos de millones de usuarios"
La importancia de la interoperabilidad con C
- La biblioteca que querían reescribir podría usarse en todas las plataformas (web, móvil, headsets de VR, consolas de videojuegos, escritorio, etc.)
- Por lo tanto, ofrecer una API en C y usarla mediante FFI era la única forma de garantizar la ejecución en todas las plataformas
Principales temas de discusión
Rust
- En ese momento era más de 25 veces más popular que Zig (según encuestas y subreddit)
- Se había mantenido estable durante más tiempo
- El patrocinio industrial de la Rust Foundation parecía sólido
- Excelente LSP y experiencia de desarrollo
- Cargo: gestor de paquetes de primer nivel en la industria
- Seguridad de memoria y "sin comportamiento indefinido" (no del todo cierto, pero se mencionó durante la discusión)
- Si el objetivo era alejarse de C++, Rust parecía más adecuado por no tener la posibilidad de errores de memoria ni comportamiento indefinido
- Soporte para SIMD en la versión
nightly
- Soporte para WASM tan fluido como el de Zig
- En rendimiento estaba a la par con Zig o, en algunos casos, era "considerablemente más rápido"
Interoperabilidad de Rust con C:
- Rust tiene un ecosistema propio abundante, por lo que la importancia de la interoperabilidad con C es relativamente menor
- Buen potencial de integración con lenguajes de alto nivel como Python mediante bindings
- Se argumentó que las ventajas de usar Rust compensaban las desventajas de tener que ofrecer bindings para C
Zig
- Fácil de aprender para desarrolladores con experiencia en C/C++ o TypeScript
- Ofrece una experiencia de programación agradable para quienes vienen de C
- El compilador de Zig también puede compilar C y C++, lo que ayuda con la gestión de dependencias y la construcción de bibliotecas con ABI de C
- Es muy fácil dar soporte a múltiples plataformas objetivo (el comando
zig targets recibió muchos elogios)
- Facilita escribir software rápido (soporte nativo para
Vector, uso de SIMD, etc.)
- Compatible con depuradores existentes
- Excelente sistema de build (una mejora 100 veces mayor frente al Makefile existente)
- Alta transparencia financiera de la Zig Software Foundation
- Permite portar gradualmente el código C++ existente y "zigificarlo"
- Daba confianza para resolver problemas de linking/compilación en todas las plataformas objetivo
Conclusión
- Zig reduce de forma importante el tiempo y esfuerzo necesarios para portar la base de código existente y garantizar compatibilidad en todas las plataformas
- Factores decisivos inesperados:
- La facilidad de aprendizaje y la contratación influyeron más de lo esperado (a favor de Zig)
- La experiencia de desarrollo relacionada con el toolchain tuvo un papel importante
- El compilador y el sistema de build de Zig ayudaron mucho por su compatibilidad con la base de código existente
- El ecosistema, la comunidad y las garantías de seguridad de memoria de Rust tuvieron menos peso del esperado
10 comentarios
¡Disfruté mucho leer este texto! Estaba investigando sobre node, bun y deno, y como vi que bun estaba escrito en un lenguaje poco conocido para mí llamado zig, me dio curiosidad saber qué tipo de lenguaje era; ¡gracias por esta buena probadita!
Un gran problema en
ziges que, cuando hay errores en el código escrito por el usuario durante la compilación, no indica la ubicación exacta ni brinda información precisa. Parece que solo muestra información hasta la biblioteca estándar.Al leer los factores considerados, los temas de discusión y la conclusión, parece que desde el principio ni siquiera era un entorno donde Rust fuera necesario. ¿Alguna vez has visto a un repartidor de comida manejando un todoterreno para hacer entregas?
Si hay que desarrollar en un lenguaje nativo, pero no es un trabajo crítico en términos de memoria, lo correcto es elegir el que sea más cómodo para desarrollar. Tampoco era como para pasarse un año discutiendo esto...
Dirigido a cientos de millones de usuarios....
Me da curiosidad saber qué empresa será. Parece una empresa que no está atada a procedimientos formales como la certificación... qué envidia...
Una vez al año suelo echarle un vistazo a Zig, y creo que casi todos los años ha habido algún
breaking change;;Además, como el propio lenguaje no trae listas ni bibliotecas para el paso de mensajes entre hilos, todavía parece que le falta bastante camino por recorrer si lo comparamos con la madurez de Rust.
Claro, si el usuario conoce a fondo las APIs del sistema operativo, quizá no sea un gran problema, pero…
Aunque Rust es más de 25 veces más popular que Zig, parece que Zig tiene ventaja para conseguir trabajo.
Creo que es por el punto 1: que para desarrolladores con experiencia en C/C++ o TypeScript es fácil de aprender.
Ofrece una experiencia de programación agradable para desarrolladores con experiencia en C
Es fácil escribir software rápidamente (soporte nativo para vectores, aprovechamiento de SIMD, etc.)
Se siente como cuando aprendí Python por primera vez
Mientras veía que Bun se desarrollaba en el lenguaje Zig, me preguntaba por qué habían elegido precisamente Zig, pero gracias a este buen artículo comparándolo con Rust ahora lo entiendo. Por cierto, parece que el lenguaje C de verdad será eterno.