使用WebAssembly和Java:从A到Z

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

使用WebAssembly和Java:从A到Z



WebAssembly (Wasm) 是一种低级二进制指令格式,旨在浏览器和其他环境中执行。它允许运行用高级语言(C、C++、Rust、Go)编写的代码,性能接近原生。对于Java开发者来说,WebAssembly开辟了新的视野:现在JVM代码可以编译为Wasm,并在客户端、服务器环境或隔离环境中执行。在本文中,我们将探讨如何从Java使用WebAssembly,有哪些可用的工具,并研究实际示例。



什么是WebAssembly,Java开发者为什么需要它?



WebAssembly 是一种具有紧凑二进制代码表示的虚拟机。Wasm的主要优势:

  • 性能 — 执行接近原生。
  • 安全性 — 隔离的沙箱。
  • 可移植性 — 在浏览器、Node.js、服务器上运行。
  • 跨平台 — 在任何支持Wasm的地方运行。


对于Java开发者来说,Wasm在以下场景中很有用:

  • 将繁重计算从服务器转移到客户端(渲染、数据处理)。
  • 在Web应用程序中使用现有的Java库。
  • 创建高性能的插件和扩展。
  • 在JVM不可用的环境中运行Java代码(物联网、区块链)。


将Java编译为WebAssembly的工具



目前,有几种方法可以将Java代码转换为Wasm。让我们看看主要的几种。



GraalVM 和 AOT(提前编译)



GraalVM 是一个高性能虚拟机,支持将Java字节码编译为原生可执行文件。从22.0版本开始,GraalVM包含了对编译为WebAssembly的实验性支持。过程如下:

  1. 安装支持Wasm的GraalVM。
  2. 将Java类编译为Wasm模块。
  3. 在运行时环境(wasmtime、wasmer)中运行生成的.wasm文件。


编译简单Java类的示例:



// HelloWasm.javapublic class HelloWasm {    public static int add(int a, int b) {        return a + b;    }

public static void main(String[] args) { System.out.println("Result: " + add(5, 3)); }}


使用GraalVM编译为Wasm的命令:



javac HelloWasm.javanative-image --wasm --output=hello.wasm HelloWasm


之后,您将获得一个hello.wasm文件,可以运行它:



wasmtime hello.wasm# 输出:Result: 8


TeaVM 项目



TeaVM 是一个将Java字节码编译为JavaScript和WebAssembly的编译器。它专注于Web开发,并允许将Java类转换为Wasm模块。TeaVM支持大部分Java标准库,并且可以与Maven/Gradle一起使用。



在Maven项目中集成TeaVM的示例:



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


用于编译的Java代码:



import org.teavm.jso.JSBody;

public class Calculator { @JSBody(params = {"a", "b"}, script = "return a + b;") public static native int add(int a, int b);

public static void main(String[] args) { System.out.println(add(10, 20)); }}


TeaVM生成一个Wasm文件,可以将其连接到HTML页面。



CheerpJ 项目



CheerpJ 是一个商业产品,它将Java字节码

博客

书籍推荐