GeezerVisonThe World Wide Web, restored to 800 pixels of glory. |
| Home|About|Gaming cabinet|Archives|How it works|Starter sites |
GeezerVison is showing developer.mozilla.org — Verwendung der WebAssembly JavaScript API - WebAssembly | MDN Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.
Verwendung der WebAssembly JavaScript APIDieser Artikel lehrt Sie, wie Sie die wichtigsten Funktionen der WebAssembly JavaScript API nutzen, einschließlich des Ladens von Wasm-Modulen und der Manipulation von WebAssembly-Speichern, -Tabellen und -Globalen. Hinweis: Wenn Sie mit den grundlegenden Konzepten, die in diesem Artikel erwähnt werden, nicht vertraut sind und eine ausführlichere Erklärung benötigen, lesen Sie zunächst WebAssembly-Konzepte und kehren Sie dann zurück. Laden von Wasm-Modulen in JavaScriptLassen Sie uns einige Beispiele durchgehen, die erklären, wie die WebAssembly JavaScript API verwendet wird und wie damit ein Wasm-Modul in eine Webseite geladen wird. Hinweis: Sie finden den Beispielcode in unserem webassembly-examples GitHub-Repo. Vorbereitung des Beispiels
Streaming des WebAssembly-ModulsNeu in Firefox 58 ist die Fähigkeit, WebAssembly-Module direkt aus zugrunde liegenden Quellen zu kompilieren und zu instanziieren. Dies wird mit den Methoden Dieses Beispiel (siehe unser instantiate-streaming.html-Demo auf GitHub und ansehen Sie es live) zeigt, wie Fügen Sie das Folgende zu Ihrem Skript unter dem ersten Block hinzu: js Das Endergebnis ist, dass wir unsere exportierte WebAssembly-Funktion Hinweis: Dies ist ein verworrenes, langatmiges Beispiel, das sehr wenig erreicht, aber es dient dazu, zu veranschaulichen, was möglich ist — die Verwendung von WebAssembly-Code zusammen mit JavaScript in Ihren Webanwendungen. Wie wir anderswo gesagt haben, beabsichtigt WebAssembly nicht, JavaScript zu ersetzen; die beiden können stattdessen zusammenarbeiten und aufeinander aufbauen. Laden unseres Wasm-Moduls ohne StreamingWenn Sie die oben beschriebenen Streaming-Methoden nicht verwenden können oder wollen, können Sie stattdessen die nicht-Streaming-Methoden Diese Methoden greifen nicht direkt auf den Bytecode zu, daher ist ein zusätzlicher Schritt erforderlich, um die Antwort vor dem Kompilieren/Instanziieren des Wasm-Moduls in einen Der entsprechende Code würde folgendermaßen aussehen: js Anzeigen von Wasm in den Entwickler-ToolsIn Firefox 54+ hat das Developer Tool Debugger Panel die Funktion, die textuelle Darstellung eines beliebigen Wasm-Codes, der in eine Webseite eingeschlossen ist, offenzulegen. Um es anzuzeigen, können Sie zum Debugger-Panel gehen und auf den Eintrag "wasm://" klicken.
Zusätzlich zur Ansicht von WebAssembly als Text können Entwickler WebAssembly mit dem Textformat debuggen (Haltepunkte setzen, den Callstack inspizieren, Schritt-für-Schritt-Durchführung usw.). SpeicherIm Low-Level-Speichermodell von WebAssembly wird der Speicher als ein zusammenhängender Bereich von ungetypten Bytes bezeichnet, der als Linear Memory bezeichnet wird und durch Lade- und Speicherbefehle innerhalb des Moduls gelesen und geschrieben wird. In diesem Speichermodell kann jeder Ladevorgang oder Speicherzugriff auf jedes Byte im gesamten linearen Speicher zugreifen, was notwendig ist, um C/C++-Konzepte wie Zeiger treu zu repräsentieren. Im Gegensatz zu einem nativen C/C++-Programm, bei dem der verfügbare Speicherbereich den gesamten Prozess umfasst, ist der Speicher, auf den eine bestimmte WebAssembly-Instanz zugreifen kann, auf einen spezifischen — möglicherweise sehr kleinen — Bereich beschränkt, der von einem WebAssembly-Memory-Objekt enthalten ist. Dies ermöglicht es einer einzelnen Web-App, mehrere unabhängige Bibliotheken zu verwenden — von denen jede intern WebAssembly verwendet —, um separate Speicher zu haben, die vollständig voneinander isoliert sind. Darüber hinaus können neuere Implementierungen auch geteilte Speicher erstellen, die zwischen Window- und Worker-Kontexten über In JavaScript kann eine Memory-Instanz als ein skalierbarer Lassen Sie uns dies anhand eines kurzen Beispiels erkunden.
Speicher vergrößernEine Speicherinstanz kann durch Aufrufe an js Wenn beim Erstellen der Speicherinstanz ein Maximalwert angegeben wurde, führen Versuche, diesen Maximalwert zu überschreiten, zu einer
Genau wie Funktionen können lineare Speicher innerhalb eines Moduls definiert oder importiert werden. Ebenso kann ein Modul optional auch seinen Speicher exportieren. Dies bedeutet, dass JavaScript Zugriff auf den Speicher einer WebAssembly-Instanz erhalten kann, entweder indem es ein neues Ein umfassenderes SpeicherbeispielLassen Sie uns die obigen Aussagen verdeutlichen, indem wir uns ein ausführlicheres Speicherbeispiel ansehen — ein WebAssembly-Modul, das die von uns zuvor definierte Speicherinstanz importiert, sie mit einem Array von Ganzzahlen befüllt und dann deren Summe berechnet. Sie finden dies unter memory.wasm.
Beachten Sie, wie wir das Memory-Imports funktionieren genauso wie Funktions-Imports, nur dass Memory-Objekte als Werte und nicht als JavaScript-Funktionen übergeben werden. Memory-Imports sind aus zwei Gründen nützlich:
Hinweis: Sie können unser komplettes Demo unter memory.html (sehen Sie es auch live) finden. TabellenEine WebAssembly-Tabelle ist ein skalierbares typisiertes Array von Referenzen auf das sowohl JavaScript als auch WebAssembly-Code zugreifen kann. Während Memory ein skalierbares typisiertes Array von Rohbytes bereitstellt, ist es unsicher, wenn Referenzen in einem Memory gespeichert werden, da eine Referenz ein von der Engine vertrauter Wert ist, dessen Bytes nicht direkt von Inhalten gelesen oder geschrieben werden dürfen, aus Sicherheits-, Portabilitäts- und Stabilitätsgründen. Tabellen haben einen Elementtyp, der die Arten von Referenzen begrenzt, die in der Tabelle gespeichert werden können. In der aktuellen Iteration von WebAssembly gibt es nur einen Typ von Referenzen, den WebAssembly-Code benötigt — Funktionen — und daher nur einen gültigen Elementtyp. In zukünftigen Iterationen werden weitere Elementtypen hinzugefügt. Funktionsreferenzen sind notwendig, um Sprachen wie C/C++ zu kompilieren, die Funktionszeiger haben. In einer nativen Implementierung von C/C++ wird ein Funktionszeiger durch die Rohadresse des Funktionscodes im virtuellen Adressraum des Prozesses dargestellt, und daher kann er aus den oben genannten Sicherheitsgründen nicht direkt im linearen Speicher gespeichert werden. Stattdessen werden Funktionsreferenzen in einer Tabelle gespeichert, und ihre Indizes, die Ganzzahlen sind und im linearen Speicher gespeichert werden können, werden stattdessen herumgereicht. Wenn die Zeit kommt, einen Funktionszeiger zu rufen, liefert der WebAssembly-Aufrufer den Index, der dann gegen die Tabelle abgegrenzt überprüft werden kann, bevor sie indiziert und die indizierte Funktionsreferenz aufgerufen wird. So gesehen, sind Tabellen derzeit ein recht primitives Mittel, um Features von Low-Level-Programmiersprachen sicher und portabel zu kompilieren. Tabellen können über Ein TabellenbeispielLassen Sie uns ein einfaches Tabellenbeispiel betrachten — ein WebAssembly-Modul, das eine Tabelle mit zwei Elementen erstellt und exportiert: Element 0 gibt 13 zurück, und Element 1 gibt 42 zurück. Sie finden dies unter table.wasm.
Dieser Code greift auf jede Funktionsreferenz zu, die in der Tabelle gespeichert ist, und instanziiert sie, um die Werte, die sie enthalten, in die Konsole auszugeben — beachten Sie, wie jede Funktionsreferenz mit einem Hinweis: Sie können unser komplettes Demo unter table.html (sehen Sie es auch live) finden. GlobalenWebAssembly hat die Fähigkeit, globale Variableninstanzen zu erstellen, die sowohl aus JavaScript heraus zugänglich sind als auch über eine oder mehrere Um eine globale WebAssembly-Instanz von innerhalb Ihres JavaScripts zu erstellen, verwenden Sie den js Sie sehen, dass dies zwei Parameter annimmt:
Wie verwenden wir dies? Im folgenden Beispiel definieren wir eine globale Variable als veränderbaren Der Wert der globalen Variable wird dann geändert, zuerst auf js Hinweis: Sie können das Beispiel live auf GitHub ausführen; sehen Sie auch den Quellcode. MultiplizitätNachdem wir nun die Verwendung der wichtigsten WebAssembly-Bausteine demonstriert haben, ist dies ein guter Ort, um das Konzept der Multiplizität zu erwähnen. Dies bietet WebAssembly eine Vielzahl von Fortschritten in Bezug auf architektonische Effizienz:
Sie können die Multiplizität in Aktion in unserem Artikel über das Verstehen des Textformats sehen — siehe den Abschnitt Mutierende Tabellen und dynamische Verlinkung. ZusammenfassungDieser Artikel führte Sie durch die Grundlagen der Verwendung der WebAssembly JavaScript API zur Einbindung eines WebAssembly-Moduls in einen JavaScript-Kontext und die Nutzung seiner Funktionen sowie der Verwendung von WebAssembly-Speicher und -Tabellen in JavaScript. Wir haben auch das Konzept der Multiplizität angesprochen. Siehe auchHelp improve MDN |
| You are visitor 01402503 — GeezerVison does not store the pages you look up. Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required. |