用于执行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 {//读取WebAssembly字节。
byte [] bytes = Files.readAllBytes(Paths.get(“ simple.wasm”)); //实例化WebAssembly模块。
实例实例=新实例(字节);//获取`sum`导出函数,并通过传递5和37进行调用,并获得结果。
整数结果=(整数)instance.exports.getFunction(“ sum”)。apply(5,37)[0]; 断言结果== 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可以实现接近本地的性能,并优化加载时间,同时最重要的是,它可以作为现有代码库的编译目标。