Experimentelle Unterstützung für WebAssembly in V8
Für einen umfassenden Überblick über WebAssembly und einen Fahrplan für die zukünftige Zusammenarbeit in der Community, siehe Ein Meilenstein für WebAssembly auf dem Mozilla Hacks Blog.
Seit Juni 2015 arbeiten Mitarbeiter von Google, Mozilla, Microsoft, Apple und der W3C WebAssembly Community Group intensiv daran, WebAssembly zu entwerfen, spezifizieren und zu implementieren (1, 2, 3, 4). WebAssembly ist ein neues Laufzeitsystem und ein Kompilierungsziel für das Web. WebAssembly ist ein niedrigstufiger, portabler Bytecode, der in einem kompakten Binärformat kodiert ist und mit einer nahezu nativen Geschwindigkeit in einer speichersicheren Sandbox ausgeführt wird. Als Weiterentwicklung bestehender Technologien ist WebAssembly eng in die Webplattform integriert und schneller im Herunterladen über das Netzwerk sowie schneller in der Initialisierung als asm.js, ein niedrigstufiger Subset von JavaScript.
Ab heute ist experimentelle Unterstützung für WebAssembly in V8 und Chromium hinter einem Flag verfügbar. Um es in V8 auszuprobieren, führen Sie Version 5.1.117 oder höher von d8
in der Befehlszeile mit dem Flag --expose_wasm
aus oder aktivieren Sie das Experimentelle WebAssembly-Feature unter chrome://flags#enable-webassembly
in Chrome Canary 51.0.2677.0 oder höher. Nach dem Neustart des Browsers steht ein neues Wasm
-Objekt aus dem JavaScript-Kontext zur Verfügung, das eine API bietet, um WebAssembly-Module zu initialisieren und auszuführen. Dank der Bemühungen von Mitarbeitern bei Mozilla und Microsoft laufen zwei kompatible Implementierungen von WebAssembly ebenfalls hinter einem Flag in Firefox Nightly und in einem internen Build von Microsoft Edge (demonstriert in einem Video-Screencapture).
Die Website des WebAssembly-Projekts verfügt über eine Demo, die die Nutzung der Laufzeit in einem 3D-Spiel zeigt. In Browsern, die WebAssembly unterstützen, lädt und initialisiert die Demoseite ein Wasm-Modul, das WebGL und andere Webplattform-APIs verwendet, um ein interaktives Spiel zu rendern. In anderen Browsern wechselt die Demoseite zu einer asm.js-Version desselben Spiels.
Unter der Haube ist die WebAssembly-Implementierung in V8 darauf ausgelegt, einen Großteil der bestehenden Infrastruktur der JavaScript-VM wiederzuverwenden, insbesondere den TurboFan-Compiler. Ein spezialisierter WebAssembly-Decoder validiert Module, indem er Typen, lokale Variablenindizes, Funktionsreferenzen, Rückgabewerte und Kontrollflussstrukturen in einem Durchgang überprüft. Der Decoder erzeugt einen TurboFan-Graphen, der durch verschiedene Optimierungsschritte verarbeitet und schließlich mit demselben Backend in Maschinencode umgewandelt wird, das auch Maschinencode für optimiertes JavaScript und asm.js erzeugt. In den nächsten Monaten wird sich das Team darauf konzentrieren, die Startzeit der V8-Implementierung durch Optimierung des Compilers, Parallelisierung und Verbesserungen der Kompilierungsrichtlinien zu verkürzen.
Zwei bevorstehende Änderungen werden auch die Entwicklererfahrung erheblich verbessern. Eine standardisierte textuelle Darstellung von WebAssembly wird es Entwicklern ermöglichen, den Quellcode eines WebAssembly-Binärformats wie jedes andere Web-Skript oder jede andere Web-Ressource zu betrachten. Zusätzlich wird das derzeitige Platzhalterobjekt Wasm
neugestaltet, um eine stärker leistungsfähige und idiomatische Menge von Methoden und Eigenschaften bereitzustellen, die das Initialisieren und Untersuchen von WebAssembly-Modulen aus JavaScript ermöglichen.