博客 | 首席技术官办公室

WebAssembly 和 JVM 之间有什么区别?

奥斯卡·斯宾塞缩略图
奥斯卡·斯宾塞
发布于2025年6月11日

当敏锐的开发人员第一次接触 WebAssembly(简称 Wasm)时,会出现一个常见的问题: WebAssembly 与 Java虚拟机(JVM) 有何不同? 这是一个很好的问题——这两种技术都归结为同一个基本承诺:一种旨在“一次编写,随处运行”的可移植字节码。 虽然它们有着共同的核心基础,但它们的方法和目标却大相径庭。 探索这些区别可以揭示为什么两者都是独立的、重要的项目,拥有各自的生态系统。

概念差异

从本质上讲,JVM 和 WebAssembly 都被设计为在任何地方运行编译后的代码 —— 对于 JVM 来说,这意味着可以在具有不同操作系统或 CPU 架构的机器上运行,这在当时是前所未有的;而对于 WebAssembly 来说,这意味着可以在任何地方的任何计算机上的任何 Web 浏览器上运行。

JVM 于 20 世纪 90 年代中期与 Java 一起推出,现已发展成为一个成熟的平台,提供丰富的运行时支持 - 垃圾收集、广泛的标准库和托管执行工具。 然而,有些人可能会说这会导致 JVM 相当膨胀:占用大量内存并且启动时间较慢。 尽管功能极其强大,但这使得 JVM 不太适合轻量级应用。

相比之下,WebAssembly 的设计考虑到了 Web — 特别是用于在浏览器中运行代码。 因此,它的架构优先考虑轻量级运行时和闪电般快速的启动时间,但没有丰富的运行时支持。 仅针对浏览器会使 Wasm 的可移植性不如 Java 字节码,但如今,独立的 Wasm 运行时可以在 Web 之外运行,为服务器端应用、嵌入式系统和边缘计算打开了新的大门。 此外,WebAssembly 还将获得一些有限的额外运行时支持,即垃圾收集,但我们不太可能看到 JVM 提供的 WebAssembly 的全部运行时支持。

互操作性

JVM 仅适用于其语言家族 - Java、Kotlin、Scala 以及其他一些语言 - 所有这些语言都是专门设计为在 JVM 上运行的。 虽然 Java 生态系统拥有广泛的库和框架,但互操作性仅发生在这些 JVM 语言之间。 基于 JVM 的应用可以调用本机代码,但这需要付出巨大的努力和谨慎。

WebAssembly 的设计目的并非仅支持一种编程语言或偏爱某种风格的语言,无论是函数式、垃圾收集式还是解释式。 任何语言(Rust、JavaScript、Python、C++)都可以编译并在 Wasm 运行时上运行。 虽然这并不意味着每种语言的代码现在都能够相互交流,但通过新兴的组件模型标准,开发人员能够采用用不同语言编写的多个 Wasm 模块并无缝连接它们。 很快,对于 WebAssembly 来说,链接和互操作性将成为现实。

可嵌入性

您上次听说有人将 JVM 嵌入到应用中以运行插件或自定义逻辑是什么时候? 如果不是最近的话,是吗? 尽管 JVM 功能强大,但将其嵌入到其他应用中却极具挑战性。 一些备受瞩目的嵌入已经出现(例如浏览器中的 Java 小程序),但它们由于笨重或难以维护而基本上消失了。

另一方面,WebAssembly 是为可嵌入性而设计的。 在应用中嵌入 Wasm 运行时通常就像引入新库一样简单。 完成后,您的应用可以运行 Wasm 代码——这可以扩展游戏引擎、修改算法、响应事件或您能想到的任何其他事情。 Wasm 提供了 JVM 无法提供(或者说不想提供)的可嵌入性多功能性。

安全

这可以说是 WebAssembly 最闪耀的地方。 JVM 有自己的安全模型,但它是在执行的代码是可信的假设下设计的。 WebAssembly 从根本上拒绝了这一前提——诞生于浏览器,访问网站必然会下载不受信任的代码并运行它,而 Wasm 则采用了严格的默认拒绝沙盒模型。 除非明确授权,否则它不会授予代码访问系统资源、内存或其他功能的权限。 这种方法本质上最大限度地减少了攻击面,使 Wasm 成为关注不受信任的代码执行的环境的理想选择。

JVM 的安全模型是可以运行的,但它并不是为 Wasm 提供的安全级别而设计的。

成熟与社群

JVM 是技术世界中一位经验丰富的老手。 它已有数十年的历史,拥有广泛的应用、广泛的企业工具和庞大的社区,感觉就像软件开发中一股不可动摇的力量——我们知道它不会很快消失。 如果长寿命和经过验证的稳定性对于您的用例至关重要,那么 JVM 可以满足您的需求。

与此同时,WebAssembly 仍是一个新生事物。 尽管 Wasm 还很年轻,刚过 10 岁生日,但人们对 Wasm 的热情却呈指数级增长。 尽管不如当今的 JVM 成熟,但 WebAssembly 的发展轨迹预示着光明的未来。

结论

WebAssembly 和 JVM 都是令人难以置信的技术,它们各自以适合其环境和用例的方式表现出色。 JVM 在成熟的应用和丰富的运行时功能至关重要的企业工作流程中蓬勃发展。 另一方面,Wasm 的可嵌入性、轻量级运行时、跨语言兼容性和无与伦比的安全性使其成为插件和边缘计算的引人注目的选择。

那么,您应该选择哪一个呢? 如果您正在开发具有强大运行时需求的独立应用,JVM 仍然是一个实用且久经考验的选择。 但是,如果您想要跨语言的灵活性或轻松插入现有应用程序的能力,WebAssembly 可能会发挥重要作用。