JavaScript-Engine: V8 bekommt in Version 8.4 schwache Referenzen
Das aktuelle Release führt mit Weak References und zugehörigen Finalizers Neuerungen ein, die bisher nur als Vorschläge für ECMAScript existieren.
![JavaScript-Engine: V8 führt in Version 8.4 Weak References ein](https://heise.cloudimg.io/width/610/q85.png-lossy-85.webp-lossy-85.foil1/_www-heise-de_/imgs/18/2/9/2/1/0/5/3/shutterstock_1473070031-d97443280705da78.jpeg)
(Bild: alphaspirit/Shutterstock.com)
Google hat Version 8.4 der JavaScript-Engine V8 veröffentlicht. Das Release bringt zwei syntaktische Neuerungen mit, die noch nicht in ECMAScript enthalten sind: Weak References und passend dazu Callbacks, die die Engine beim Aufräumen der Objekte ausführt. Außerdem soll der integrierte Baseline-Compiler die Startzeiten von WebAssembly-Code optimieren.
Der V8-Compiler Liftoff, den das V8-Team 2018 integriert hatte, unterstützt nun atomare Anweisungen (Atomic Instructions) und Massenspeicher-Operationen (Bulk Memory Operations), die C-Fuktionen wie memcpy
nachempfunden sind. Beide Neuerungen sollen vor allem die Startzeit von Anwendungen deutlich reduzieren.
Das kann weg!
Bisher kennt JavaScript im Gegensatz zu anderen Programmiersprachen wie Java, C#, Python oder PHP keine Weak References. Die einzigen Ausnahmen sind die Collections WeakMap und WeakSet. Für generelle schwache Referenzen existiert allerdings bereits ein zugehöriges Proposal beim TC39-Komitee zur Aufnahme in ECMAScript. V8 greift dem Vorschlag vor und führt das Sprachelement WeakRef
ein.
Entwickler können Elemente damit als schwach referenziert deklarieren. Üblicherweise gelten alle Referenzen als stark, und jede Strong Reference auf ein Objekt verhindert, dass der Garbage Collector (GC) es aufräumt. Wenn jedoch ausschließlich Weak References auf ein Objekt existieren, darf der GC es entfernen.
Sauberer Abgang
Als Nebeneffekt ist das Verhalten damit nicht deterministisch, da sich nicht vorhersagen lässt, wann und ob ein Objekt verschwindet. Das neue Callback FinalizationRegistry
dient dazu, auf das Aufräumen des betroffenen Objekts zu reagieren. Folgendes Beispiel aus dem V8-Blog zeigt den Einsatz mit einer Ausgabe der Antwort auf die Frage nach dem Leben, dem Universum und dem ganzen Rest auf der Konsole:
const registry = new FinalizationRegistry((heldValue) => {
console.log(heldValue);
});
(function () {
const garbage = {};
registry.register(garbage, 42);
// The second argument is the "held" value which gets passed
// to the finalizer when the first argument is garbage collected.
})();
Die Finalizers laufen in der Event-Schleife und unterbrechen den synchronen Ablauf der JavaScript-Programme nicht. V8 führt geplante ECMAScript-Features häufiger im Vorfeld ein. So brachte die achte Hauptversion bereits im Dezember 2019 Optional Chaining und den Nullish-Coalescing-Operator mit.
Beta bis Chrome 84
Weitere Neuerungen in Version 8.4 der JavaScript-Engine wie die Verbesserungen beim Debugging lassen sich dem V8-Blog entnehmen. Eine detaillierte Erklärung zur Motivation und dem Einsatz von Weak References findet sich in einem Blogbeitrag von 2019. Wie üblich hat das Release der JavaScript-Engine Beta-Status, bis die zugehörige Chrome-Version 84 als stabiles Release erscheint. Eine Anleitung, wie Entwickler auf das Git-Repository zugreifen können, findet sich in der V8-Dokumentation. Außerdem ist die aktuelle Engine in der Beta zu Chrome 84 enthalten, die Google über den Chrome-Beta-Channel bereitstellt.
(rme)