Arbeit mit WebAssembly und Java: Fortgeschrittenes Niveau

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Arbeiten mit WebAssembly und Java: Fortgeschrittenes Niveau



WebAssembly (Wasm) ist ein binäres Low-Level-Befehlsformat, das in der virtuellen Maschine eines Browsers ausgeführt wird. Für einen Java-Entwickler eröffnet Wasm neue Horizonte: das Verschieben von Berechnungsmodulen auf die Client-Seite, das Beschleunigen kritischer Codeabschnitte und das Erstellen plattformübergreifender Bibliotheken. In diesem Artikel werden wir fortgeschrittene Techniken zur Integration von Java mit WebAssembly untersuchen: von der Kompilierung über die Übergabe komplexer Datenstrukturen bis hin zum Performance-Profiling.



1. Kompilieren von Java-Code zu WebAssembly: Werkzeuge und Einrichtung



Die direkte Kompilierung von JVM-Bytecode zu Wasm ist eine nicht-triviale Aufgabe. Die wichtigsten Werkzeuge sind:

  • TeaVM — ein Compiler von Java zu JavaScript und WebAssembly. Unterstützt den Großteil von Java SE.
  • JWebAssembly — ein experimenteller Compiler, der Wasm direkt aus Java-Bytecode erzeugt.
  • GraalVM (wasm-Backend) — ermöglicht die Kompilierung von Java zu Wasm über Native Image, erfordert jedoch manuelle Konfiguration.


Beispiel für die Einrichtung eines Maven-Projekts mit TeaVM:



<dependency>    <groupId>org.teavm</groupId>    <artifactId>teavm-core</artifactId>    <version>0.9.2</version></dependency><dependency>    <groupId>org.teavm</groupId>    <artifactId>teavm-classlib</artifactId>    <version>0.9.2</version></dependency>


Build-Plugin:



<plugin>    <groupId>org.teavm</groupId>    <artifactId>teavm-maven-plugin</artifactId>    <version>0.9.2</version>    <configuration>        <targetDirectory>${project.build.directory}/wasm</targetDirectory>        <mainClass>com.example.MyWasmApp</mainClass>    </configuration></plugin>


Nach dem Build enthält der Ordner target/wasm die Dateien .wasm und .js — einen Wrapper zum Laden.



2. Aufrufen von Java-Funktionen aus JavaScript über Wasm



Das kompilierte Modul exportiert öffentliche statische Methoden. Betrachten wir eine einfache Klasse:



public class WasmMath {    public static int add(int a, int b) {        return a + b;    }

public static double multiply(double a, double b) { return a * b; }}


Nach der Kompilierung generiert TeaVM die Funktionen add und multiply. Aufruf aus JavaScript:



// Laden des Modulsconst wasmModule = await teaVM.wasm.load('MyWasmApp.wasm');

// Direkter Aufrufconst result = wasmModule.add(5, 7);console.log(result); // 12

const product = wasmModule.multiply(3.14, 2.0);console.log(product); // 6.28


Wichtig: TeaVM konvertiert automatisch Java-Primitivtypen in entsprechende Wasm-Typen (i32, f64). Für Zeichenketten und Arrays ist manuelles Marshalling erforderlich.



3. Übergeben komplexer Daten: Zeichenketten und Arrays



Wasm arbeitet nur mit Zahlen. Um Zeichenketten und Arrays zu übergeben, wird der lineare Speicher des Moduls verwendet. TeaVM bietet eine API für die Arbeit damit.



Beispiel: Eine Java-Methode, die eine Zeichenkette entgegennimmt und ihre Länge zurückgibt:



public class StringProcessor {    public static int stringLength(String s) {        return s.length();    }}


Aufruf aus JavaScript mit Kodierung der Zeichenkette in den Speicher:



const wasmModule = await teaVM.wasm.load('StringProcessor.wasm');

function callStringLength(str) { // Einen Zeiger auf die Zeichenkette im Wasm-Speicher holen const ptr = wasmModule.allocateString(str); const len = wasmModule.stringLength(ptr); wasmModule.freeString(ptr); // Speicher freigeben return len;}

console.log(callStringLength("Hallo, Wasm!")); // 12


Für primitive Arrays verwenden Sie allocateArr

Blogs

Buchempfehlungen