Dev News Daily ENDE

Node.js 27 Alpha nutzt V8 15.6 mit Math.sumPrecise, Iterator.zip und geänderter Sortierung

Das Node.js-Projekt hat einen Überblick über die V8-Änderungen in der Alpha-Version von Node.js 27 veröffentlicht, die die Engine von Version 14.6 aus Node.js 26 auf 15.6 hebt. Der Beitrag von Joyee Cheung weist darauf hin, dass Node.js im neuen Release-Zyklus mit Alpha-Phase während Alpha und Current brechende V8-Änderungen übernehmen kann, mit einer Erhöhung von NODE_MODULE_VERSION, sobald sich die ABI für native Addons ändert; ab LTS soll die V8-Version stabil bleiben.

Standardmäßig neu sind unter anderem Math.sumPrecise, das ein Iterable mit weniger aufsummiertem Gleitkommafehler addiert, sodass 0,1, 0,2 und 0,3 zusammen 0,6 statt 0,6000000000000001 ergeben, der Getter Intl.Locale.prototype.variants sowie die Iterator-Methoden join, includes, Iterator.zip und Iterator.zipKeyed. Import von Bytes und RegExp-Puffergrenzen stehen hinter Flags.

Folgen für bestehenden Code hat eine Liste von Verhaltensänderungen. Einige Math-Methoden nutzen nun libm aus LLVM, Ergebnisse können sich im letzten Bit unterscheiden: Math.log(3) liefert 1.0986122886681098 statt 1.0986122886681096. Math.random mit festem --random-seed liefert eine andere Folge. Date.prototype.getTimezoneOffset wird für historische Daten nicht mehr auf ganze Minuten gekürzt. Array.prototype.sort nutzt für größere Arrays PowerSort statt TimSort; die Sortierung bleibt stabil, aber das Beispiel im Beitrag ruft den Vergleicher 19.249 statt 19.220 Mal auf. Außerdem sucht error.stack den Stack nicht mehr über die Prototypkette.

Node.js 27 Alpha nutzt V8 15.6 mit Math.sumPrecise, Iterator.zip und geänderter Sortierung
Node.js 27 Alpha nutzt V8 15.6 mit Math.sumPrecise, Iterator.zip und geänderter Sortierung — Dev News Daily

Was das bedeutet

Für Anwendungscode ist das meiste unsichtbar. Bei Tests ist es anders: festgeschriebene Gleitkommawerte, Zufallsfolgen mit Seed oder gezählte Vergleicheraufrufe schlagen unter 27 fehl, ohne dass ein Fehler eingebaut wurde.