Skip to main content

WebAssembly简单介绍

鱼雪

WebAssembly(简称为Wasm)是一种可移植、高性能的二进制格式,它被设计成一种用于Web浏览器的低级编程语言。WebAssembly 是一种与编程语言无关的格式,这意味着你可以使用多种编程语言来编写WebAssembly模块。目前,主要的编程语言,如C、C++和Rust,已经支持WebAssembly。WebAssembly 的二进制格式是一种紧凑且高效的表示,使得它能够更快地加载和执行。由于它是一种低级格式,直接在虚拟机中执行,因此通常比使用高级语言编写的JavaScript更快。

为什么需要WASM

如果我问你:Javascript是什么?你的答案是什么?

一种变成语言,对吗?

这个答案是正确的但不完全正确。让我们看看是为什么?

在当今世界,直接在浏览器里面写JS代码很少见。有时候你可能写Typescript并且转换成Javascript

有时候你使用flutter构建web应用,也是将dart代码编译成Javascript,同样Kotlin,CoffeeScript, Elm等都是这样

也就是说Javascript是唯一在浏览器上运行的编程语言(假设没有WASM),任何想要针对浏览器和语言和框架都必须转为Javascript

但Javascript不是被设计成编译目标(Compilation Target),并且它没有针对此用例进行优化,WASM是更好的编译目标(Compilation Target)

什么是WASM

WebAssembly 是一种新型代码,可以在现代 Web 浏览器上运行, 它是一种低级代码具有紧凑二进制格式的类汇编语言,可以以接近本机的性能运行 并为 C/C++、C# 和 Rust 等语言提供编译目标,以便它们可以在网络上运行。

Wasm 和 WASI 之间的关系几乎与 JS 和 NodeJS 之间的关系相同。

事实上,WASM 与 JS 一样,在浏览器沙箱内运行时的访问权限受到限制。

例如,它无法读取系统上的文件或执行比 HTTP 更低级别的网络工作, 例如 TCP 和 UDP。 为什么,因为它的 API 不存在于浏览器上。

什么是WASI

WASI可以操作浏览器中不存在的系统API

WasmTime的运行时(Runtime)可以在浏览器外以CLI程序的形式运行WASM文件。 这个用于系统任务(如读取文件和使用网络等)的WASM CLI程序使用WASI定义的标准。 这些标准与WASM本身一样,独立于平台,这一点非常重要。 以致于Docker的创建者在推特上写到:

WASI不仅仅适用于云计算,未来我们还会看到需要WASM运行时才能运行的GUI和CLI程序,因为 通过这种方式,开发人员可以更轻松获得输出结果,并在一个操作系统上进行测试,然后就可以放心了。 因为他的程序在任何地方都能以同样的方式运行。