WebAssembly(简称Wasm)是一种为网络浏览器设计的二进制指令格式,它旨在成为一个高效的编程语言的编译目标,从而允许在网络上部署客户端和服务器应用程序。WebAssembly的主要设计目标是实现高性能应用,同时维持网络的安全性。

WebAssembly的发展始于2015年,当时几个主要的浏览器开发商(Mozilla、Google、Microsoft、Apple)联合提出了这一概念。2017年3月,WebAssembly的初版(MVP,最小可行产品)正式发布,并得到了这些主要浏览器的支持。

自那时以来,WebAssembly继续发展和完善,它不仅被用于浏览器环境中提高应用性能,还开始被用于其他环境,如Node.js,甚至被用于区块链和其他去中心化技术中。WebAssembly提供了一种方式,让开发者能够使用C、C++、Rust等编程语言编写代码,然后编译成可以在浏览器中运行的高效代码。

WebAssembly (通常缩写为 Wasm) 是一种为了在网页浏览器中高效执行代码而设计的技术。它不是一种编程语言,而是一种编译目标,允许开发者用高级语言(如 C、C++、Rust 和其他)编写代码,然后将这些代码编译成 WebAssembly。编译后的代码可以在网页浏览器中以接近原生性能运行,无论使用者的操作系统是什么。

WebAssembly 的兴起背后有几个关键因素:

  1. 性能:与传统的 JavaScript 相比,WebAssembly 可以提供更接近于原生的执行速度。这对于需要高性能计算的应用(如游戏、视频编辑、科学模拟等)来说是一个巨大的吸引力。

  2. 语言多样性:通过将代码编译为 WebAssembly,开发者可以选择最适合项目的语言,而不仅仅是 JavaScript。这开启了在网页应用开发中使用诸如 Rust、C++ 等语言的可能性,这些语言在性能和类型安全等方面有其优势。

  3. 安全:WebAssembly 设计时就考虑到了安全性,运行在沙箱环境中,这意味着编译后的代码被限制在一个严格的执行环境中,不能随意访问内存或执行系统调用。这减少了安全漏洞的风险。

  4. 兼容性和可移植性:WebAssembly 旨在成为一个跨平台的目标,能够在所有主流浏览器中运行,包括移动设备。这提高了开发跨平台应用的便利性和效率。

  5. 生态系统的成熟和支持:随着技术的发展,越来越多的工具和库支持 WebAssembly,使得开发过程更加方便和强大。同时,主要的浏览器厂商(如 Google、Mozilla、Apple、Microsoft)都在支持 WebAssembly,确保了它的广泛可用性和持续发展。

简而言之,WebAssembly 的兴起是因为它解决了 web 开发中的一些核心问题,如提高性能、增加语言选择、提升安全性、并且提供了高度的兼容性和可移植性。这些特性使得 WebAssembly 成为现代 web 应用开发的重要组成部分。


WebAssembly 有已经实现的案例吗?应用情况如何?

WebAssembly 已经在多种应用场景中得到了实现和应用,部分案例表明了其强大的潜力和实用性。下面是一些已经实现的案例和应用情况:

  1. 游戏:许多游戏已经被移植到了 WebAssembly,使得它们能够在浏览器中运行。例如,Unity 和 Unreal Engine 这两个流行的游戏引擎都支持导出项目到 WebAssembly,允许复杂的3D游戏在网页中流畅运行。

  2. 图形应用:WebAssembly 使得图形密集型应用(如 CAD 类软件和图像编辑工具)可以在网页中以几乎原生的性能运行。例如,AutoCAD Web 使用了 WebAssembly 技术,用户可以在浏览器中直接编辑 CAD 文件。

  3. 音视频编码和处理:音视频处理通常需要大量的计算资源,WebAssembly 使得在浏览器中进行这些操作成为可能。例如,ffmpeg,一个流行的命令行工具转换音视频格式,已被编译到 WebAssembly,从而可以在网页中直接使用。

  4. 科学模拟和计算:研究人员使用 WebAssembly 来在浏览器中运行科学模拟,从而不需要依赖于本地安装的软件。这使得分享和复现科学结果变得更加容易。

  5. 加密货币:WebAssembly 也被用于区块链技术中,允许在网页中执行加密货币钱包和智能合约的代码。

  6. PWA和离线应用:渐进式网络应用(Progressive Web Apps,PWA)和离线应用可以利用 WebAssembly 提高性能和离线功能,使得用户即使在没有网络的情况下也能享受快速和功能丰富的应用体验。

  7. 教育和在线学习:在线教育平台可以使用 WebAssembly 来运行各种编程语言的编译器或解释器,使学生能够直接在浏览器中编写和测试代码。

总的来说,WebAssembly 的应用情况非常广泛,它正在不断推动网页应用的性能和能力的边界。通过使得原本只能在本地运行的应用能够在浏览器中运行,WebAssembly 显著地扩展了 web 技术的应用范围和潜力。随着技术的不断成熟和社区的持续投入,预计将会有更多创新的应用案例出现。


WebAssembly具体怎么用,假如我公司目前已经有一个前后端分离项目,前端是vue、android、ios,后端是java微服务,如何应用WebAssembly?

WebAssembly(简称Wasm)是一种新的编程语言,它是一种低级别的二进制格式,设计为高效,快速,并且安全。它的目标是在web浏览器中运行接近于原生的速度。其主要用途是在web上运行高性能的应用程序,如游戏,WebVR,实时视频流编辑等等。

在你提到的具体的项目环境中,你可以考虑以下几种方式来应用WebAssembly:

  1. 性能关键部分的优化:如果你的Vue项目中有一部分代码是性能关键的(例如,复杂的算法或者大量的计算),你可以考虑将这部分代码使用C/C++或者Rust等语言重写,并编译为WebAssembly,这样可以使得这部分代码的运行效率接近于原生。

  2. 重用现存的C/C++库:如果你的项目中需要使用一些特定的功能,而恰好有合适的C/C++库可以实现,你可以使用WebAssembly来将这些库移植到web上。这样可以节省开发时间,并且可以利用现有库的性能优势。

  3. 移植现有的应用:WebAssembly也可以用于将现有的桌面应用或者其他类型的应用移植到web上。例如,如果你的项目中有一个现有的Java微服务,你可以考虑将其部分功能移植到前端,以减轻服务器的压力,同时提高用户体验。

在具体实现时,你需要使用如Emscripten或WebAssembly Binary Toolkit(wabt)等工具,将你的源代码编译为WebAssembly格式。然后,在你的JavaScript代码中,使用WebAssembly的API来加载和执行这些WebAssembly模块。

需要注意的是,虽然WebAssembly有很多优势,但它并不意味着要替代JavaScript。实际上,WebAssembly和JavaScript是非常好的搭档。你可以根据需要,在适合的地方使用WebAssembly,而在其他地方依然使用JavaScript。


WebAssembly和JavaScript如何结合使用

WebAssembly和JavaScript可以互相调用,实现复杂的应用。下面是一个简单的例子:

首先,我们需要一个C语言的源代码(比如名为 module.c):

int square(int num) {
    return num * num;
}

然后我们可以使用Emscripten将这个C程序编译为WebAssembly:

$ emcc module.c -s WASM=1 -o module.js

这会生成一个module.wasm的二进制文件和一个module.js的JavaScript文件,其中后者可以用来加载前者。

然后,在我们的JavaScript代码中,我们可以这样使用这个模块:

const wasmModule = require('./module.js');

wasmModule.onRuntimeInitialized = () => {
    const result = wasmModule._square(5);
    console.log(result); // 输出 25
};

在上述代码中,我们首先加载了由Emscripten编译生成的JavaScript文件。onRuntimeInitialized是一个特殊的回调,它会在Wasm模块准备好被使用时调用。然后我们就可以使用模块中的_square函数了(注意这个函数名前面的下划线,这是Emscripten编译后的约定)。结果就是我们期望的25。

这就是一个简单的示例,展示了如何在JavaScript中使用WebAssembly模块。当然,实际的项目中可能会复杂得多,但基本的原理和方法是类似的。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐