在WASM中构建和运行应用程序
在过去20到30年里,软件开发经历了几个阶段。它从自己编写内存管理的垃圾回收代码,发展到请求AI聊天机器人帮你写try/except代码块。主要的变化在于应用程序的运行、测试和编译方式。这些方式不仅限于本地环境,还扩展到了从虚拟机到无服务器再到Kubernetes的跨系统/平台转变。
在这篇博客文章中,你将了解一种最新的热门技术——WASM(WebAssembly的缩写)。
WASM 快速回顾WASM具有性能增强(比标准容器快20-160%),跨架构能力(在ARM设备上构建,在x64设备上运行),安全性(类似简化版的Scratch操作系统),以及跨语言支持(你可以用Python编写,我可以使用Go,在编译时都是一样的)。
比如说,让我们来解释一下一些重要的术语:
- WASM == 运行浏览器应用
- WASI == 与本地或服务器上的资源(如文件和网络)交互的接口。它是WASM的一个扩展。
- Runtimes == 如何在本地或服务器上运行WASM应用(现在最流行的是Wasmtime,还有Wazmer、Wazero等)
当你在本地或服务器上安装WASM时,会遇到几个部分。
- WASI
- 运行时环境
安装运行时(如Wasmtime)时,WASI会自动生效。
在这篇博客文章中,我们将展示如何安装Wasmtime。因为在撰写本文时,它是最受欢迎的。
💡妙招💡
由于WASM仍然很新,因此出现了各种围绕它的运行时环境,大家都在试图“弄明白它”。这种情况很常见,无论是新技术还是已经存在了一段时间但终于开始受到“关注”的技术。
要安装WASM,运行curl
命令来下载并运行一个Bash脚本,该脚本用于安装WASM。
执行以下命令从官方网站下载并安装Wasmtime:
curl https://wasmtime.dev/install.sh -sSf | bash
进入全屏 退出全屏
你可以看到类似于下面的输出。
这是一张图片,点击可以查看。
请确保在尝试使用WASM之前重启你的命令行。
要确保二进制安装成功,你可以试试help
命令。
这是一个图片链接:
💡
如果你用的是 Windows,查看预编译的包:(https://github.com/bytecodealliance/wasmtime/releases)
在本地使用 WASM 运行代码
既然WASM和WASI已经成功安装,是时候测试一些代码,看看WASM是如何工作的。例如,为了这篇博客文章的目的,你将使用一个“Hello World”风格的Go程序。即使你不懂Go语言,也没关系。这只是为了给你一个示例。
如果没有安装 Go,你可以点击这里在你的操作系统上安装:https://go.dev/doc/install。
💡
需要 WASI 的原因是因为,默认情况下,WASM 是为浏览器应用设计的。这一点是,它没有 I/O,这意味着它无法与网络、存储等进行交互。
从技术角度看,你不需要WASI(WebAssembly System Interface),但如果没有它,你就得自己搭建一个接口。与其重新发明轮子,使用WASI显然更合理,特别是像Wasmtime这样的运行时环境已经内置了WASI。
第一步是准备一些可以编译的代码。在这种情形下,你可以用下面这段 Go 代码,其中包括:
- 主包确保它是应用程序的启动入口。
- 导入
fmt
包来实现终端输出。 - 主函数(类似于函数式编程)来调用子函数。
- 子函数会返回一个简单的响应,该响应会被打印到终端。
将这段代码保存到本地,并将其文件命名为 main.go
,目前你不需要运行它。
package main
import "fmt"
func main() {
wasmTest()
}
func wasmTest() {
fmt.Println("来自WASM彼岸的问候!")
}
全屏 退出全屏
接下来需要做的是配置你的本地 Go 环境以使用 WASM。为此,你需要设置两个环境变量即可。
GOOS
(Go 操作系统 (OS))GOARCH
(Go 架构 (架构))
在 main.go
文件所在目录打开一个终端并运行以下命令。
GOOS=wasip1 GOARCH=wasm go build -o main.wasm main.go
全屏进入 全屏退出
例如,我在 WASM > appexamples > go
目录里有一个 main.go
文件。运行完该命令后,生成了一个 main.wasm
文件。
这是一张图片,你可以通过这个链接查看:
现在你可以本地运行(或执行)“main.wasm”了。
运行 wasmtime main.wasm 命令
进入全屏 退出全屏
你可以看到类似下面的输出。
这是一张示例图片。如需查看图片,请点击链接。
恭喜你!你不仅安装了WASM/WASI作为本地运行时,还写了一些代码并编译了它们,并通过WASM运行时运行了这些代码。
阅读本文后,你可能对WASM/WASI与Rust如何配合工作感兴趣。在那时,Rust似乎是在WASM领域中最受支持的语言之一。
最后的思考WASM,尤其是用于服务器端的WASI,是软件开发的下一次迭代。它不会替代Docker、Kubernetes、Serverless等工具,因为WASM是一个运行时环境,因此,它需要一个运行的环境。
共同学习,写下你的评论
评论加载中...
作者其他优质文章