用于執(zhí)行 WebAssembly 二進制程序的Wasmer 公開了目前業(yè)內(nèi)首個支持WebAssembly 的Java 擴展庫 Wasmer JNI。
根據(jù)介紹,此次開源出來的 Wasmer JNI 的特性包括:
•易于使用:API 模仿標準的 WebAssembly API
•快:極盡可能運行 WebAssembly 模塊
•安全:對 WebAssembly 的所有調(diào)用完全安全并且沙箱化隔離
Wasmer JNI 庫為不同平臺生成 JAR 包,目前支持:
•amd64-darwin:macOS、x86 64
•amd64-linux:Linux、x86 64
•amd64-windows:Windows、x86 64位
同時開發(fā)者可以為自己的平臺和架構(gòu)生成自己的 JAR。
性能方面,由于 Wasmer JNI 是首個執(zhí)行 WebAssembly 的 Java 庫,因此無法與 Java 生態(tài)中的其它項目作比較,但是,不過因為 Wasmer 自身的設(shè)計上有優(yōu)勢,它帶有 3 個后端:Singlepass、Cranelift 與 LLVM,Wasmer JNI 庫目前使用 Cranelift 后端,這在編譯時間和執(zhí)行時間之間提供了最佳折衷方案。Wasmer 在 WebAssembly 服務(wù)器運行時領(lǐng)域居于領(lǐng)先地位,去年獲得了InfoWorld 2019 年最佳開源軟件獎。
來看一個從 Java 調(diào)用 WebAssembly 的 demo:
從一個簡單的 Rust 程序入手,將其編譯為 WebAssembly,然后從 Java 執(zhí)行。
#[no_mangle]pub extern fn sum(x: i32, y: i32) -> i32 { x + y}
編譯為 WebAssembly 后,得到一個名為simple.wasm 的文件。
接著 Java 程序通過傳遞 5 和 37 這兩個參數(shù)來執(zhí)行 sum 函數(shù):
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,它是為基于棧的虛擬機設(shè)計的二進制指令格式,WASM作為可移植目標,用于編譯高級語言(如 C/C++/Rust),從而可以在Web 上部署高性能客戶端和服務(wù)器應(yīng)用,同時它也可以在許多其它環(huán)境中使用。
WebAssembly 描述了一種內(nèi)存安全的沙箱執(zhí)行環(huán)境,該環(huán)境甚至可以在現(xiàn)有 JavaScript 虛擬機內(nèi)部實現(xiàn)。當嵌入到 Web 中時,WebAssembly 將強制執(zhí)行瀏覽器的同源和權(quán)限安全策略。
WASM 有多種實現(xiàn),包括瀏覽器和獨立系統(tǒng),它可以用于視頻和音頻編解碼器、圖形和 3D、多媒體和游戲、密碼計算或便攜式語言實現(xiàn)等應(yīng)用。目前 Wasm 已經(jīng)支持 Chrome、Firefox、Safari 與 Edge 瀏覽器。
對于 Web 來說,因為其虛擬指令集設(shè)計,WebAssembly 可讓加載的頁面以本地編譯代碼運行,從而可以提高Web 性能。換句話說,WebAssembly 可以實現(xiàn)接近本地的性能,并且優(yōu)化加載時間,同時最重要的是,它可以作為現(xiàn)有代碼庫的編譯目標。