用于執行 WebAssembly 二進制程序的Wasmer 公開了目前業內首個支持WebAssembly 的Java 擴展庫 Wasmer JNI。
根據介紹,此次開源出來的 Wasmer JNI 的特性包括:
•易于使用:API 模仿標準的 WebAssembly API
•快:極盡可能運行 WebAssembly 模塊
•安全:對 WebAssembly 的所有調用完全安全并且沙箱化隔離
Wasmer JNI 庫為不同平臺生成 JAR 包,目前支持:
•amd64-darwin:macOS、x86 64
•amd64-linux:Linux、x86 64
•amd64-windows:Windows、x86 64位
同時開發者可以為自己的平臺和架構生成自己的 JAR。
性能方面,由于 Wasmer JNI 是首個執行 WebAssembly 的 Java 庫,因此無法與 Java 生態中的其它項目作比較,但是,不過因為 Wasmer 自身的設計上有優勢,它帶有 3 個后端:Singlepass、Cranelift 與 LLVM,Wasmer JNI 庫目前使用 Cranelift 后端,這在編譯時間和執行時間之間提供了最佳折衷方案。Wasmer 在 WebAssembly 服務器運行時領域居于領先地位,去年獲得了InfoWorld 2019 年最佳開源軟件獎。
來看一個從 Java 調用 WebAssembly 的 demo:
從一個簡單的 Rust 程序入手,將其編譯為 WebAssembly,然后從 Java 執行。
#[no_mangle]pub extern fn sum(x: i32, y: i32) -> i32 { x + y}
編譯為 WebAssembly 后,得到一個名為simple.wasm 的文件。
接著 Java 程序通過傳遞 5 和 37 這兩個參數來執行 sum 函數:
import org.wasmer.Instance;import java.io.IOException;import java.nio.file.Files;import java.nio.file.Paths;class SimpleExample { public static void main(String[] args) throws IOException { // Read the WebAssembly bytes.
byte[] bytes = Files.readAllBytes(Paths.get("simple.wasm")); // Instantiate the WebAssembly module.
Instance instance = new Instance(bytes); // Get the `sum` exported function, call it by passing 5 and 37, and get the result.
Integer result = (Integer) instance.exports.getFunction("sum").apply(5, 37)[0]; assert result == 42; instance.close(); }}
可以看到,Wasmer JNI 的API 與標準 JavaScript API 非常相似。
WebAssembly也叫 WASM,它是為基于棧的虛擬機設計的二進制指令格式,WASM作為可移植目標,用于編譯高級語言(如 C/C++/Rust),從而可以在Web 上部署高性能客戶端和服務器應用,同時它也可以在許多其它環境中使用。
WebAssembly 描述了一種內存安全的沙箱執行環境,該環境甚至可以在現有 JavaScript 虛擬機內部實現。當嵌入到 Web 中時,WebAssembly 將強制執行瀏覽器的同源和權限安全策略。
WASM 有多種實現,包括瀏覽器和獨立系統,它可以用于視頻和音頻編解碼器、圖形和 3D、多媒體和游戲、密碼計算或便攜式語言實現等應用。目前 Wasm 已經支持 Chrome、Firefox、Safari 與 Edge 瀏覽器。
對于 Web 來說,因為其虛擬指令集設計,WebAssembly 可讓加載的頁面以本地編譯代碼運行,從而可以提高Web 性能。換句話說,WebAssembly 可以實現接近本地的性能,并且優化加載時間,同時最重要的是,它可以作為現有代碼庫的編譯目標。