- Buz ist ein früher Fork, der auf dem Commit direkt vor Buns Rust-Neuschreibung basiert und als kompatibler Ersatz auf Basis von aktuellem Zig entwickelt wird
- Der gesamte Build-Graph, einschließlich der vendored JavaScriptCore-Quellen, wurde nach
build.zigverlagert; mit kleinen Patches an Zig werden inkrementelle Builds unter 1 Sekunde erreicht - Tests für neue Features und Bugfixes aus der Rust-Version von Bun wurden übernommen, doch viele Tests schlagen noch fehl; Upstream-Features und Änderungen an JavaScriptCore müssen weiter nachgezogen werden
- Mehr als 11.000 Zeilen ungenutzter Code wurden entfernt; bei der Modernisierung einiger Implementierungen hin zur Zig-Standardbibliothek wurden auch mehrere Bugs behoben
- Noch nicht für den Produktionseinsatz geeignet; langfristiges Ziel ist es, mithilfe von LLMs und menschlicher Aufsicht technische Schulden abzubauen und danach eine auch ohne LLM gut wartbare Codebasis zu schaffen
Projektziel und Entwicklungsstand
- Buz ist ein in Entwicklung befindlicher Fork, der auf dem letzten Commit basiert, bevor Bun in Rust neu geschrieben wurde
- Der Fokus liegt darauf, einen mit Bun kompatiblen Ersatz und zugleich eine aufgeräumtere Codebasis zu schaffen
- Die Entwicklung befindet sich in einem sehr frühen Stadium; Buz ist nicht bereit für den Produktionseinsatz
- Buz wurde veröffentlicht, um doppelte Entwicklungsarbeit zu vermeiden, da bereits ein ähnliches Zig-basiertes Bun-Projekt auf Ziggit öffentlich gemacht wurde
- Zum Zeitpunkt der Veröffentlichung war dieses Projekt noch nicht geprüft worden
Portierung auf aktuelles Zig und inkrementelle Builds
- Bun wurde auf das aktuelle Upstream-Zig portiert; für inkrementelle Rebuilds wurden kleine Patches an Zig angewendet
- Der gesamte Build-Graph, einschließlich der vendored Quellen von JavaScriptCore, wurde in
build.zigintegriert - Mit dieser Konfiguration sinkt die Zeit für inkrementelle Builds auf unter 1 Sekunde, wodurch sich Entwicklungszyklen beschleunigen
- Das Projekt enthält ein Zig-
master-Submodul mit angewendetem Patch für inkrementelle Builds - Auch mit dem damaligen Upstream-Zig-Commit
2b1c663lässt sich das Projekt erfolgreich bauen
Kompatibilitätstests und Upstream-Tracking
- Tests aus der Rust-Version von Bun wurden übernommen, darunter viele Tests zur Verifikation neuer Features und Bugfixes
- Viele Tests bestehen noch nicht, daher muss Buz weiter zum Bun-Upstream aufschließen
- Parallel dazu werden die Funktionskompatibilität gewahrt, der Code aufgeräumt und technische Schulden reduziert
- Auch Änderungen an JavaScriptCore müssen fortlaufend verfolgt werden
Aufräumen und Modernisieren der Codebasis
- Mehr als 11.000 Zeilen Code, der in Bun überhaupt nicht genutzt wurde, wurden entfernt
- Teile des Codes wurden neu geschrieben und modernisiert, mit stärkerer Nutzung der Zig-Standardbibliothek
- Im Zuge des Aufräumens und der Modernisierung wurden außerdem mehrere Bugs behoben
- Die bestehende Bun-Codebasis umfasst rund 600.000 Zeilen; um einen aufgeräumten Zustand zu erreichen, müssten nach Einschätzung des Projekts zahlreiche Subsysteme neu geschrieben werden
LLM-Nutzung und Beitragsrichtlinie
- Um komplexen bestehenden Code aufzuräumen, sollen LLMs umfangreich eingesetzt werden, jedoch zusammen mit menschlicher Aufsicht und besseren Entwicklungspraktiken
- Von Menschen direkt geschriebene Beiträge sollen nicht angenommen werden, bis die Codebasis als ausreichend aufgeräumt gilt
- Priorität haben der Abbau technischer Schulden und idiomatischer Zig-Code; Ziel ist eine Codebasis, die innerhalb von Wochen oder Monaten als kompatibler Ersatz für Rust Bun 1.4.0 veröffentlicht werden kann
- Um Unterstützung von Entwicklern, die Sol oder Fable nutzen können, wird gebeten
- Langfristig soll eine Codebasis entstehen, die auch ohne Hilfe von LLMs leicht wartbar ist; zugleich sollen im Entwicklungsprozess die Zig-Kenntnisse verbessert werden
1 Kommentare
Hacker-News-Meinungen
Zwar unterstützt Zigs inkrementelle Kompilierung noch kein aarch64, und Binary-Patching ist nur mit dem Linux-Linker möglich, aber die Unterstützung der wichtigsten Plattformen scheint nur eine Frage der Zeit zu sein.
Dass ein Ein-Personen-Team Builds in 1 Sekunde erreicht hat, zeigt, dass die langsamen Builds das Ergebnis nachlässiger Entwicklungspraxis waren und dass die Zeit in den Fork zu stecken eine völlig falsche Ressourcenverteilung war.
Letztlich klingt das danach, mehr oder besser anweisen zu wollen. Codestruktur scheint auch Geschmackssache zu sein; gestern hatte ich ein absurdes Gespräch mit einem Freund, der darauf beharrte, dass man vier Backend-Prozesse brauche, um eine einzige HTTP-Anfrage zu verarbeiten.
Ich sehe die Phase, in der Menschen eingreifen, von Anfang an als Übergangsphase.
Ich frage mich, ob das in großen Projekten üblich ist und ich es nur nicht wusste.
Unklar ist, ob es offensichtlicher Code wie
if (false) { dead_code(); }ist oder Code, der über dynamisches Dispatching möglich wäre, logisch aber nie aufgerufen werden kann. Im ersten Fall wären 1,8 % viel, im zweiten vielleicht wenig; in vielen Projekten sammelt sich hinter alten Feature-Flags Code an, der praktisch nie wieder ausgeführt wird.Kleine Mengen toten Codes, etwa einfache Utilities oder generierter Code, kann man stehen lassen; manchmal führt das Entfernen aber zu Ketten aus Löschungen und Vereinfachungen.
Streng genommen war das kein toter Code, aber wenn man eine kleine falsche Abstraktion bereinigt, öffnen sich nacheinander weitere Aufräummöglichkeiten, und am Ende bleibt Software übrig, die nur noch das tut, was sie soll. Codebasen blähen sich mit der Zeit auf; bei Buns Größe finde ich eher überraschend, dass nur 11.000 Zeilen gefunden wurden.
In der Tick-Phase fügt man schnell Features hinzu und erzeugt eine korrekte, aber extrem unordentliche Version; in der Tock-Phase verdaut und bereinigt man das Ergebnis und verbessert Performance, Wartbarkeit und Änderungsrobustheit.
Man baut an einem Tag per Vibe Coding eine funktionierende App und verbringt dann eine Woche damit, daraus ein Projekt zu machen, dem man weiter Features hinzufügen kann, ohne dass es wie ein Kartenhaus zusammenfällt. Vor AI war es ähnlich, aber professionelle Entwickler hatten ein stärkeres mentales Modell des Systems und arbeiteten langsamer, sodass der Wechsel nicht so abrupt war.
Coding-Modelle neigen stark dazu, Abkürzungen zu nehmen, die Kapselung brechen, oder Code zu kopieren, der nicht dupliziert werden sollte.
In großen Projekten kann man nicht jedes Mal mehrere Minuten warten, wenn man Tests ausführt oder semantische Fehler prüft; Build-Zeit ist eindeutig ein Flaschenhals.
Nicht weil ich AI besonders stark befürworte, sondern eher als Konzeptkunst oder Experiment; es wäre interessant zu sehen, wie sich die beiden Projekte unterschiedlich entwickeln.
Link: https://ziggit.dev/t/cruller-buns-zig-runtime-continued-on-z...
HN-Diskussion: https://news.ycombinator.com/item?id=49017344
https://nubjs.com
Zweckgebundene Tools zu kombinieren ist nicht per se ein Problem, aber es ist sehr bequem, wenn im Ausgangszustand alle Probleme gelöst sind. Buns Bundler hat auch Runtime-APIs, sodass derselbe Prozess, der Assets ausliefert, direkt im Speicher bundlen kann, ohne mit einem externen Bundler zu koordinieren oder statische Dateien auf die Festplatte zu schreiben.