WebAssemblyのGraalVM実装
GraalVMでは、WebAssemblyにコンパイルされたプログラムを実行できます。WebAssemblyコードをバイナリ形式で解釈してコンパイルしたり、他のプログラムに埋め込むことができます。WebAssemblyのサポートは、開発の初期段階にあります。
スタート・ガイド
GraalVM for JDK 21では、GraalVM WebAssemblyランタイム(Wasmと呼ばれる)をスタンドアロン・ディストリビューションとして使用できます。Oracle GraalVMまたはGraalVM Community Editionに基づいてスタンドアロンをダウンロードできます。
- ご使用のオペレーティング・システム用のWasm 23.1スタンドアロンをダウンロードします:
- ネイティブ・スタンドアロン
- JVMスタンドアロン
-
アーカイブを解凍します:
ノート: macOS Catalina以降を使用している場合は、隔離属性を削除する必要があります:
sudo xattr -r -d com.apple.quarantine <archive>.tar.gz
抽出:
tar -xzf <archive>.tar.gz
- スタンドアロンには、ネイティブ・ランチャに加えてJVMが付属しています。バージョンをチェックして、GraalVM WebAssemblyランタイムがアクティブであることを確認します。
./path/to/bin/wasm --version
WebAssemblyプログラムの実行
GraalVM上のWebAssemblyにコンパイルする言語で記述されたプログラムを実行できます。たとえば、floyd.cという名前のファイルに次のCプログラムを入れます:
#include <stdio.h>
int main() {
int number = 1;
int rows = 10;
for (int i = 1; i <= rows; i++) {
for (int j = 1; j <= i; j++) {
printf("%d ", number);
++number;
}
printf(".\n");
}
return 0;
}
最新のEmscriptenコンパイラのフロントエンド・バージョンを使用してコンパイルします。現在の作業ディレクトリにスタンドアロンfloyd.wasmファイルが生成されます:
emcc -o floyd.wasm floyd.c
次に、コンパイルしたWebAssemblyバイナリをGraalVMで次のように実行できます:
wasm --Builtins=wasi_snapshot_preview1 floyd.wasm
この例では、フラグ--Builtins
は、Emscriptenツールチェーンに必要な組込みモジュールを指定します。
WebAssemblyプログラムの埋込み
コンパイルされたWebAssemblyバイナリ・コードには、GraalVMポリグロットAPIを使用してプログラムでアクセスできます。これにより、GraalVM WebAssemblyをユーザー・プログラムに埋め込むことができます。JavaアプリケーションからWebAssemblyコードをコールする方法の簡単な例を次に示します:
import org.graalvm.polyglot.*;
import org.graalvm.polyglot.io.ByteSequence;
//Load the WASM contents into a byte array
byte[] binary = readBytes("example.wasm");
Context.Builder contextBuilder = Context.newBuilder("wasm");
Source.Builder sourceBuilder = Source.newBuilder("wasm", ByteSequence.create(binary), "example");
Source source = sourceBuilder.build();
Context context = contextBuilder.build();
context.eval(source);
Value mainFunction = context.getBindings("wasm").getMember("main").getMember("_start");
mainFunction.execute();
ポリグロットの例については、言語の埋込みガイドを参照してください。