- Buz es un fork en etapa inicial que parte del commit inmediatamente anterior a la reescritura de Bun en Rust, y se desarrolla con el objetivo de ser una alternativa compatible basada en Zig moderno
- Trasladó todo el grafo de build, incluido el código vendorizado de JavaScriptCore, a
build.zig, y aplicó pequeños parches a Zig para lograr builds incrementales en menos de 1 segundo - Importó pruebas de nuevas funciones y correcciones de bugs de la versión en Rust de Bun, pero muchas todavía fallan, por lo que debe seguir de cerca las funciones upstream y los cambios en JavaScriptCore
- Eliminó más de 11,000 líneas de código sin uso y, al modernizar algunas implementaciones alrededor de la biblioteca estándar de Zig, también corrigió varios bugs
- Aún no es apto para producción; su objetivo a largo plazo es reducir la deuda técnica usando LLMs junto con supervisión humana, y luego crear una base de código fácil de mantener incluso sin LLMs
Objetivos del proyecto y estado de desarrollo
- Buz es un fork en desarrollo basado en el último commit antes de que Bun fuera reescrito en Rust
- Se enfoca en ser una alternativa compatible con Bun y, al mismo tiempo, en crear una base de código más ordenada que la existente
- El desarrollo está en una etapa muy temprana, por lo que no está listo para usarse en producción
- Buz se publicó para evitar duplicar esfuerzos, ya que en Ziggit ya se había presentado un proyecto similar de Bun basado en Zig
- Al momento de publicarlo, ese proyecto aún no había sido revisado
Port a Zig moderno y builds incrementales
- Bun fue portado al Zig upstream actual, y se aplicaron pequeños parches a Zig para permitir rebuilds incrementales
- Todo el grafo de build, incluido el código vendorizado de JavaScriptCore, se integró en
build.zig - Con esta configuración, el tiempo de build incremental se redujo a menos de 1 segundo, acelerando el ciclo de iteración durante el desarrollo
- El proyecto incluye un submódulo de Zig
mastercon el parche de build incremental aplicado - En ese momento, también podía compilarse correctamente con el commit upstream de Zig
2b1c663
Pruebas de compatibilidad y seguimiento de upstream
- Se importaron pruebas añadidas a la versión en Rust de Bun, incluidas muchas que verifican nuevas funciones y correcciones de bugs
- Todavía hay muchas pruebas que no pasan, por lo que debe seguir alcanzando a Bun upstream
- En paralelo, se trabaja en ordenar el código y reducir la deuda técnica manteniendo la compatibilidad funcional
- También será necesario seguir continuamente los cambios de JavaScriptCore
Limpieza y modernización de la base de código
- Se eliminaron más de 11,000 líneas de código que Bun no usaba en absoluto
- Algunas partes del código se reescribieron y modernizaron, aumentando el uso de la biblioteca estándar de Zig
- Durante el proceso de limpieza y modernización también se corrigieron varios bugs
- La base de código existente de Bun tiene alrededor de 600,000 líneas, y se considera que para llegar a un estado ordenado habrá que reescribir una cantidad importante de subsistemas
Uso de LLMs y política de contribuciones
- Para ordenar el código heredado complejo se planea usar LLMs de forma amplia, junto con supervisión humana y mejores prácticas de desarrollo
- No se aceptarán contribuciones escritas directamente por personas hasta que se considere que la base de código está suficientemente ordenada
- La prioridad es reducir la deuda técnica y escribir código Zig idiomático, con el objetivo de contar en semanas o meses con una base de código que pueda presentarse como reemplazo compatible de Rust Bun 1.4.0
- Se solicita ayuda de desarrolladores que puedan usar Sol o Fable
- A largo plazo, se busca crear una base de código fácil de mantener incluso sin ayuda de LLMs, y también mejorar las habilidades en Zig durante el proceso
1 comentarios
Opiniones en Hacker News
La compilación incremental de Zig todavía no soporta aarch64 y el parcheo de binarios solo es posible con el linker de Linux, pero el soporte para las plataformas principales parece cuestión de tiempo.
El hecho de que un equipo de una sola persona haya logrado builds de 1 segundo muestra que las builds lentas eran resultado de prácticas de desarrollo descuidadas, y que dedicar tiempo al fork fue una asignación de recursos totalmente equivocada.
Al final parece que significa dar más instrucciones, o mejores. La estructura del código también parece una cuestión de gustos; ayer tuve una conversación absurda con un amigo que insistía en que para manejar una sola solicitud HTTP se necesitaban cuatro procesos de backend.
Creo que la era en la que intervenían humanos fue una etapa temporal desde el inicio.
Me pregunto si esto es común en proyectos grandes y simplemente yo no lo sabía.
No queda claro si era código obvio como
if (false) { dead_code(); }, o código que podría invocarse mediante dispatch dinámico pero que lógicamente nunca puede llamarse. Si es lo primero, 1,8% es alto; si es lo segundo, podría ser bajo. Muchos proyectos acumulan código detrás de feature flags viejos que, en la práctica, nunca se ejecutará.Está bien dejar pequeñas cantidades de código muerto, como utilidades simples o código generado, pero a veces eliminarlo desencadena una cadena de eliminaciones y simplificaciones.
Estrictamente hablando no era código muerto, pero al limpiar una pequeña abstracción equivocada se abren una tras otra nuevas oportunidades de limpieza, y al final queda software que solo hace lo que se pretendía. Las bases de código se hinchan con el tiempo, así que en el caso de Bun me sorprende más que solo hayan encontrado 11.000 líneas.
En la fase tic se agregan funcionalidades rápidamente para producir una versión correcta pero extremadamente desordenada; en la fase tac se digiere y ordena el resultado para mejorar rendimiento, mantenibilidad y fragilidad ante cambios.
A veces se crea en un día una app funcional con vibe coding, y luego se pasa una semana convirtiéndola en un proyecto al que se le puedan seguir agregando funciones sin que se derrumbe como un castillo de naipes. Antes de la AI ya pasaba algo parecido, pero los desarrolladores profesionales tenían un modelo mental más fuerte del sistema y trabajaban más lento, así que el cambio no era tan brusco.
Los modelos de coding tienden mucho a tomar atajos que rompen la encapsulación o a copiar código que no debería duplicarse.
En proyectos grandes no se puede esperar varios minutos cada vez que se ejecutan pruebas o se revisan errores semánticos, así que el tiempo de build es claramente un cuello de botella.
No tanto porque apoye fuertemente la AI, sino porque como arte conceptual o experimento sería interesante ver cómo evolucionan de forma distinta los dos proyectos.
Link: https://ziggit.dev/t/cruller-buns-zig-runtime-continued-on-z...
Discusión en HN: https://news.ycombinator.com/item?id=49017344
https://nubjs.com
No hay problema en combinar herramientas específicas para cada propósito, pero es muy cómodo que en el estado por defecto todos los problemas estén resueltos. El bundler de Bun también tiene una API de runtime, así que el mismo proceso que sirve assets puede hacer bundling directamente en memoria sin coordinarse con un bundler externo ni escribir archivos estáticos en disco.