WebAssembly 或 Wasm 是一种二进制代码格式,用于创建可以在任何计算机架构上执行的程序。
该系统包括一个虚拟机和一个编译器,该编译器将计算机代码从诸如 C 或 C++ 之类的编程语言翻译成人类可读的 .wat 和二进制 .wasm 格式。
WebAssembly 的最初目标是通过在浏览器中实现接近本机的执行速度,使程序员能够为网页开发高性能应用程序。 但现在这项技术似乎正在超越浏览器并进入云端。
本指南向您展示了您需要了解的有关这项不断发展的技术、其优势和劣势以及未来潜力的所有信息。
什么是 WebAssembly?
WebAssembly 是一种在虚拟机上运行并且可以编译成不同语言的二进制代码格式。 它被设计为可移植的,可以在 Web 浏览器上运行或作为服务器应用程序运行。
WebAssembly 于 2017 年首次发布,自 3 年起成为 W2019C 推荐,由众多贡献者维护,包括 Mozilla、Google、Microsoft、Red Hat 等。
最初的目标是开发接近原生的执行速度,就像在浏览器中使用 C/C++ 应用程序一样。 它还意味着是一种安全、开放标准、可调试和无版本的 Web 标准,并且向后兼容和 JavaScript 兼容。
WebAssembly 是如何工作的?
WebAssembly 被设计为运行时引擎,例如 Java 或 JavaScript,可以嵌入到浏览器或服务器环境中,以运行以 .wasm 二进制或 .wat 文本格式编译的计算机代码。
为了编写用于执行 WebAssembly 的代码,开发人员需要使用众多支持的语言中的任何一种来编写程序。 然后使用 AOT(提前)或 JIT(及时)的 WebAssembly 编译器对其进行编译。
此代码可以在执行环境中完成大部分工作,但它不能访问或修改浏览器的 DOM 对象。 任何此类交互都必须通过 JavaScript。
如何创建示例 WebAssembly 应用程序
只需几个步骤即可为 Web 浏览器创建一个简单的 Wasm 应用程序,如下所示:
- 下载并安装 Emscripten SDK.
- 写你的样本 你好世界 如果您愿意,可以编写代码或在 C++/Rust 中执行。
- 运行 emcc helloworld.c -s WASM=1 -s helloworld.html 在终端中使用 Emscripten 将代码编译为 WebAssembly。 它将创建您需要的 Wasm 二进制文件、HTML 和 JavaScript 文件(粘合代码)。
- 通过您的网络浏览器提供 helloworld.html 页面。
WebAssembly 的优势
采用 WebAssembly 及其相关技术的原因有很多,包括:
- 近乎原生的性能 – WebAssembly 具有如此低级的设计,它提供的性能类似于 C 和 C++ 等低级语言。
- 确保用户 – 该系统旨在通过将其隔离在系统访问受限的虚拟环境中来确保安全。
- 开放标准 – 许多组织和个人都在为 WebAssembly 做出贡献,这是 W3C 的官方推荐。
- 轻量化设计,方便挪动 – WebAssembly 编译成二进制代码以在虚拟机中执行。 此代码是可移植的,不需要或附带系统文件。
- 多国语言支持 – 超过 50 种语言可以编译成 WebAssembly。
- 平台无关 – WebAssembly 虚拟机专为每种架构设计,以呈现相同的运行时环境。 开发人员所要做的就是为 WebAssembly 编写代码。
WebAssembly 的局限性
- 工作正在进行中 – 该标准仍在开发中,因此还有许多功能和改进尚未到来。
- 没有垃圾收集 – WebAssembly 仍然缺乏垃圾收集,尽管它可能很快就会实现。
- 没有 DOM 访问权限 – 你不能直接从 WebAssembly 访问 Web 浏览器的 DOM,你需要通过 JavaScript。
WebAssembly 与 Java
Java 是最早的 WebAssembly 实现。 它被设计为一种一次性编写、随处运行的语言,但在此过程中出现了许多问题。
与 Java 一样,WebAssembly 使用 RE(运行时环境)来执行其代码,但与 Java 不同的是,您可以使用您选择的语言编写 WebAssembly。
WebAssembly 与 JavaScript
WebAssembly 在浏览器或其他宿主环境中执行,就像 JavaScript的. 但是,在 JavaScript 以文本格式交付到执行环境并及时编译的情况下,WebAssembly 具有文本和二进制格式。
在 Web 浏览器中,JavaScript 可以访问 DOM,而 WebAssembly 则不能。 然而,在执行速度方面,WebAssembly 以接近原生的代码执行速度击败了 JavaScript。
速度是 WebAssembly 的亮点,也是它非常适合多种用途的原因。 您可以使用 JavaScript 将 WebAssembly 加载到浏览器中,这两个代码可以一起运行并共享资源。
WebAssembly 与 Docker 与 Kubernetes
Docker 和 Kubernetes 是支持云计算的两种流行技术。 Docker 是一种容器技术,使开发人员能够将应用程序及其所有系统依赖项打包到一个包中。 这使得在任何云环境中部署应用程序变得很容易,一秒钟或更短的时间。
另一方面,Kubernetes 是一个开源系统,用于管理和部署容器化应用程序,例如 Docker、CRI-O、containerd 和任何 Kubernetes CRI(容器运行时接口)实现。 Kubernetes 还可以轻松跨多个服务器或虚拟机扩展云部署。
从这个角度来看,WebAssembly 更类似于 Docker,可以使用 Kubernetes 作为容器化云应用程序运行。 与 Docker 相比,它还提供了许多优势,但可能不会取代它。
超越浏览器
起初,有网络服务器。 您必须专用一台完整的机器作为服务器。 然后,出现了虚拟机或 VM,它们允许服务器仅在一个或多个 CPU 线程上运行。 不过,您必须拥有一个专用的虚拟机。
云计算 通过容器化应用程序,可以仅在需要时启动和运行服务器。 这降低了成本,因为您只需为使用的东西付费——不再需要专用机器。 但仍有一些问题。
首先,docker 文件可能有数 GB 大,这意味着启动和其他管理问题的延迟很小。 然而,类似的 Wasm 文件可能只有几 MB 大,因为它是预编译的二进制文件。 这使其启动时间比 Docker 快得多,非常适合某些时间关键型应用程序。
其次,WebAssembly 的设计意味着开发人员不必管理和分配系统资源,他可以使用他选择的编程语言简单地达到目的。
这些特性使 WebAssembly 非常适合运行云微服务,尽管 Docker 应用程序仍然更适合需要对操作环境和文件系统进行更多控制的应用程序。
欲了解更多信息,项目如 WasmCloud 和 WasmEdge 正在将 WebAssembly 开发成一个可行的计算平台。
Wasm 用例
鉴于 WebAssembly 的特殊性质,它有许多用例。 它们可以分为三大类; 浏览器内、浏览器外和混合设置。
浏览器内类型是不言自明的,浏览器外主要是指服务器、物联网和云部署,而混合是指两者的混合。
以下是 Wasm 擅长的用例:
- 已经存在的高性能代码 – 可以移植到 WebAssembly 的古老但奇妙的代码。
- 新的高性能代码 – 您必须从头开始设计和实施的那些。
- 将桌面应用程序移植到 Web – 这可能会开辟一种新的基于 Web 的桌面解决方案,例如 基于网络的视频编辑.
- 云计算 – 与 Docker 和 Kubernetes 一起运行以寻找新的机会。
以下是 Wasm 擅长的具体应用和场景:
- 视频和图像编辑
- 游戏设计
- 人工智能应用
- 虚拟和增强现实应用
- 音乐应用
- P2P应用
- 服务器端应用程序
- 云/集群计算
- 计算机辅助设计
- OS平台模拟
- 加密
- 本地网络服务器
- 远程桌面应用程序
- 科学可视化
- 智能手机上的混合原生应用
- 在物联网设备上
支持的语言和框架列表
超过 50 种语言编译为 WebAssembly,以下是一些最受欢迎的语言:
- C
- C + +中
- R
- 红宝石
- 斯威夫特
- Go
- 科特林
- 锈
- PHP
- 开拓者 – .NET 开发人员的框架。
- Jweb组件 – Java 字节码和相关语言(如 JRuby、Jython、Groovy、Scala 和 Kotlin)的编译器。
- 红豆杉 – 使用 WebAssembly 创建多线程 Web 应用程序的 Rust 框架。
- 汇编脚本 – 一种专门用于创建 WebAssembly 代码的语言。
- 粮食 – 一种强类型的函数式语言。
- 元子
您可以找到更多语言 此处.
WebAssembly 运行时和工具列表
- 所有主流浏览器都支持 Wasm
- 泛肽 – 浏览器上的 Python 运行时,带有 Python 科学堆栈,包括 Pandas、NumPy、SciPy。
- 温暖
- gi木 – 适用于微服务和 Web 应用程序
- 瓦西 – 模块化系统接口
- WasmTime – 快速且安全的 WebAssembly 运行时。
- 瓦斯默
- 卢塞特
- wasmCloud – 云环境
- 克鲁斯莱特 – 用于运行 Wasm 的 Kubernetes kublete,用 Rust 编写。
- WasmEdge – 云和边缘运行时环境
总结
我们已经走到了 WebAssembly 之旅的终点,以及它对计算的影响。 正如你所看到的,它有很多希望。